跳到主要内容

游戏事件节点行为

GES · Flow Orchestration

配置每个流程图节点的条件、开始延迟、参数传递、优先级以及触发器或链行为

面向在画布上放置节点后、需要逐个配置流程节点的开发者

双击流程图中的节点,设置条件、延迟和参数传递方式

Node Configuration Window

上图的设置在流程到达该节点时生效,节点对应的事件资产仍按自己的调度配置执行


窗口概览​

配置窗口分为三个主要部分:

部分目的适用于
节点信息查看事件详情和类型所有节点
节点条件用于执行控制的可视化逻辑门所有节点
节点配置时间、优先级和数据传递设置所有节点(特定类型)

节点信息​

显示有关所选节点的只读详细信息

Node Information Card

事件名称:此节点将触发的游戏事件

节点类型:触发器(并行)或链(顺序)

事件GUID:用于内部跟踪的唯一标识符

使用场景:在进行更改之前验证您正在编辑正确的节点


节点条件(流程门)​

每个节点都有自己的可视化条件树来控制其是否执行

Node Condition Tree

工作原理​

如果条件评估为FALSE:

  • 节点不触发
  • 流程沿此分支停止
  • 连接的子节点被跳过

如果条件评估为TRUE:

  • 节点正常触发
  • 流程继续到子节点

条件上下文​

您可以访问:

事件参数(Arg):来自传入事件的数据

示例:Arg.amount > 50

Sender(Sender):源对象(用于sender事件)

示例:Sender.tag == "Enemy"

场景对象:场景中的任何GameObject/Component

示例:Player.Health < 20

可视化构建器​

条件系统使用与事件行为相同的可视化条件树

完整文档:请参阅**可视化条件树**获取完整指南:

  • 构建逻辑门(AND/OR组)
  • 源类型(事件参数、场景类型、随机、常量)
  • 比较运算符
  • 类型验证
  • 最佳实践
可重用逻辑

可视化条件系统在以下位置相同:

  • 事件行为(在事件Inspector中)
  • 流程节点(此窗口)

学一次,到处用!


实际示例​

场景:仅在生命值危急时播放"低生命值警告"

条件树:

结果:仅当所有三个条件都通过时才播放声音


节点配置​

控制时间、优先级和数据流的设置

通用设置(所有节点)​

Node Config General

开始延迟

单位:秒(float)

效果:节点在触发其事件之前等待此持续时间

使用场景:

  • 交错爆炸(间隔0.2秒)
  • 对事件的延迟反应
  • 定时序列

示例:

🔘 触发:OnButtonPressed
│
├─► ⏱️ 0.5s ──┐
│ ▼
│ 🎵 PlayClickSound ✅ 已执行
│
├─► ⏱️ 1.0s ────────┐
│ ▼
│ 💬 ShowConfirmation ✅ 已执行
│
└─► ⏱️ 2.0s ──────────────────┐
▼
🚪 CloseMenu ✅ 已完成

可视化指示器:徽章在节点底部显示⏱️ 0.5s

传递参数

类型:布尔切换

效果:控制事件数据是否流向此节点


选中(传递参数:开启)​

节点从前一个事件接收数据(如果类型兼容)

何时使用:

  • 转发伤害信息
  • 传递分数/值
  • 数据管道

示例:

连接颜色:取决于类型兼容性(绿色/黄色/橙色)


未选中(传递参数:关闭)​

节点作为静态调用触发,使用默认/空参数

何时使用:

  • 连接不兼容的类型
  • 通用通知(不需要数据)
  • 强制类型安全连接

示例:

🚀 事件:OnDamageReceived(DamageInfo)
│ (有效载荷: { amount: 20.0, ... })
│
🛡️ 过滤器: [ 传递参数: 关 ]
│ (逻辑: 仅触发/数据丢弃)
│
└─► 🔊 回调:PlayGenericSound()
│
🎯 结果:声音可靠播放,无需DamageInfo数据

连接颜色:始终🟢 绿色(强制安全)


对连接的影响​

传递参数直接影响连接线颜色:

传递源类型目标类型结果
关任何任何🟢 绿色(始终安全)
开<int><int>🟢 绿色(完美匹配)
开<int><void>🟡 黄色(数据丢弃)
开<int><float>🟠 橙色(转换)
开<int><string>🔴 红色(阻止)

建议:连接不兼容类型时使用关以避免红色连接


特定类型设置​

配置选项根据节点类型(触发器vs链)而变化

触发器节点

触发器节点(🟠 橙色)​

执行:并行(扇出)- 触发后立即继续

Trigger Node Settings


优先级​

类型:整数(默认:0)

规则:数字越大 = 越早执行

使用场景:当多个触发器连接到同一父节点时控制执行顺序


优先级工作原理​

场景:三个触发器连接到一个根节点

执行顺序:10 → 5 → 0(从高到低)


优先级值​

值含义使用场景
正数更高优先级关键动作(声音、输入阻止)
0默认优先级普通动作
负数更低优先级清理、日志记录、分析

示例使用场景:

  • +100:阻止玩家输入
  • +50:播放关键声音
  • 0:标准VFX
  • -50:记录到分析
  • -100:清理临时对象

可视化指示器​

徽章在节点底部显示⬆️ +10

链节点

链节点(🟢 绿色)​

执行:顺序(阻塞)- 触发并在继续之前等待

Chain Node Settings


持续时间​

类型:秒(float)

效果:强制图表在事件触发之后在此节点暂停指定时间

使用场景:等待动画、定时序列、冷却时间


持续时间示例​

动画等待:

🖼️ T+0.0s | 启动
⚔️ PlayAttackAnimation()
│
┆ (Δ 1.5s 延迟: 动画持续时间)
▼
🖼️ T+1.5s | 执行
💥 DealDamage()
│
📊 结果:总持续时间1.5s | ✅ 链完成

定时序列:

🖼️ T+0.0s | 激活
⚠️ ShowWarning()
│
┆ (Δ 3.0s 显示持续时间)
▼
🖼️ T+3.0s | 清理
🙈 HideWarning()
│
📊 生命周期:3.0s活动 | ✅ 自动清理完成

可视化指示器:徽章在节点底部显示⏳ 3.0s


等待完成​

Chain 节点的 Wait for Completion 会在触发事件并完成 Duration 计时后再等一帧,后续节点随后继续执行

等待异步操作​

如果下一步取决于场景加载或网络请求的结果,可在协程或 Task 成功结束后显式触发一个完成事件,让该事件启动后续流程

public IEnumerator OnLoadLevel()
{
yield return SceneManager.LoadSceneAsync("Level2");
Debug.Log("加载完成");
}
public async Task OnDownloadData()
{
await DownloadFromServer();
Debug.Log("下载完成");
}

将成功提示接到完成事件,便可以在收到完成信号后更新界面


配置示例​

示例1:延迟触发序列​

目标:以交错时间播放3个声音


示例2:带等待的条件链​

目标:仅在玩家完成教程后加载关卡

流程:

  1. 关卡完成
  2. 检查条件(如果教程完成则通过)
  3. 启动异步加载,完成后从回调触发完成事件
  4. 显示关卡开始UI

快速节点类型转换​

要更改节点类型,无需删除后重建

操作方法:

  1. 在图表中右键点击节点
  2. 选择**"转换为触发器"或"转换为链"**

保留的内容:

  • ✅ 事件分配
  • ✅ 连接
  • ✅ 开始延迟
  • ✅ 传递参数
  • ✅ 条件

变化的内容:

  • 触发器 → 链:优先级移除,添加持续时间/等待
  • 链 → 触发器:持续时间/等待移除,添加优先级

故障排除​

节点不触发​

检查清单:

  1. ✅ 条件是否启用并通过?
  2. ✅ 父节点是否触发?
  3. ✅ 连接是否完整?
  4. ✅ 工具栏中的图表是否启用?

调试:添加临时无条件节点以测试流程


"传递参数"显示为灰色​

原因:事件类型为void(无参数可传递)

解决方案:这是预期的——void事件没有要转发的数据


持续时间不起作用​

常见问题:

  • 节点类型是触发器(持续时间仅适用于链节点)
  • 持续时间设置为0
  • Wait for Completion 会在持续时间后再等待一帧

解决方案:验证节点类型并检查持续时间和等待设置


后续动作早于异步操作完成​

在协程或任务成功结束后触发完成事件,将后续动作绑定到该事件