跳到主要内容

高级逻辑模式

超越简单连接,本章深入探讨流程系统的运行时架构

理解系统如何执行触发器与链,以及节点配置如何与事件配置交互,是掌握复杂游戏逻辑的关键。


⚙️ 核心机制:触发器 vs 链

在流程图中,连接不仅仅是一条线;它是控制权的转移目标节点的类型决定了如何处理该控制权。

特性🟠 触发器节点🟢 链节点
执行模式并行(扇出)串行(序列)
阻塞?非阻塞阻塞
技术实现即发即弃协程Yield
数据流立即将数据传递给所有子节点。仅在完成后将数据传递给下一个子节点。

1. 触发器机制(并行)

当流程进入触发器节点时:

  1. 系统计算所有连接的触发器的优先级
  2. 它在循环中逐个执行它们。
  3. 关键是,它不会等待触发器完成其任务就开始下一个。
  4. 结果:对玩家而言,所有效果(声音、UI、粒子)似乎在同一帧同时发生。

2. 链机制(顺序)

链节点具有为节奏设计的复杂生命周期。它使用两层延迟来保持流程:

  1. 执行前:等待 开始延迟
  2. 执行:触发事件。
  3. 执行后:等待 持续时间等待完成
  4. 信号:只有这样它才会触发下一个节点。

⏱️ 执行时间线

理解节点配置(图表)如何与事件配置(Inspector)交互至关重要。

"双重延迟"规则

如果您在节点事件上都配置了延迟,它们是累加的

动作的总时间 = 节点开始延迟 + 事件动作延迟

可视化时间线

这是单个链节点执行的逐毫秒分解:

[流程进入节点]

├── 1. 节点条件检查(图表层)
│ 🛑 如果为False: 停止。

├── 2. 节点开始延迟(图表层)⏱️
│ ⏳ 等待中...

├── 3. 事件触发(核心层)🚀
│ │
│ ├── a. 事件条件检查(Inspector层)
│ │ 🛑 如果为False: 跳过动作(但流程继续!)
│ │
│ ├── b. 事件动作延迟(Inspector层)⏱️
│ │ ⏳ 等待中...
│ │
│ └── c. UnityActions调用(游戏逻辑)🎬
│ (例如,播放动画、减少生命值)

├── 4. 节点持续时间/等待(图表层)⏳
│ 🛑 流程在这里被阻塞。
│ (等待持续时间秒数或异步完成)

└── 5. 信号下一个节点 ⏭️
架构细节
  • 事件条件仅停止本地副作用(动作c)。它们不会阻止流程图继续执行步骤4和5。
  • 要停止流程图逻辑,您必须使用节点条件(步骤1)。

🛠️ 食谱:真实世界设计模式

这里是解决常见游戏开发问题的标准架构模式。

1. "电影"模式(过场动画)

目标:严格定时的事件序列。 场景:相机移动 -> 门打开 -> 角色走进 -> 对话开始。

alt text

  • 结构:根 ➔ 链 ➔ 链 ➔ 链。
  • 配置
    • 对每个步骤使用链节点(🟢)
    • 使用**节点持续时间(⏳)**来控制序列节奏。
      • 示例:如果"门打开动画"需要2.0秒,将节点持续时间设置为2.0以确保角色不会穿过关闭的门。

2. "广播器"模式(玩家死亡)

目标:一个状态变化触发多个独立系统。 场景:玩家死亡。您需要:播放声音、显示游戏结束UI、生成布娃娃、保存游戏。

alt text

  • 结构:根 ➔ 多个触发器。
  • 配置
    • :OnPlayerDeath。
    • 子节点:4个单独的触发器节点(🟠)
    • 为什么:如果"保存游戏"系统挂起或出错,您不希望它阻止"游戏结束UI"出现。并行执行确保安全性。

3. "混合Boss"模式(复杂状态)

目标:复杂的AI阶段转换。 场景:Boss进入第2阶段。他咆哮(动画),同时音乐改变,竞技场变红。当咆哮结束时,他开始攻击。

alt text

  • 结构
    1. 根(OnHealthThreshold)。
    2. 链节点(BossRoarAnim),勾选等待完成(或将持续时间设置为动画长度)。
    3. 触发器节点(MusicChange)附加到根(与咆哮并行)。
    4. 触发器节点(ArenaColorChange)附加到根(与咆哮并行)。
    5. 链节点(StartAttack)附加到BossRoarAnim节点。
  • 流程
    • 音乐和颜色与咆哮同时立即发生。
    • StartAttack等待直到咆哮链节点完全完成(时间线中的步骤4)。

🎯 总结:何时使用什么?

需求使用节点类型为什么?
"先做X,然后做Y"链(🟢)通过阻塞保证顺序。
"同时做X、Y和Z"触发器(🟠)即发即弃。并行执行。
"如果HP < 0,做X"节点条件完全停止流程逻辑。
"仅在未静音时播放声音"事件条件停止副作用,保持流程逻辑运行。
"在做X之前等待"节点开始延迟延迟事件触发。
"在X之后等待再做Y"节点持续时间(仅链)延迟下一个节点信号。