FX 节点
用动画、音频、VFX、飘字、位移和镜头反馈表现已经结算的结果
FX 节点应在玩法修改提交后请求表现,这里列出 7 个可复用的核心 FX 节点,以及 Demo 程序集注册的 2 个状态表现扩展节点FX 节点应在玩法修改提交后请求表现,这里列出 7 个可复用的核心 FX 节点,以及 Demo 程序集注册的 2 个状态表现扩展节点
节点用法
Flash Unit
需要让单个单位短暂闪色,以表现受击、治疗、增益或减益时,使用 Flash Unit
输入
In(Flow):启动节点Duration(Float):可选的闪色时长覆盖值Target(UnitRef):可选的暴露目标输入
输出
Out(Flow):发出闪色请求后继续执行
参数
TargetSource(Self):Self、Opponent、AllEnemies、AllUnits;Target未连接时选择单位Color(白色RGBA(1, 1, 1, 1)):任意颜色;设置闪色颜色Duration(0.3):秒;Duration端口未连接时使用的时长
节点只解析一个单位,并通过 UnitPresentationSystem 请求单位视图闪色,缺少单位或表现视图时不会显示效果,集合来源只使用第一个单位
Play Animation
需要向单个单位的表现动画器发送 Hit、Attack 或 Death 等触发器时,使用 Play Animation
输入
In(Flow):启动节点Target(UnitRef):可选的暴露目标输入
输出
Out(Flow):发出触发请求后继续执行
参数
TargetSource(Self):Self、Opponent、AllEnemies、AllUnits;Target未连接时选择单位Trigger(Hit):任意 Animator Trigger 名称;指定发送给单位表现动画器的触发器
Trigger 为空、单位无法解析、缺少单位视图,或动画器没有同名触发器时都不会出现可见动画,节点只解析一个单位,也不会等待动画播放结束才从 Out 继续
Play SFX
需要播放一次性的出牌、命中、状态或 UI 音效时,使用 Play SFX
输入
In(Flow):启动节点Volume(Float):可选的播放音量覆盖值
输出
Out(Flow):音效开始播放后立即继续执行
参数
Clip(None):任意AudioClip;选择一次性音效Volume(1):数值;Volume端口未连接时使用的音量
没有 Clip 时不会播放声音,运行时把音量限制在 0 到 1,以 2D 方式播放,并为每次播放加入 0.97 到 1.03 的轻微随机音高,GCS 最多保留 12 个持久化 AudioSource,池满后按顺序复用,这个节点不适合播放音乐或环境循环,也不会等待音频结束
Play VFX
需要把一个特效预制体生成在单个单位上,或固定世界坐标时,使用 Play VFX
输入
In(Flow):启动节点Lifetime(Float):编辑器中可暴露的生命周期覆盖端口Target(UnitRef):Anchor为OnUnit时可用,连接后覆盖TargetSource
输出
Out(Flow):生成预制体后立即继续执行
参数
TargetSource(Self):Self、Opponent、AllEnemies、AllUnits;Anchor为OnUnit且Target未连接时选择一个单位Anchor(OnUnit):OnUnit、AtPosition;选择单位位置或固定世界坐标Position((0, 0, 0)):世界坐标Vector3;仅在AtPosition下使用的生成位置Prefab(None):任意GameObject预制体;选择要实例化的特效Lifetime(0):秒;正数表示精确生命周期,0或负数启用自动检测
OnUnit 只解析一个单位,找不到单位表现位置时会退回世界原点,AtPosition 会隐藏目标输入并始终使用 Position,没有 Prefab 时不会生成对象
自动生命周期会读取最长的非循环粒子时长加最大初始生命周期,或最长的非循环 Animator Clip,然后再加 0.1 秒,两者都不存在时按 2 秒销毁,循环粒子和循环动画不会延长这个时间,计算结果会按预制体缓存
Lifetime 端口边界当前运行时直接读取节点上的 Lifetime 字段,暴露并连接自动生成的 Lifetime 输入还不能覆盖这个值,在运行时行为修正前,请直接在节点字段中设置生命周期

Shake Camera
需要为重击、Boss 行为或大型范围攻击加入镜头反馈时,使用 Shake Camera
输入
In(Flow):启动节点Intensity(Float):可选的震动强度覆盖值Duration(Float):可选的震动时长覆盖值
输出
Out(Flow):震动开始后立即继续执行
参数
Intensity(0.3):世界空间距离;设置节点内的震动强度Duration(0.3):秒;设置节点内的震动时长
节点需要 Camera.main,强度或时长小于等于 0 时不震动,同一相机上再次启动震动,会先停止上一次 Tween 并还原记录的初始位置,再开始新的衰减抖动,Tween 完成后会再次还原相机位置
Show Floating Text
需要在一个或多个单位上方显示实际伤害、治疗、护甲、格挡或短文本时,使用 Show Floating Text
输入
In(Flow):启动节点Target(UnitRefOrCollection):可选的暴露目标输入,支持单个单位或集合Amount(Int):Content为Amount时可用,覆盖节点中的数值Text(String):Content为Text时可用,覆盖节点中的文本
输出
Out(Flow):提交全部飘字请求后继续执行
参数
TargetSource(Self):Self、Opponent、AllEnemies、AllUnits;Target未连接时选择目标Kind(Custom):Damage、Heal、Armor、Block、Custom;选择飘字语义样式Content(Text):Amount、Text;选择启用的内容字段和数据端口Amount(0):整数;Amount模式下显示的数值Text(空):任意短文本;Text模式下显示的标签Color(白色RGBA(1, 1, 1, 1)):任意颜色;自定义飘字颜色UseCustomColor(关闭):关闭、开启;开启时使用Color,关闭时由飘字样式决定颜色IncludeSign(开启):关闭、开启;显示数值内容时是否带正负号ScaleMultiplier(1):倍率;缩放配置好的字体大小DurationMultiplier(1):倍率;缩放配置好的显示时长Offset((0, 0, 0)):相对单位表现的Vector3偏移;调整飘字位置
与其他核心目标型 FX 节点不同,这个节点会遍历所有解析到的单位,并跳过空对象,如果 Content 为 Amount、解析到的数值为 0,同时 Text 不为空,运行时会改用文本内容,需要显示真实结算值时,应连接 Deal Damage.Dealt 等输出,不要重复填写可能被护甲或 Hook 改变的原始数值

Slide Unit
需要让单个单位表现出突进、后坐、闪避或击退,但不修改战斗位置数据时,使用 Slide Unit
输入
In(Flow):启动节点Target(UnitRef):可选的暴露目标输入To(Vector3):必须连接的世界坐标目标位置Duration(Float):可选的位移时长覆盖值
输出
Out(Flow):位移开始后立即继续执行
参数
TargetSource(Self):Self、Opponent、AllEnemies、AllUnits;Target未连接时选择一个单位Duration(0.3):秒;Duration端口未连接时使用的时长Ease(Linear):Linear、InSine、OutSine、InOutSine、OutCubic、InCubic、OutBack、InBack、OutBounce、OutElastic;选择运动曲线
To 没有节点内后备值,未连接时运行时会得到 (0, 0, 0),节点只解析一个单位,只移动单位表现而不修改战斗状态,也不会等待 Tween 结束才继续执行
Demo 扩展 FX 节点
Status Apply FX 和 Status Expire FX 来自 GCS Demo 程序集,不属于核心运行时节点,它们把 Demo 状态资产使用的多种表现合并在一起,并依赖 Demo 中的 UnitView、BattleAudio 和投射物组件
Status Apply FX
Demo 状态应用流图需要用一个可复用节点表现光环附加或投射物命中时,使用 Status Apply FX
输入
In(Flow):启动节点Target(UnitRefOrCollection):可选的暴露目标输入,运行时只解析第一个单位ApplyVolume(Float):可选的光环音效音量覆盖值FlightTime(Float):可选的投射物飞行时长覆盖值ArcHeight(Float):可选的投射物弧线高度覆盖值ThrowVolume(Float):可选的发射音效音量覆盖值ImpactVolume(Float):可选的命中音效音量覆盖值HitHeight(Float):可选的目标命中高度覆盖值DropHeight(Float):可选的后备生成高度覆盖值RepeatCooldown(Float):可选的重复抑制时间覆盖值
输出
Out(Flow):请求光环效果或发射投射物后继续执行
参数
TargetSource(Self):始终;Target未连接时选择一个目标Mode(Aura):始终;选择Aura或Projectile行为Tint(白色RGBA(1, 1, 1, 1)):始终;设置目标视图持续0.22秒的闪色颜色AuraVfx(None):Aura,或投射物后备流程;在命中点生成的预制体ApplyClip(None):Aura,或投射物后备流程;光环附加时播放的音效ApplyVolume(0.9):Aura,或投射物后备流程;ApplyClip的音量ProjectilePrefab(None):Projectile;飞向目标的投射物预制体,缺失时退回Aura行为FlightTime(0.55):Projectile;存在独立攻击者视图时的飞行秒数ArcHeight(1.6):Projectile;存在独立攻击者视图时的弧线高度ThrowClip(None):Projectile;发射时播放的音效ThrowVolume(0.8):Projectile;ThrowClip的音量ImpactVfx(None):Projectile;投射物落点生成的预制体ImpactClip(None):Projectile;投射物落地时播放的音效ImpactVolume(1):Projectile;ImpactClip的音量HitHeight(0.9):始终;命中点相对目标原点的垂直偏移DropHeight(2.4):Projectile且没有独立攻击者视图;后备投射物起点位于目标上方的高度RepeatCooldown(0.12):始终;同一状态在同一目标上再次播放前的最短秒数,0或负数关闭抑制
节点需要有效目标和已注册的 UnitView,投射物模式下,如果 ctx.Attacker 与目标不同且有可用视图,就从攻击者位置发射,否则从目标上方向下投射,飞行时间改为 FlightTime 的 65%,弧线高度固定为 0.15,落地回调会尽量跟随目标当时的实时视图位置,然后闪色并播放命中特效与音效
重复抑制按目标和传入状态或当前状态共同记录,没有状态时使用节点 ID,Out 不会等待投射物命中,音效依赖 BattleAudio.Instance,生成的 VFX 使用最长非循环粒子时长加初始生命周期和 0.1 秒,没有可用时长时按 2 秒销毁,循环粒子不会延长生命周期

Status Expire FX
Demo 状态到期流图需要在受影响单位上播放一个粒子效果和音效时,使用 Status Expire FX
输入
In(Flow):启动节点Target(UnitRefOrCollection):可选的暴露目标输入,运行时只解析第一个单位ExpireVolume(Float):可选的到期音效音量覆盖值HitHeight(Float):可选的特效高度覆盖值
输出
Out(Flow):发出表现请求后立即继续执行
参数
TargetSource(Self):Self、Opponent、AllEnemies、AllUnits;Target未连接时选择一个目标Tint(白色RGBA(1, 1, 1, 1)):任意颜色;简单粒子起始色乘以该颜色,渐变或随机起始色模式则直接替换为该颜色ExpireVfx(None):任意GameObject预制体;在目标位置生成的到期特效ExpireClip(None):任意AudioClip;状态到期时播放的音效ExpireVolume(0.55):数值;ExpireClip的音量HitHeight(0.9):世界空间单位;特效位置相对目标原点的垂直偏移
节点需要有效目标和已注册的 UnitView,VFX 与音效资产缺失时会分别跳过,音效还依赖 BattleAudio.Instance,生成的 VFX 使用最长非循环粒子时长加初始生命周期和 0.1 秒,没有可用时长时按 2 秒销毁,循环粒子不会延长生命周期
