11-UE5的简单流程控制
分支 (Branch)
节点名称:Branch
功能:根据布尔条件选择执行两条输出路径之一,等同于 if-else 语句。
输入引脚:
Condition(布尔值):判断条件。
输出引脚:
True(执行):当Condition为true时触发。False(执行):当Condition为false时触发。
典型用法:
- 检查角色生命值是否大于0 →
True继续移动,False播放死亡动画。 - 检查射线检测是否命中 →
True处理命中逻辑,False处理未命中。
示例图:
[Begin Play] → [Branch (Condition: bIsAlive)] ├─ True → [Print "Alive"] └─ False → [Print "Dead"]
注意事项:
Condition是布尔类型,不能直接输入整数或对象,需先转换(如==、IsValid等)。- 两条分支不会同时执行,且执行顺序固定(先
True后False只是逻辑上的区分)。
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(执行):每次触发时,根据内部状态输出到A或B,并自动翻转状态。
输出引脚:
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)节点。 - 大量短延迟(如每帧延迟)可能影响性能,优先使用
Timer或Tick事件。 - 对象被销毁时,尚未完成的延迟将自动取消(不会触发
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(执行):每次循环触发一次(索引从First到Last递增1)。Index(整数):当前循环的索引值。Completed(执行):所有循环结束后触发一次。
典型用法:
- 遍历数组元素(配合
Get节点):For Loop从0到Array 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中启动延迟或异步任务,需小心控制流(可使用Gate或Sequence配合)。 - 大量循环(如超过10万次)可能导致卡顿,请考虑替代方案(如
For Each Loop使用容器迭代或并行)。
While Loop
节点名称:While Loop
功能:当条件为真时重复执行循环体。注意:UE5蓝图中的 While Loop 节点不是内置基础节点,通常通过 Do While 或 While 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节点,通常使用DoWhile或For Loop配合Break实现相同逻辑。DoWhile节点至少执行一次循环体,若需要先判断条件,可在循环体开头加Branch节点手动实现。 - 在事件图表中大量使用
While Loop可能导致帧冻结,非紧急情况下建议改用Timer或Tick分散处理。
序列 (Sequence)
节点名称:Sequence
功能:按固定顺序依次触发多个输出引脚。所有输出引脚都会被执行,但严格按照引脚编号顺序(0→1→2→…)。
输入引脚:
Exec(执行):启动序列。
输出引脚:
Then 0、Then 1、Then 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

选择
玩家在游戏的过程中可能需要在不同条件下获取不同的数值,或者执行不同的内容,这种功
能通过“选择”和“switch on"两种节点即可快速实现。
select
(当index选中时,打印20,不选中时,打印10)

switch on

