Skip to main content

Actions

Actions are story nodes that make something happen in the VR experience. Use them to play audio, show UI, move objects, control the player, toggle components, or call custom logic.

Each action uses the same core fields:

NameThe action node type selected in StoryCreator.

QueryThe target GameObjectQuery or system object the action affects.

OptionThe action mode selected in Unity. Each option is explained under the action entry.

DataExtra option-specific fields shown in Unity, such as text, durations, object names, booleans, indexes, colors, or lists.

TypeUnused legacy field. Keep it as 0 for actions.

info

Some story node names differ from their C# class names for legacy reasons. For example, the Objects node is implemented by ObjectAction, ChecklistUIToggle is implemented by ChecklistUIAction, and SFXPlayer is implemented by SFXPlayerAction.

Audio and Feedback Actions

VoiceOver

Plays localized voice-over audio for the supplied text.

Query and Scene Setup

QueryLeave blank. VoiceOver uses the global VO player through ReferenceManager.

Scene setupNo scene object is assigned in this action. Voice selection is handled during VO generation and project TTS setup, not inside this node.

Options

Play

Plays the voice-over clip resolved from Data.text for the active locale.

textThe exact line the learner should hear. This is the key used to resolve/generated localized VO audio.

timedSegmentOptional timing metadata used by the VO player.

waitForCompletionIf true, the story waits until the VO clip finishes before continuing.

JSON example
{
"Name": "VoiceOver",
"Query": "",
"Option": "Play",
"Data": "{\"text\":\"Welcome to the training.\",\"waitForCompletion\":true}",
"Type": 0
}

SFXPlayerAction

Controls sound effect playback through the SFX player. The story node name is SFXPlayer.

Query and Scene Setup

QueryAssign the queryable object that has, or should receive, an SFXPlayer component. Commonly this is named SFXPlayer.

Scene setupInclude a queryable SFX player object in the scene. The action adds SFXPlayer if it is missing on the query object.

Options

Play

Plays the configured sound once.

useCloudAudioIf true, audio is downloaded from audioUrl. If false, audio is loaded from Resources using audioClipName.

audioClipNameLocal Resources clip name. Required when useCloudAudio is false.

audioUrlCloud audio URL. Required when useCloudAudio is true.

audioRangePlayback range used by the SFX audio source.

setVolumePlayback volume.

waitForCompletionIf true, waits for the clip completion event.

PlayLoop

Starts the configured sound in a loop.

useCloudAudioSame source-selection behavior as Play.

audioClipName / audioUrlLocal clip or cloud URL to loop.

audioRangePlayback range used by the SFX audio source.

setVolumePlayback volume.

Pause

Pauses the current SFX playback.

FieldsNo source fields are required. The action operates on the queried SFX player.

StopAndSkip

Stops the current SFX playback and completes immediately.

FieldsNo source fields are required. The action operates on the queried SFX player.

JSON example
{
"Name": "SFXPlayer",
"Query": "SFXPlayer",
"Option": "Play",
"Data": "{\"audioClipName\":\"button-click\",\"setVolume\":0.8,\"waitForCompletion\":false}",
"Type": 0
}

HapticsAction

Triggers controller haptic feedback.

Query and Scene Setup

QueryLeave blank. Haptics use the platform haptics manager, not a scene target.

Scene setupThe active platform must provide HapticsManager through PlatformInfoRegister.

Options

Left

Plays haptic feedback on the left controller.

Plays haptic feedback on the right controller.

Both

Plays haptic feedback on both controllers.

hapticIntensityStrength of the haptic pulse. Must be positive.

hapticDurationLength of the haptic pulse in seconds. Must be positive.

waitForCompletionIf true, waits for hapticDuration before completing.

JSON example
{
"Name": "HapticsAction",
"Query": "",
"Option": "Both",
"Data": "{\"hapticIntensity\":0.5,\"hapticDuration\":0.2,\"waitForCompletion\":false}",
"Type": 0
}

ToastMessageAction

Shows a temporary toast message in VR.

Query and Scene Setup

QueryLeave blank. Toast messages are global UI feedback.

Scene setupAdd an Experience Panel prefab if the scene does not already include toast UI. Toast rendering is handled by ExperiencePanel / ExperiencePanelUIHandler.

Options

Empty option

Toast behavior is data-driven. The option field is normally left empty.

messageVisible toast text shown to the learner.

messageTypeVisual style. Valid values are Default, Wrong, and Correct.

durationHow long the toast remains visible, in seconds. Must be positive.

JSON example
{
"Name": "ToastMessage",
"Query": "",
"Option": "",
"Data": "{\"message\":\"Correct action.\",\"messageType\":\"Correct\",\"duration\":2.0}",
"Type": 0
}

Object State and Animation Actions

Objects / ObjectAction

Spawns or despawns a target GameObject by changing its active state. The story node name is Objects.

Query and Scene Setup

QueryThe GameObjectQuery object to show or hide.

Scene setupThe target object must exist in the scene and be registered as a query object.

Options

Spawn

Sets the target GameObject active.

Despawn

Safely hides the target GameObject. If the object is held or placed, the action first releases/removes it so interaction state can clean up.

waitForCompletionUsually false. Spawn/despawn is normally immediate, except despawn may wait one frame for cleanup.

JSON example
{
"Name": "Objects",
"Query": "Wrench",
"Option": "Spawn",
"Data": "{\"waitForCompletion\":false}",
"Type": 0
}

Animation

Controls Unity Animation or Animator playback on a target object.

Query and Scene Setup

QueryObject with an Animation or Animator component.

Scene setupConfigure the animation clip/state on the target object in Unity.

Options

Play

Plays the named animation clip or animator state.

Clip nameName of the animation clip or state to play.

waitForCompletionIf true, waits for the clip length before completing.

Pause

Pauses current animation playback.

Stop

Stops current animation playback.

Resume

Resumes paused animation playback.

Clip nameOptional. Used when the system needs to identify a specific clip or state.

JSON example
{
"Name": "Animation",
"Query": "MachineDoor",
"Option": "Play",
"Data": "{\"clipName\":\"Open\",\"waitForCompletion\":true}",
"Type": 0
}

ObjectAnimationAction

Animates a target object's transform toward a named destination transform.

Query and Scene Setup

QueryThe object being animated.

Scene setupCreate a queryable marker/target object at the final pose and reference it in targetTransform.

Options

Position

Copies only the target transform position.

Rotation

Copies only the target transform rotation.

Scale

Copies only the target transform scale.

PositionRotation

Copies target position and rotation.

PositionScale

Copies target position and scale.

RotationScale

Copies target rotation and scale.

PositionRotationScale

Copies target position, rotation, and scale.

targetTransformGameObjectQuery name of the destination transform.

lerpDurationInterpolation time in seconds.

waitForCompletionIf true, waits until the animation finishes.

JSON example
{
"Name": "ObjectAnimationAction",
"Query": "Drawer",
"Option": "PositionRotation",
"Data": "{\"targetTransform\":\"DrawerOpenTarget\",\"lerpDuration\":1.0,\"waitForCompletion\":true}",
"Type": 0
}

Player and Flow Actions

Player

Controls player movement and camera transitions.

Query and Scene Setup

QueryLeave blank or use the player/system object convention in your project. Runtime resolves the player rig from ReferenceManager.

Scene setupThe scene must have a player rig registered with ReferenceManager. Teleport also needs a queryable target transform.

Options

Teleport

Moves the player to a target transform.

targetTransformGameObjectQuery name of the teleport destination.

shouldFadeIf true, runs a fade during teleport.

fadeDurationFade duration in seconds when fade is enabled.

waitForCompletionIf true, waits for player action completion callback.

LockMovement

Disables player locomotion.

UnlockMovement

Re-enables player locomotion.

FieldsNo option-specific fields are required.

CameraFade

Runs a camera fade effect.

fadeTypeFade mode: FadeIn, FadeOut, or FadeInOut.

fadeDurationFade duration in seconds.

waitForCompletionIf true, waits for fade completion.

JSON example
{
"Name": "Player",
"Query": "",
"Option": "Teleport",
"Data": "{\"targetTransform\":\"SpawnPoint_A\",\"shouldFade\":true,\"fadeDuration\":0.4,\"waitForCompletion\":true}",
"Type": 0
}

TimerAction

Starts, resets, or stops a countdown timer.

Query and Scene Setup

QueryTimer object or any query object that should own the CountDownTimerController.

Scene setupNo dedicated timer prefab was found. The action adds CountDownTimerController to the queried object if missing.

Options

Start

Starts the countdown timer.

durationTimer length in seconds.

waitForCompletionIf true, the story waits until the timer ends.

Stop

Stops the active timer.

Reset

Resets the timer state.

FieldsNo option-specific fields are required.

JSON example
{
"Name": "TimerAction",
"Query": "CountDownTimer",
"Option": "Start",
"Data": "{\"duration\":30,\"waitForCompletion\":false}",
"Type": 0
}

TargetGuidanceArrowAction

Controls the target guidance arrow system.

Query and Scene Setup

QueryObject with TriggerQueryObjectGuider.

Scene setupUse the scene's trigger guider object. For override, the override target must also be a queryable object.

Options

Enable

Shows the guidance arrow using the guider's current target.

Disable

Hides the guidance arrow.

waitForCompletionOptional completion setting.

Override

Points the guidance arrow at a different target object.

targetGameObjectGameObjectQuery name of the override target.

waitForCompletionOptional completion setting.

JSON example
{
"Name": "TargetGuidanceArrowAction",
"Query": "TriggerQueryObjectGuider",
"Option": "Override",
"Data": "{\"targetGameObject\":\"NextTool\",\"waitForCompletion\":false}",
"Type": 0
}

UI and Media Actions

MCQResponseAction

Configures and displays a Multiple Choice Question evaluation panel.

Query and Scene Setup

QueryMCQ panel GameObject with MCQEvaluationHandler.

Scene setupAdd an MCQ panel prefab with MCQEvaluationHandler, such as MCQEvaluationPanelUI.prefab or MCQPanelVRseUI.prefab.

Options

Empty option

This action is data-driven. It populates the MCQ panel with the question and answer options.

questionIndexQuestion number/index shown or tracked by the panel.

questionTextQuestion prompt displayed to the learner.

optionsListArray of answer choices.

correctOptionIndexOne-based index or indexes of correct answers. Runtime converts these to zero-based indexes.

showAnswerDurationHow long answer feedback is shown.

JSON example
{
"Name": "MCQResponseAction",
"Query": "MCQPanel",
"Option": "",
"Data": "{\"questionIndex\":1,\"questionText\":\"What should you inspect first?\",\"optionsList\":[\"Valve\",\"Pump\"],\"correctOptionIndex\":[1],\"showAnswerDuration\":3}",
"Type": 0
}

ChecklistUIAction

Updates or configures checklist UI state. The story node name is ChecklistUIToggle.

Query and Scene Setup

QueryChecklist panel GameObject with ChecklistUI. The default checklist from ReferenceManager is also updated when available.

Scene setupAdd a checklist prefab with ChecklistUI, such as ChecklistUI.prefab or ChecklistVRseUI.prefab.

Options

Check

Marks one checklist item as checked.

indexOne-based checklist item index.

moveToNextIf true, advances the current item after checking.

waitForCompletionOptional completion setting.

Uncheck

Marks one checklist item as unchecked.

indexOne-based checklist item index.

Current

Marks or highlights one checklist item as the current item.

indexOne-based checklist item index.

Configure

Populates the checklist title and entries.

titleTextChecklist heading.

toggleInfosArray of checklist item labels.

waitForCompletionOptional completion setting.

JSON example
{
"Name": "ChecklistUIToggle",
"Query": "ChecklistPanel",
"Option": "Configure",
"Data": "{\"titleText\":\"Inspection Checklist\",\"toggleInfos\":[\"Check valve\",\"Check pump\"],\"waitForCompletion\":false}",
"Type": 0
}

TextMediaAction

Enables or disables text media display.

Query and Scene Setup

QueryText media panel GameObject with MultiMediaPlayer.

Scene setupAdd a text media panel prefab, such as TextPanel.prefab or TextPanelMetaXR.prefab.

Options

Enable

Shows text content in the panel.

contentText to display.

waitForCompletionOptional completion setting.

Disable

Hides text content.

FieldsNo option-specific fields are required.

JSON example
{
"Name": "TextMediaAction",
"Query": "InstructionTextPanel",
"Option": "Enable",
"Data": "{\"content\":\"Inspect the valve.\",\"waitForCompletion\":false}",
"Type": 0
}

ImageMediaAction

Enables or disables image media display.

Query and Scene Setup

QueryImage media panel GameObject with MultiMediaPlayer.

Scene setupAdd an image media panel prefab, such as ImagePanel.prefab or ImagePanelMetaXR.prefab.

Options

Enable

Shows image content in the panel.

contentImage path/reference used by the media player.

waitForCompletionOptional completion setting.

Disable

Hides image content.

FieldsNo option-specific fields are required.

JSON example
{
"Name": "ImageMediaAction",
"Query": "ReferenceImagePanel",
"Option": "Enable",
"Data": "{\"content\":\"inspection-reference.png\",\"waitForCompletion\":false}",
"Type": 0
}

VideoMediaAction

Enables or disables video media display.

Query and Scene Setup

QueryVideo media panel GameObject with MultiMediaPlayer and a video player.

Scene setupAdd a video media panel prefab, such as VideoPanel.prefab or VideoPanelMetaXR.prefab.

Options

Enable

Shows and plays video content.

contentVideo path/reference used by the media player.

waitForCompletionIf true, waits until video playback finishes.

Disable

Hides video content.

FieldsNo option-specific fields are required.

JSON example
{
"Name": "VideoMediaAction",
"Query": "TrainingVideoPanel",
"Option": "Enable",
"Data": "{\"content\":\"intro-video.mp4\",\"waitForCompletion\":false}",
"Type": 0
}

UIPropertyChangeAction

Changes text content in UI elements.

Query and Scene Setup

QueryObject with UIPropertyChanger.

Scene setupAttach/configure UIPropertyChanger on the UI object to be edited.

Options

ChangeText

Replaces the UI text with the supplied value.

AppendText

Adds the supplied value to the existing UI text.

textText to write or append.

waitForCompletionOptional completion setting.

JSON example
{
"Name": "UIPropertyChangeAction",
"Query": "InstructionLabel",
"Option": "ChangeText",
"Data": "{\"text\":\"Step complete.\",\"waitForCompletion\":false}",
"Type": 0
}

Interaction Property Actions

GrabbablePropertyChangeAction

Changes grabbable object behavior at runtime.

Query and Scene Setup

QueryObject with IGrabbableWrapper.

Scene setupUse a grabbable Building Block or convert the object to a grabbable.

Options

ChangeHandType

Changes which hand mode the grabbable accepts.

handTypeValid values include Any, LeftOnly, RightOnly, SingleHandSwappable, SingleHandUnswappable, and BothHandsRequired.

swappableDelayUsed when handType is SingleHandSwappable.

requireBothHandsToStartGrabUsed when handType is BothHandsRequired.

ChangeIsGrabbable

Enables or disables whether the object can currently be grabbed.

isGrabbableTrue enables grabbing. False disables grabbing.

ChangeResetTransformOnRelease

Controls whether the object resets to its original transform after release.

resetTransformOnReleaseTrue resets on release. False leaves the object where released.

ChangeEnableGrabbableAnimated

Controls animated enable/disable behavior for grabbable state.

enableGrabbableAnimatedTrue enables animated behavior. False disables it.

JSON example
{
"Name": "GrabbablePropertyChangeAction",
"Query": "ValveHandle",
"Option": "ChangeIsGrabbable",
"Data": "{\"isGrabbable\":true,\"waitForCompletion\":false}",
"Type": 0
}

AllGrabbablePropertyToggleAction

Globally enables or disables grabbable behavior on relevant objects.

Query and Scene Setup

QueryUsually blank. This action finds grabbables globally.

Scene setupScene must contain grabbable objects with IGrabbableWrapper.

Options

Enable

Enables grabbable behavior globally.

Disable

Disables grabbable behavior globally.

waitForCompletionOptional completion setting.

JSON example
{
"Name": "AllGrabbablePropertyToggleAction",
"Query": "",
"Option": "Disable",
"Data": "{\"waitForCompletion\":false}",
"Type": 0
}

GrabLockAction

Locks or unlocks grabbing on a grabbable object.

Query and Scene Setup

QueryObject with IGrabbableWrapper.

Scene setupUse a grabbable object or Building Block.

Options

GrabLock

Turns on grab locking for the object.

waitForCompletionOptional completion setting.

GrabUnlock

Turns off grab locking for the object.

forceReleaseIf true, releases the object while unlocking.

JSON example
{
"Name": "GrabLockAction",
"Query": "Tool",
"Option": "GrabLock",
"Data": "{\"forceRelease\":true,\"waitForCompletion\":false}",
"Type": 0
}

MetaLayerAction

Controls object meta layers such as outline, label, highlighter, and ghost hand.

Query and Scene Setup

QueryBase item or grabbable object with meta layer components.

Scene setupTarget object should have the layer being controlled, such as outline, label, highlighter, or ghost hand.

Options

SetActive

Enables or disables one or more meta layers.

Layer keysUse keys like Outline, Label, Highlighter, and GhostHand with boolean values.

Edit

Changes meta layer properties.

OutlinesetActive, outlineColor, and outlineWidth.

LabelsetActive and labelText.

HighlightersetActive and material.

GhostHandghostHandsState maps ghost hand objects to active states.

JSON example
{
"Name": "MetaLayerAction",
"Query": "Wrench",
"Option": "SetActive",
"Data": "{\"Outline\":true,\"Label\":false}",
"Type": 0
}

MaterialPropertyChangeAction

Changes material properties on a target object, currently focused on emission toggling.

Query and Scene Setup

QueryObject whose material emission should change.

Scene setupThe action adds/uses MaterialPropertyChanger on the target object.

Options

EnableEmission

Turns material emission on.

DisableEmission

Turns material emission off.

FieldsNo option-specific fields are required.

JSON example
{
"Name": "MaterialPropertyChangeAction",
"Query": "StatusLight",
"Option": "EnableEmission",
"Data": "{}",
"Type": 0
}

Specialized Mechanic Actions

ForcepsAction

Configures and locks forceps-specific interaction behavior.

Query and Scene Setup

QueryForceps object.

Scene setupAdd Forceps_Block.prefab from VRseBlocks.

Options

SetProperties

Assigns the forceps target place point and target grabbable object.

placePointNameGOTarget place point object name.

grabbableNameTarget grabbable object name.

ClearProperties

Clears previously assigned forceps target properties.

ForcepLock

Locks forceps behavior.

ForcepUnlock

Unlocks forceps behavior.

waitForCompletionOptional completion setting.

JSON example
{
"Name": "ForcepsAction",
"Query": "Forceps",
"Option": "SetProperties",
"Data": "{\"placePointNameGO\":\"TrayPlacePoint\",\"grabbableName\":\"CottonBall\",\"waitForCompletion\":false}",
"Type": 0
}

TransformBoundsAction

Controls movement or rotation constraints for transform-bound objects.

Query and Scene Setup

QueryTransform Bounds block with ITransformBounds.

Scene setupAdd the matching MetaXRTransformBounds_*_Block.prefab from VRseBlocks.

Options

Lock

Locks the transform. Can optionally snap to exact bounds.

snapToExactBoundsIf true, snaps exactly to bounds while locking.

Unlock

Unlocks the transform.

Enable

Enables bounds checking.

Disable

Disables bounds checking.

FieldsNo option-specific fields are required.

CreateCombination

Creates a named bound combination on the object.

combinationNameName for the created combination.

boundsArray of bound names included in the combination.

lockOnTriggerIf true, lock when the combination triggers.

snapToExactBoundsIf true, snap when locking.

RemoveCombination

Removes a named bound combination.

combinationNameName of the combination to remove.

SetThreshold

Changes the bound detection threshold.

thresholdPositive tolerance value for bound detection.

JSON example
{
"Name": "TransformBoundsAction",
"Query": "SlidingDrawer",
"Option": "Lock",
"Data": "{\"snapToExactBounds\":true,\"waitForCompletion\":false}",
"Type": 0
}

PivotRotateLimiterAction

Controls rotation limits and lock states on pivot-rotating objects.

Query and Scene Setup

QueryPivot Rotate Limiter block with IPivotRotateLimiter.

Scene setupAdd the matching MetaXRPivotRotateLimiter_*Axis_Block.prefab from VRseBlocks.

Options

SetToMin

Moves the rotator to its minimum limit.

SetToMax

Moves the rotator to its maximum limit.

LockOnMin

Locks rotation when the minimum limit is reached.

LockOnMax

Locks rotation when the maximum limit is reached.

Unlock

Clears the rotation lock.

Enable

Enables rotation constraints.

Disable

Disables rotation constraints.

FieldsNo option-specific fields are required.

SetToSpecific

Moves the rotator to a specific rotation value.

LockOnSpecific

Locks rotation when the specific rotation value is reached.

specificSpecific rotation value used by this option.

JSON example
{
"Name": "PivotRotateLimiterAction",
"Query": "ValveWheel",
"Option": "SetToMax",
"Data": "{\"waitForCompletion\":true}",
"Type": 0
}

TransformerSwitcherAction

Switches the active transformer on an object.

Query and Scene Setup

QueryObject with ITransformerSwitcher.

Scene setupConfigure the available transformers on the query object.

Options

Switch

Switches to the transformer at the supplied index.

indexTransformer index to activate.

waitForCompletionOptional completion setting.

JSON example
{
"Name": "TransformerSwitcherAction",
"Query": "TwoHandTool",
"Option": "Switch",
"Data": "{\"index\":1,\"waitForCompletion\":false}",
"Type": 0
}