← 返回首页

11-UE5的简单流程控制

分支 (Branch)

节点名称Branch 功能:根据布尔条件选择执行两条输出路径之一,等同于 if-else 语句。

输入引脚

  • Condition(布尔值):判断条件。

输出引脚

  • True(执行):当 Conditiontrue 时触发。
  • False(执行):当 Conditionfalse 时触发。

典型用法

  • 检查角色生命值是否大于0 → True 继续移动,False 播放死亡动画。
  • 检查射线检测是否命中 → True 处理命中逻辑,False 处理未命中。

示例图

[Begin Play] → [Branch (Condition: bIsAlive)] ├─ True → [Print "Alive"] └─ False → [Print "Dead"]

注意事项

  • Condition 是布尔类型,不能直接输入整数或对象,需先转换(如 ==IsValid 等)。
  • 两条分支不会同时执行,且执行顺序固定(先 TrueFalse 只是逻辑上的区分)。

GATE

节点名称Gate 功能:根据开关状态决定是否允许执行流通过。可动态开启或关闭“门”。

输入引脚

  • Enter(执行):进入门的执行脉冲。
  • Open(执行):将门设置为开启状态(后续 Enter 可触发 Exit)。
  • Close(执行):将门设置为关闭状态(后续 Enter 不触发任何输出)。
  • Toggle(执行):切换门的开关状态(开启→关闭,关闭→开启)。

输出引脚

  • Exit(执行):仅在门开启时,Enter 才会触发此输出。
  • Completed(执行):注意:标准 Gate 节点通常没有 Completed;部分自定义版本可能有,但官方节点仅有 Exit

典型用法

  • 关卡中的可互动门:玩家按下开关前门关闭(Close),按下开关后门开启(Open),之后玩家接触门触发器时 Enter 会让角色通过。
  • 计时器控制射击频率:开始时 Close,按下射击键时若门关闭则无法射击;射击后延迟0.2秒再 Open

示例图

[Begin Play] → [Gate (默认关闭)] [Button Pressed] → [Gate Open] [Trigger Overlap] → [Gate Enter] → [Exit] → [Open Door]

注意事项

  • 默认情况下(未调用 Open/Close),门是关闭状态(UE5蓝图放置时可在细节面板设置初始状态为 Open)。
  • Open/Close/Toggle 只改变状态,不产生 Exit 输出。
  • 使用 Toggle 可简化交替开关逻辑。

Flip Flop

节点名称Flip Flop 功能:交替执行两个输出路径,每次触发时轮流切换,类似双稳态触发器。

输入引脚

  • Exec(执行):每次触发时,根据内部状态输出到 AB,并自动翻转状态。

输出引脚

  • A(执行):第一次、第三次、第五次…触发时执行。
  • B(执行):第二次、第四次、第六次…触发时执行。
  • Is A(布尔值):当前输出是否为 A(可用于数据判断)。

典型用法

  • 制作按钮开关:按下一次开灯(A),再按一次关灯(B)。
  • 巡逻AI:第一次走到路径点A,第二次走到B,交替进行。

示例图

[On Button Click] → [Flip Flop] → A → [Turn Light On] → B → [Turn Light Off]

注意事项

  • 状态在蓝图实例中持久保持(每次触发都记住上次输出的是A还是B)。
  • 如果需要在特定时刻重置为A状态,可使用 Reset 引脚(UE5.1+Flip Flop 节点提供 Reset,老版本需手动实现)。

延迟 (Delay)

节点名称Delay 功能:等待指定时间后再触发后续逻辑,非阻塞(不会暂停游戏主循环)。

输入引脚

  • Exec(执行):启动延迟。
  • Duration(浮点数):延迟时间(秒)。

输出引脚

  • Completed(执行):等待 Duration 秒后触发。

附加引脚(右键节点可显示):

  • Retriggerable(布尔值):设为 true 时,如果在延迟未结束期间再次收到 Exec,会重置计时器并重新开始等待(常用于连击或连续操作防抖)。

典型用法

  • 生成子弹后等待0.5秒自动销毁。
  • 拾取道具后显示“获得金币”文字,2秒后自动隐藏。
  • 制作蓄力攻击:长按超过1秒触发重击。

示例图

[On Hit Enemy] → [Delay (Duration=0.3)] → [Print "Hit Pause"]

注意事项

  • 延迟是基于游戏世界时间,受时间膨胀(Dilation)影响。若需要不受时间膨胀影响的延迟,使用 Delay (Real Time) 节点。
  • 大量短延迟(如每帧延迟)可能影响性能,优先使用 TimerTick 事件。
  • 对象被销毁时,尚未完成的延迟将自动取消(不会触发 Completed)。

Do Once

节点名称Do Once 功能:限制执行流只触发一次,后续调用被忽略,直到被重置。

输入引脚

  • Exec(执行):尝试触发。只有首次调用会继续输出。
  • Reset(执行):重置内部状态,使下一次 Exec 又可触发。

输出引脚

  • Completed(执行):当 Exec 第一次(且仅第一次)传入时触发。
  • Closed(执行):当 Exec 在已执行过后再次传入时触发(可选,需在节点上右键勾选 Show Closed Output)。

典型用法

  • 角色第一次进入触发器时播放欢迎语音,后续进入不再播放。
  • 自动存档:游戏开始时只执行一次“检查存档”逻辑。
  • 一次性奖励:玩家第一次完成成就时给予奖励。

示例图

[On Trigger Enter] → [Do Once] → [Completed] → [Print "First Entry"] → [Closed] → (忽略) [Reset Game] → [Do Once Reset] // 重置后再次进入可重新触发

注意事项

  • Do Once 的状态在蓝图实例生命周期内持久。若需要全局只执行一次(跨关卡),考虑使用 GameInstance 存储标志。
  • 可通过 Reset 引脚实现重复使用(如检查点重置后允许再次触发)。

For Loop

节点名称For Loop 功能:从起始索引到结束索引循环执行(包含两端),每次循环输出当前索引值。

输入引脚

  • Exec(执行):启动循环。
  • First Index(整数):循环开始的索引值。
  • Last Index(整数):循环结束的索引值。

输出引脚

  • Loop Body(执行):每次循环触发一次(索引从 FirstLast 递增1)。
  • Index(整数):当前循环的索引值。
  • Completed(执行):所有循环结束后触发一次。

典型用法

  • 遍历数组元素(配合 Get 节点):For Loop0Array Length - 1
  • 生成一排物体:索引作为位置偏移的倍数。
  • 执行固定次数的操作(如抽10次奖)。

示例图

[On Action] → [For Loop (First=0, Last=9)] Loop Body → [Print Index] → [Add To Array] Completed → [Print "Loop done"]

注意事项

  • 如果 First Index > Last Index,循环不会执行(直接走 Completed)。
  • 循环是顺序执行的,Loop Body 完成后再执行下一次循环(不会并行)。若在 Loop Body 中启动延迟或异步任务,需小心控制流(可使用 GateSequence 配合)。
  • 大量循环(如超过10万次)可能导致卡顿,请考虑替代方案(如 For Each Loop 使用容器迭代或并行)。

While Loop

节点名称While Loop 功能:当条件为真时重复执行循环体。注意:UE5蓝图中的 While Loop 节点不是内置基础节点,通常通过 Do WhileWhile Loop 宏实现。更常见的做法是使用 DoWhile 节点或手动构建条件循环。

标准 While Loop 特性(使用 Do While 节点近似实现):

  • 先判断条件,条件为 false 时一次都不执行。
  • 每次执行完循环体后自动判断条件,若为 true 则再次执行。

节点名称(实际可用节点):DoWhile(或自定义宏 WhileLoop输入引脚

  • Enter(执行):开始循环。
  • Condition(布尔值):每次迭代前判断(若为 false 则跳出)。

输出引脚

  • Loop Body(执行):条件为 true 时执行。
  • Completed(执行):条件为 false 或手动中断后触发。

典型用法

  • 随机生成位置直到找到一个不重叠的位置(条件:当前生成位置与已有物体重叠)。
  • 等待玩家输入有效答案(条件:输入无效 → 继续弹出输入框)。

示例图(使用 DoWhile 节点):

[StartSearch] → [DoWhile] → Loop Body → [Get Random Position] Condition (Is Position Valid?) → true → 回到 Loop Body → false → Completed

注意事项

  • 防止无限循环:务必确保循环体内能改变 Condition 所依赖的变量,并设置最大迭代次数作为安全保险。
  • UE5蓝图没有直接的 While Loop 节点,通常使用 DoWhileFor Loop 配合 Break 实现相同逻辑。DoWhile 节点至少执行一次循环体,若需要先判断条件,可在循环体开头加 Branch 节点手动实现。
  • 在事件图表中大量使用 While Loop 可能导致帧冻结,非紧急情况下建议改用 TimerTick 分散处理。

序列 (Sequence)

节点名称Sequence 功能:按固定顺序依次触发多个输出引脚。所有输出引脚都会被执行,但严格按照引脚编号顺序(0→1→2→…)。

输入引脚

  • Exec(执行):启动序列。

输出引脚

  • Then 0Then 1Then 2 … :依次触发的执行引脚。引脚数量可右键添加/减少。

典型用法

  • 同时播放音效、特效、改变变量但需要明确顺序:例如先更新血量UI,再播放受伤音效,最后生成特效。
  • 简化连线,避免多个节点串成链条后难以阅读。

示例图

[On Damage Taken] → [Sequence] → Then 0 → [Update HealthBar] → Then 1 → [Play Hurt Sound] → Then 2 → [Spawn BloodEffect]

注意事项

  • 每个 Then 输出会等待上一个引脚执行完所有逻辑后才触发下一个(包括该引脚分支中的所有节点)。即使上一个引脚触发了一个延迟,也会等待延迟完成?不会Sequence 只保证执行顺序的开始,但不等待异步操作(如 Delay)。如果 Then 0 中有一个延迟2秒,Then 1 不会等2秒,而是在 Then 0 的延迟节点被触发后立即执行 Then 1。若需要严格顺序等待异步,需手动链式调用。
  • 如果多个 Then 引脚之间没有数据依赖,它们仍然按顺序执行,但时间上几乎是同时完成的(除了可能的计算开销)。
  • 推荐用于组织清晰、无等待要求的顺序逻辑。

练习:

打印字典中的key,value

1759248420755

选择

玩家在游戏的过程中可能需要在不同条件下获取不同的数值,或者执行不同的内容,这种功

能通过“选择”和“switch on"两种节点即可快速实现。

select

(当index选中时,打印20,不选中时,打印10)

1759373358140

switch on

1759379967380

1759380188972