Skip to main content

FX Nodes

GCS · Built-In Node Library

Present resolved gameplay with animation, audio, VFX, floating text, motion, and camera feedback.

FX nodes request presentation after gameplay changes are committed. This page contains the 7 reusable core FX nodes plus the 2 status presentation nodes registered by the Demo assembly.

FX nodes request presentation after gameplay changes are committed. This page contains the 7 reusable core FX nodes plus the 2 status presentation nodes registered by the Demo assembly.


Node Usage

Flash Unit

Use Flash Unit for a short hit, heal, buff, or debuff color response on one unit.

Input

  • InFlow):Starts the node
  • DurationFloat):Optional override for the flash duration
  • TargetUnitRef):Optional exposed target override

Output

  • OutFlow):Continues after the flash request

Parameters

  • TargetSourceSelf):Self, Opponent, AllEnemies, AllUnits;Selects the unit when Target is not connected
  • Color(White RGBA(1, 1, 1, 1)):Any color;Sets the flash color
  • Duration0.3):Seconds;Sets the inline duration used when the port is not connected

The node resolves one unit and asks UnitPresentationSystem to flash its view. A missing unit or presentation view produces no flash. Collection sources use only their first unit.

Flash Unit node

Play Animation

Use Play Animation to send a trigger such as Hit, Attack, or Death to one unit's presentation animator.

Input

  • InFlow):Starts the node
  • TargetUnitRef):Optional exposed target override

Output

  • OutFlow):Continues after the trigger request

Parameters

  • TargetSourceSelf):Self, Opponent, AllEnemies, AllUnits;Selects the unit when Target is not connected
  • TriggerHit):Any animator trigger name;Selects the trigger sent to the unit presentation

An empty Trigger, unresolved unit, missing view, or animator without the matching trigger results in no visible animation. The node resolves only one unit and does not wait for the animation to finish before continuing through Out.

Play Animation node

Play SFX

Use Play SFX for a one-shot card, impact, status, or UI sound that belongs to this graph execution.

Input

  • InFlow):Starts the node
  • VolumeFloat):Optional override for playback volume

Output

  • OutFlow):Continues immediately after playback starts

Parameters

  • ClipNone):Any AudioClip;Selects the one-shot sound
  • Volume1):Numeric value;Sets the inline volume used when the port is not connected

A missing clip produces no sound. Runtime volume is clamped to 01, playback is 2D, and each play receives a slight random pitch from 0.97 to 1.03. GCS maintains a pool of up to 12 persistent AudioSource objects and reuses them in round-robin order after the pool is full. This node is not a music or ambience player and does not wait for the clip to finish.

Play SFX node

Play VFX

Use Play VFX to spawn a prefab on one unit or at a fixed world position.

Input

  • InFlow):Starts the node
  • LifetimeFloat):Optional exposed lifetime override in the editor
  • TargetUnitRef):Available when Anchor is OnUnit; overrides TargetSource

Output

  • OutFlow):Continues immediately after the prefab is spawned

Parameters

  • TargetSourceSelf):Self, Opponent, AllEnemies, AllUnits;Selects one unit when Anchor is OnUnit and Target is not connected
  • AnchorOnUnit):OnUnit, AtPosition;Chooses between a resolved unit position and the inline world position
  • Position(0, 0, 0)):World-space Vector3;Spawn point used only by AtPosition
  • PrefabNone):Any GameObject prefab;Selects the effect to instantiate
  • Lifetime0):Seconds;Positive values set an exact lifetime; 0 or less enables automatic lifetime detection

OnUnit resolves one unit and falls back to world origin when its presentation position cannot be found. AtPosition hides the target input and always uses Position. A missing prefab produces no object.

Automatic lifetime uses the longest non-looping particle duration plus maximum start lifetime, or the longest non-looping animator clip, then adds 0.1 seconds. When neither is found, the object is destroyed after 2 seconds; looping particles and clips do not extend that lifetime. The result is cached per prefab.

Current Lifetime port boundary

The current runtime reads the inline Lifetime field directly. Exposing and wiring the generated Lifetime input does not override it yet, so set this value on the node until that runtime behavior changes.

Play VFX node

Shake Camera

Use Shake Camera for high-impact hits, boss actions, or large area effects where camera feedback improves readability.

Input

  • InFlow):Starts the node
  • IntensityFloat):Optional override for shake distance
  • DurationFloat):Optional override for shake time

Output

  • OutFlow):Continues immediately after the shake starts

Parameters

  • Intensity0.3):World-space distance;Sets the inline shake strength
  • Duration0.3):Seconds;Sets the inline shake duration

The node requires Camera.main. Intensity or duration at 0 or below produces no shake. Starting another shake on the same camera stops the previous tween, restores the recorded home position, and begins the new decaying jitter; the camera is restored again when the tween completes.

Shake Camera node

Show Floating Text

Use Show Floating Text to show committed damage, healing, armor, block, or a short custom label over one or more units.

Input

  • InFlow):Starts the node
  • TargetUnitRefOrCollection):Optional exposed target override; supports one unit or a collection
  • AmountInt):Available when Content is Amount; overrides the inline number
  • TextString):Available when Content is Text; overrides the inline label

Output

  • OutFlow):Continues after all text requests are submitted

Parameters

  • TargetSourceSelf):Self, Opponent, AllEnemies, AllUnits;Selects targets when Target is not connected
  • KindCustom):Damage, Heal, Armor, Block, Custom;Selects the semantic text style
  • ContentText):Amount, Text;Chooses which content field and data port are active
  • Amount0):Integer;Number shown in Amount mode
  • Text(Empty):Any short label;Label shown in Text mode
  • Color(White RGBA(1, 1, 1, 1)):Any color;Custom text color
  • UseCustomColor(Off):Off, On;On uses Color; off lets the floating-text style select its color
  • IncludeSign(On):Off, On;Adds the numeric sign when amount content is shown
  • ScaleMultiplier1):Multiplier;Scales the configured text size
  • DurationMultiplier1):Multiplier;Scales the configured display duration
  • Offset(0, 0, 0)):Local Vector3 offset;Moves the text relative to the unit presentation

Unlike the other core target-based FX nodes, this node iterates every resolved unit. Null members are skipped. If Content is Amount, the resolved amount is 0, and Text is not empty, runtime falls back to text content. Connect committed outputs such as Deal Damage.Dealt instead of repeating a configured amount that hooks or armor may change.

Show Floating Text node

Slide Unit

Use Slide Unit for a presentation-only lunge, recoil, dodge, or knockback on one unit.

Input

  • InFlow):Starts the node
  • TargetUnitRef):Optional exposed target override
  • ToVector3):Required destination in world space
  • DurationFloat):Optional override for slide time

Output

  • OutFlow):Continues immediately after the slide starts

Parameters

  • TargetSourceSelf):Self, Opponent, AllEnemies, AllUnits;Selects one unit when Target is not connected
  • Duration0.3):Seconds;Sets the inline duration used when the port is not connected
  • EaseLinear):Linear, InSine, OutSine, InOutSine, OutCubic, InCubic, OutBack, InBack, OutBounce, OutElastic;Selects the motion curve

To has no inline fallback. If it is not connected, runtime receives (0, 0, 0). The node resolves one unit, moves its presentation rather than battle state, and does not wait for the tween to finish before continuing.


Demo extension FX nodes

These two nodes are examples from the GCS Demo assembly, not core runtime nodes. They combine several presentation operations for the Demo's status assets and depend on Demo-side UnitView, BattleAudio, and projectile components.

Slide Unit node

Status Apply FX

Use Status Apply FX in a Demo status-application graph when one reusable node should present either an aura application or a travelling projectile.

Input

  • InFlow):Starts the node
  • TargetUnitRefOrCollection):Optional exposed target override; runtime resolves only the first unit
  • ApplyVolumeFloat):Optional aura sound-volume override
  • FlightTimeFloat):Optional projectile travel-time override
  • ArcHeightFloat):Optional projectile arc-height override
  • ThrowVolumeFloat):Optional launch sound-volume override
  • ImpactVolumeFloat):Optional impact sound-volume override
  • HitHeightFloat):Optional target impact-height override
  • DropHeightFloat):Optional fallback spawn-height override
  • RepeatCooldownFloat):Optional repeat-suppression override

Output

  • OutFlow):Continues after the aura is requested or the projectile is launched

Parameters

  • TargetSourceSelf):Always;Selects one target when Target is not connected
  • ModeAura):Always;Chooses Aura or Projectile behavior
  • Tint(White RGBA(1, 1, 1, 1)):Always;Sets the 0.22-second flash color applied to the target view
  • AuraVfxNone):Aura, or projectile fallback;Prefab spawned at the impact point
  • ApplyClipNone):Aura, or projectile fallback;Sound played with the aura application
  • ApplyVolume0.9):Aura, or projectile fallback;Volume for ApplyClip
  • ProjectilePrefabNone):Projectile;Prefab launched toward the target; a missing prefab falls back to Aura behavior
  • FlightTime0.55):Projectile;Travel time in seconds when a separate attacker view exists
  • ArcHeight1.6):Projectile;Arc height when a separate attacker view exists
  • ThrowClipNone):Projectile;Sound played at launch
  • ThrowVolume0.8):Projectile;Volume for ThrowClip
  • ImpactVfxNone):Projectile;Prefab spawned when the projectile lands
  • ImpactClipNone):Projectile;Sound played when the projectile lands
  • ImpactVolume1):Projectile;Volume for ImpactClip
  • HitHeight0.9):Always;Vertical offset above the target origin for the impact point
  • DropHeight2.4):Projectile without a separate attacker view;Height above the target used as the fallback projectile origin
  • RepeatCooldown0.12):Always;Minimum seconds before the same status can replay on the same target; 0 or less disables suppression

The node requires a resolved target and registered UnitView. In projectile mode, a different ctx.Attacker with a view becomes the origin. Without one, the projectile drops from above the target, uses 65% of FlightTime, and forces the arc to 0.15. The landing callback follows the target's live view when possible, then flashes it and plays the impact VFX and sound.

Repeat suppression is keyed by target plus incoming or current status; when no status exists, the node ID is used. Out does not wait for projectile impact. Sounds require BattleAudio.Instance. Spawned VFX use the longest non-looping particle duration plus start lifetime and 0.1 seconds, with a 2-second fallback; looping systems do not extend the lifetime.

Status Apply FX Demo extension node

Status Expire FX

Use Status Expire FX in a Demo status-expiration graph to play one particle effect and sound at the affected unit.

Input

  • InFlow):Starts the node
  • TargetUnitRefOrCollection):Optional exposed target override; runtime resolves only the first unit
  • ExpireVolumeFloat):Optional expiration sound-volume override
  • HitHeightFloat):Optional effect-height override

Output

  • OutFlow):Continues immediately after presentation is requested

Parameters

  • TargetSourceSelf):Self, Opponent, AllEnemies, AllUnits;Selects one target when Target is not connected
  • Tint(White RGBA(1, 1, 1, 1)):Any color;Multiplies simple particle start colors and replaces gradient or random start-color modes
  • ExpireVfxNone):Any GameObject prefab;Effect spawned at the target
  • ExpireClipNone):Any AudioClip;Sound played when the status expires
  • ExpireVolume0.55):Numeric value;Volume for ExpireClip
  • HitHeight0.9):World-space units;Vertical offset above the target origin

The node requires a resolved target and registered UnitView. Missing VFX and audio assets are skipped independently, and audio also requires BattleAudio.Instance. The spawned VFX lifetime uses the longest non-looping particle duration plus start lifetime and 0.1 seconds, with a 2-second fallback; looping systems do not extend it.

Status Expire FX Demo extension node