高级逻辑模式
超越简单连接,本章深入探讨流程系统的运行时架构。
理解系统如何执行触发器与链,以及节点配置如何与事件配置交互,是掌握复杂游戏逻辑的关键。
⚙️ 核心机制:触发器 vs 链
在流程图中,连接不仅仅是一条线;它是控制权的转移。目标节点的类型决定了如何处理该控制权。
| 特性 | 🟠 触发器节点 | 🟢 链节点 |
|---|---|---|
| 执行模式 | 并行(扇出) | 串行(序列) |
| 阻塞? | ❌ 非阻塞 | ✅ 阻塞 |
| 技术实现 | 即发即弃 | 协程Yield |
| 数据流 | 立即将数据传递给所有子节点。 | 仅在完成后将数据传递给下一个子节点。 |
1. 触发器机制(并行)
当流程进入触发器节点时:
- 系统计算所有连接的触发器的优先级。
- 它在循环中逐个执行它们。
- 关键是,它不会等待触发器完成其任务就开始下一个。
- 结果:对玩家而言,所有效果(声音、UI、粒子)似乎在同一帧同时发生。
2. 链机制(顺序)
链节点具有为节奏设计的复杂生命周期。它使用两层延迟来保持流程:
- 执行前:等待
开始延迟。 - 执行:触发事件。
- 执行后:等待
持续时间或等待完成。 - 信号:只有这样它才会触发下一个节点。
⏱️ 执行时间线
理解节点配置(图表)如何与事件配置(Inspector)交互至关重要。
"双重延迟"规则
如果您在节点和事件上都配置了延迟,它们是累加的。
动作的总时间 = 节点开始延迟 + 事件动作延迟
可视化时间线
这是单个链节点执行的逐毫秒分解:
[流程进入节点]
│
├── 1. 节点条件检查(图表层)
│ 🛑 如果为False: 停止。
│
├── 2. 节点开始延迟(图表层)⏱️
│ ⏳ 等待中...
│
├── 3. 事件触发(核心层)🚀
│ │
│ ├── a. 事件条件检查(Inspector层)
│ │ 🛑 如果为False: 跳过动作(但流程继续!)
│ │
│ ├── b. 事件动作延迟(Inspector层)⏱️
│ │ ⏳ 等待中...
│ │
│ └── c. UnityActions调用(游戏逻辑)🎬
│ (例如,播放动画、减少生命值)
│
├── 4. 节点持续时间/等待(图表层)⏳
│ 🛑 流程在这里被阻塞。
│ (等待持续时间秒数或异步完成)
│
└── 5. 信号下一个节点 ⏭️
架构细节
- 事件条件仅停止本地副作用(动作c)。它们不会阻止流程图继续执行步骤4和5。
- 要停止流程图逻辑,您必须使用节点条件(步骤1)。
🛠️ 食谱:真实世界设计模式
这里是解决常见游戏开发问题的标准架构模式。
1. "电影"模式(过场动画)
目标:严格定时的事件序列。 场景:相机移动 -> 门打开 -> 角色走进 -> 对话开始。

- 结构:根 ➔ 链 ➔ 链 ➔ 链。
- 配置:
- 对每个步骤使用链节点(🟢)。
- 使用**节点持续时间(⏳)**来控制序列节奏。
- 示例:如果"门打开动画"需要2.0秒,将节点持续时间设置为2.0以确保角色不会穿过关闭的门。
2. "广播器"模式(玩家死亡)
目标:一个状态变化触发多个独立系统。 场景:玩家死亡。您需要:播放声音、显示游戏结束UI、生成布娃娃、保存游戏。

- 结构:根 ➔ 多个触发器。
- 配置:
- 根:OnPlayerDeath。
- 子节点:4个单独的触发器节点(🟠)。
- 为什么:如果"保存游戏"系统挂起或出错,您不希望它阻止"游戏结束UI"出现。并行执行确保安全性。
3. "混合Boss"模式(复杂状态)
目标:复杂的AI阶段转换。 场景:Boss进入第2阶段。他咆哮(动画),同时音乐改变,竞技场变红。当咆哮结束时,他开始攻击。

- 结构:
- 根(OnHealthThreshold)。
- 链节点(BossRoarAnim),勾选等待完成(或将持续时间设置为动画长度)。
- 触发器节点(MusicChange)附加到根(与咆哮并行)。
- 触发器节点(ArenaColorChange)附加到根(与咆哮并行)。
- 链节点(StartAttack)附加到BossRoarAnim节点。
- 流程:
- 音乐和颜色与咆哮同时立即发生。
- StartAttack等待直到咆哮链节点完全完成(时间线中的步骤4)。
🎯 总结:何时使用什么?
| 需求 | 使用节点类型 | 为什么? |
|---|---|---|
| "先做X,然后做Y" | 链(🟢) | 通过阻塞保证顺序。 |
| "同时做X、Y和Z" | 触发器(🟠) | 即发即弃。并行执行。 |
| "如果HP < 0,做X" | 节点条件 | 完全停止流程逻辑。 |
| "仅在未静音时播放声音" | 事件条件 | 停止副作用,保持流程逻辑运行。 |
| "在做X之前等待" | 节点开始延迟 | 延迟事件触发。 |
| "在X之后等待再做Y" | 节点持续时间 | (仅链)延迟下一个节点信号。 |