虚幻引擎节点 Branch (If) 介绍

在虚幻引擎5中,Branch (If) 节点是蓝图视觉脚本中最基础、也是最核心的条件判断工具。它相当于传统编程语言中的 if-else 语句,根据一个布尔值(True 或 False)来决定程序的执行路径

🔎 Branch节点核心基础

核心概念 详细解释与示例
功能 输入一个布尔值,如果为 True,则执行 True 引脚后的逻辑;如果为 False,则执行 False 引脚后的逻辑
创建方式 蓝图中节点主要用于流程控制,可按快捷键 B + 鼠标左键快速生成
输入引脚 In: 执行入口,触发判断;Condition: 布尔值(Bool),用来决定执行哪个分支的关键,通常是变量、比较、或逻辑运算的结果。
输出引脚 True: Condition 为 True 时的执行出口;False: Condition 为 False 时的执行出口。

💔 案例一:角色生命周期管理(血量系统)

1. 在角色蓝图中创建血量变量

  • 打开角色蓝图(例如 ThirdPersonCharacter

  • 在 My Blueprint 面板中点击 Variables 旁边的 + 号

  • 将变量命名为 Health,类型选择 Float

  • 在 Details 面板中将 Default Value 设为 100.0

  • 点击 Compile 按钮保存

2. 创建伤害事件

  • 在 Event Graph 中右键 → 搜索并添加 Add Custom Event 节点

  • 命名为 TakeDamage

  • 点击该节点右侧的 + 图标,添加一个输入参数:命名为 DamageAmount,类型为 Float

3. 处理血量和死亡判断

  • 从 TakeDamage 的执行引脚拖出,添加一个 Float – Float 节点

  • 将 Health 变量的 GET 节点连接到第一个输入端,DamageAmount 连接到第二个输入端

  • 将减法结果连接到 SET Health 节点(使用 Alt + 拖拽 Health 变量创建 SET 节点)

  • 从 SET Health 节点拖出执行引脚,添加 Branch 节点

  • 将 <= 比较节点连接到 Branch 的 Condition 引脚

  • 比较:左侧输入端 = Health 变量的 GET 节点,右侧输入端 = 0.0

4. 实现死亡逻辑

  • 创建 Add Custom Event 命名为 PlayerDeath

  • 在 PlayerDeath 中拖入角色的 Mesh 组件

  • 从 Mesh 拖出,搜索并添加 Set Simulate Physics 节点,勾选 New Simulate Physics

  • 从 Mesh 拖出,搜索并添加 Set Collision Profile Name 节点,在 New Collision Profile Name 中输入 Ragdoll

  • 最后添加 Disable Input 节点,将角色控制器连接到 Player Controller 输入

  • 将 Branch 的 True 引脚连接到 PlayerDeath 事件

5. 在伤害源(如 Smasher)中调用伤害

  • 在伤害源角色的蓝图中,添加 Box Collision 组件

  • 在 Details 面板中勾选 Generate Overlap Events

  • 选中 Box 组件 → 右键 → Add Event → Add OnComponentBeginOverlap

  • 从该节点拖出,添加 Cast To ThirdPersonCharacter(角色蓝图类名)

  • 从 As ThirdPersonCharacter 引脚拖出,搜索 TakeDamage 自定义事件并调用

  • 将 DamageAmount 值设为伤害数值(例如 50.0

🔑 案例二:交互系统(有钥匙才能开门)

1. 在玩家角色蓝图中添加钥匙变量

  • 打开玩家角色蓝图

  • 在 My Blueprint → Variables 中添加变量 bHasKey,类型 Boolean

  • 也可添加 KeyCount 变量,类型 Integer

  • 设置默认值(例如 KeyCount = 0

2. 在门蓝图中设置碰撞触发器

  • 打开门蓝图,选择一个 Static Mesh 作为门体

  • 在组件面板中添加 Box Collision 作为交互触发器,调整大小覆盖门前区域

  • 在 Details 面板中确保 Generate Overlap Events 已勾选

  • 选中 Box Collision 组件 → 右键 → Add Event → Add OnComponentBeginOverlap

3. 实现交互检测

  • 在 OnComponentBeginOverlap 节点后添加 Cast To [YourCharacterClass]

  • 从 As Character 引脚拖出,使用 GET 节点获取玩家角色变量 bHasKey

  • 将该布尔值连接到 Branch 节点的 Condition 引脚

4. 执行开门或拒绝逻辑

  • True 引脚:执行开门动画/操作

    • 添加 Timeline 节点控制门旋转

    • 添加 Play Animation 等开门效果

  • False 引脚:播放拒绝交互的音效或提示

    • 添加 Play Sound at Location 播放 “Door Locked” 声音

    • 或者添加 Print String 输出提示文本

🏃 案例三:耐力消耗系统

1. 创建耐力变量

  • 打开玩家角色蓝图(如 BP_ThirdPersonCharacter

  • 在 My Blueprint → Variables 中添加 CurrentStamina 类型 Float

  • 添加 MaxStamina 类型 Float,默认值设为 100.0

  • 在 Event BeginPlay 中使用 SET CurrentStamina 将初始值设为 MaxStamina

2. 在跳跃时添加耐力检查

  • 找到现有的跳跃输入事件(通常是 Jump 动作)

  • 在 Jump 事件的执行引脚后,添加 Branch 节点

  • 创建 >= 比较节点:左侧 = CurrentStamina,右侧 = 跳跃消耗值(例如 10.0

  • 将该比较结果连接到 Branch 的 Condition 引脚

3. 分支处理

  • True 引脚

    • 创建减法运算:CurrentStamina = CurrentStamina - 10.0

    • 使用 SET CurrentStamina 节点更新变量

    • 将执行流连接到原有的 Launch Character 跳跃逻辑

  • False 引脚

    • 添加 Print String 节点,输出 “Stamina不足,无法跳跃”

    • 或者添加 Play Sound at Location 播放失败音效

4. (进阶)将耐力检查封装为宏

  • 在 My Blueprint 面板中点击 Add Macro 按钮,命名如 CheckStamina

  • 在宏的 Details 面板中添加:Inputs → BeginCheck (Exec 类型);Outputs → OnSuccess 和 OnFailure (Exec 类型)

  • 在宏图表中构建上述耐力检查逻辑,将成功和失败分别连到对应的输出执行引脚

  • 在主事件图表中,可以直接调用宏来复用逻辑

🔫 案例四:弹药管理系统

1. 创建弹药变量

  • 打开武器蓝图或玩家角色蓝图

  • 添加变量:

    • CurrentAmmo 类型 Integer,默认值设为弹匣容量(如 30

    • MaxAmmo 类型 Integer,默认值设为最大弹药量(如 120

    • ReserveAmmo 类型 Integer(备用弹药),默认值设为 90

2. 在射击时实现弹药检查

  • 找到射击输入事件(如 Fire 动作)

  • 在事件执行引脚后添加 Branch 节点

  • 创建 >= 比较节点:左侧 = CurrentAmmo 的 GET 节点,右侧 = 1

  • 连接该比较结果到 Branch 的 Condition

3. 分支处理

  • True 引脚

    • 执行射击逻辑(生成子弹、播放动画、音效、后坐力等)

    • 创建减法运算:CurrentAmmo - 1

    • 使用 SET CurrentAmmo 更新变量

  • False 引脚

    • 播放空枪音效 “Click”

    • 可以触发自动装填或显示弹药不足 UI 提示

4. 实现装填功能

  • 创建 Reload 自定义事件或输入处理

  • 检查 ReserveAmmo 是否大于 0,且 CurrentAmmo 是否小于 MaxAmmo(使用 AND Boolean 组合两个条件)

  • 计算需要装填的数量 = Min(ReserveAmmo, MaxAmmo - CurrentAmmo)

  • 更新:

    • CurrentAmmo = CurrentAmmo + 需要装填的数量

    • ReserveAmmo = ReserveAmmo - 需要装填的数量

5. 添加弹药拾取

  • 创建可拾取的弹药物品蓝图

  • 添加 Box Collision 组件并设置 Generate Overlap Events

  • 添加 OnComponentBeginOverlap 事件

  • 进行 Cast To Character 检测

  • True 分支:增加弹药变量(注意检查上限),然后 DestroyActor

  • False 分支:无操作,弹药保持存在

🔛 案例五:开关门和一次性宝箱

场景 A:开关门(状态切换)

1. 创建门蓝图和状态变量

  • 创建新蓝图类,父类选择 Actor,命名为 BP_Door

  • 添加 Static Mesh 组件作为门体,再添加 Box Collision 作为交互触发器

  • 在 My Blueprint → Variables 中添加 Boolean 变量 bIsOpen,默认值设为 False

2. 设置交互触发

  • 确保在项目输入设置中已定义交互键(如 E 或 F

  • 在门蓝图中添加 InputAction 交互事件(需要在玩家控制器蓝图中处理交互检测并调用门上的接口/事件)

  • 交互事件的执行引脚后添加 Branch 节点

  • 将 bIsOpen 变量的 GET 节点连接到 Branch 的 Condition

3. 分支执行打开/关闭

  • True 引脚(门当前是开的 → 关闭门):

    • 执行关门动画/逻辑

    • 使用 SET bIsOpen 节点设为 False

  • False 引脚(门当前是关的 → 打开门):

    • 执行开门动画/逻辑

    • 使用 SET bIsOpen 节点设为 True

4. 添加距离检测(高级)

  • 在交互事件中使用 Get Player Pawn 获取玩家位置

  • 使用 Vector Distance 计算玩家与门的距离

  • 创建 < 比较节点,阈值设为交互距离(如 200.0

  • 将比较结果与 bIsOpen 状态组合使用

  • 使用 AND Boolean 节点将多个条件合并为一个布尔值,送入 Branch 的 Condition

场景 B:一次性宝箱

1. 创建宝箱蓝图和状态变量

  • 创建新蓝图,命名为 BP_TreasureChest

  • 添加两个 Static Mesh 组件(宝箱底 Chest_Bottom 和宝箱盖 Chest_Top

  • 添加 Box Collision 覆盖宝箱范围,设置 Generate Overlap Events

  • 在 Variables 中添加 Boolean 变量 bIsOpened,默认值设为 False

2. 配置宝箱属性

  • 如需生成随机奖励,添加 Integer 或 Float 类型变量,默认值设为具体数值

  • 通过 EditCondition 让奖励在编辑器中可调节

3. 设置交互和开箱逻辑

  • 在 Box Collision 上添加 OnComponentBeginOverlap 事件

  • 添加 Cast To [PlayerCharacter] 确认触发者是玩家

  • 从 Branch 节点的 Condition 引脚拖出,读取 bIsOpened 变量的 GET 值

  • False 分支(未打开):给予奖励 → 播放开启动画 → 将 bIsOpened 设为 True

  • True 分支(已打开):播放”宝箱已空”音效,不给予额外奖励

🧩 案例六:组合条件判断

使用 AND 逻辑

  • 在需要组合多个布尔值的节点处添加 AND Boolean 节点

  • 点击 AND Boolean 节点右下角的 + 号添加额外的输入引脚

  • 将所有需要满足的条件分别连接到各个输入引脚

  • 将 AND Boolean 的输出连接到 Branch 的 Condition 引脚

  • 只有当所有输入条件均为 True 时,AND 才会输出 True

  • 例如:玩家有钥匙 AND 玩家站在门前 AND 游戏未暂停,才能开门

使用 OR 逻辑

  • 添加 OR Boolean 节点,同样可以通过 + 添加多个输入引脚

  • 将任意需要满足的条件分别连接到输入引脚

  • 将 OR Boolean 的输出连接到 Branch 的 Condition 引脚

  • 只要满足任意一个条件,OR 就会输出 True

  • 例如:按 W 键 OR 按上箭头键,角色向前移动

使用 NOT 逻辑

  • 添加 NOT Boolean 节点

  • 将需要取反的条件连接到它的输入

  • 将 NOT 的输出连接到 Branch 的 Condition

  • True 变 FalseFalse 变 True

  • 例如:玩家 NOT 处于蹲伏状态(bIsCrouching 为 False),才允许冲刺

使用 Sequence 顺序执行

  • 添加 Sequence 节点

  • 点击 + 号可以添加多个输出执行引脚(Then 0Then 1Then 2…)

  • 将需要按顺序执行的逻辑分别连接到对应的输出引脚

  • Sequence 会按照引脚索引顺序依次执行,无论上一个分支是否执行完毕(并行执行)

  • 如果需要严格等待上一个分支执行完毕,使用多个独立的执行链或者使用 Delay 节点强制延迟

🔄 案例七:Branch 的变体 – Switch 节点

Switch on Int

1. 创建枚举或直接使用整型

  • 添加 Integer 变量 WeaponType,用数字代表武器状态:0 = 未装备、1 = 手枪、2 = 步枪、3 = 霰弹枪

2. 添加 Switch on Int 节点

  • 在图表中右键搜索 Switch on Int 并添加

  • 默认只有 Default 输出引脚

  • 选中该节点,在 Details 面板中设置 Start Index(起始索引)为 0

  • 点击节点上的 Add Pin 按钮添加输出引脚,每次点击会按顺序添加下一个数字的引脚(0、1、2、3…)

3. 连接逻辑

  • 将需要根据整型值分支的输入值(如 WeaponType)连接到 Switch on Int 的 Selection 输入

  • 将执行触发连接到 Switch on Int 的输入执行引脚

  • 将 0 引脚连接到”未装备”的逻辑、1 引脚连接到”手枪”逻辑、2 引脚连接到”步枪”逻辑等

  • Default 引脚仅在输入值与任何已定义引脚均不匹配时触发,建议保留处理异常情况

4. 移除不需要的引脚

  • 如需删除某个引脚,右键点击该引脚 → 选择 Remove Execution Pin

Switch on Enum

1. 创建枚举

  • 在 Content Browser 中右键 → Miscellaneous → Enumeration

  • 命名为 EDoorState

  • 添加条目:ClosedOpeningOpenClosing

2. 添加 Switch on Enum 节点

  • 在图表中右键搜索 Switch on Enum 并添加,选择创建的枚举类型

  • Switch on Enum 会自动为枚举中的每个值生成对应的输出引脚,无需手动添加

  • 无需担心忘记处理枚举值

3. 连接逻辑

  • 将 DoorState 枚举变量连接到 Selection

  • 执行触发时,Switch on Enum 会根据当前枚举值执行对应分支

  • 依次连接 Closed → 关门的动画/逻辑,Opening → 正在打开的逻辑,Open → 门已保持打开的逻辑,Closing → 正在关闭的逻辑

Switch on String(用于动态对话选项)

1. 添加 Switch on String

  • 在图表中右键搜索 Switch on String 并添加

  • 默认只有 Default 输出引脚

  • 选中节点,在 Details 面板中找到 Pin Names 数组

  • 点击 + 号添加引脚名称,输入需要匹配的字符串(如 "Greeting""Farewell""Help"

2. 连接逻辑

  • 将用于选择的字符串变量(如 DialogueOption)连接到 Selection

  • 根据每个字符串引脚连接不同的对话响应逻辑

  • Default 引脚处理未知或无效的对话选项

💡 高级技巧与优化:调试和性能

断点调试

  • 在图表中右键单击任意节点(如 BranchSet Health 等)

  • 从上下文菜单中选择 Add Breakpoint(添加断点)

  • 添加断点后,节点左上角会显示红色的实心八边形图标

  • 运行游戏(Play In Editor)并执行到该节点时,编辑器将自动暂停并高亮该节点

  • 此时可查看当前时刻所有变量的值,检查逻辑是否符合预期

  • 右键断点节点可 Disable Breakpoint(暂时禁用,显示为八边形轮廓)或 Remove Breakpoint

观察变量

  • 调试暂停时,右键点击蓝图图表中任意变量引脚的名称

  • 选择 Watch this value(观察此值)

  • 在 Blueprint Debugger 窗口中可以持续追踪该变量的变化

性能优化 – 替代 Event Tick

  • 避免在 Event Tick 中使用昂贵的 Branch 逻辑,Event Tick 每帧都执行,性能开销极大

  • 使用 Timer 替代 Tick:添加 Set Timer by Event 节点,设置循环执行间隔(如 0.1 秒),将分支逻辑放到 Timer 事件中

  • 仅在条件满足时执行 Tick 逻辑:使用 Branch + Gate 节点,在开始时关闭 Gate,仅在需要的条件下打开 Gate 接收执行

  • 使用 Bind Event 替代 Tick 轮询:只在特定事件触发时执行逻辑(如 OnComponentBeginOverlap),而不是每帧检查

  • 优化原则:如果逻辑不需要每帧都运行,就不要放在 Event Tick 中

蓝图开发规范

  • 为关键节点添加 Comment 文本说明(框选节点后右键 → Create Comment)

  • 保持图表连线整洁,避免过长、交叉的连线

  • 多使用 Collapsed Graphs 或 Functions 来封装复杂逻辑,提高可读性和复用性

  • 养成 Compile(编译)和 Save(保存)的习惯

以上便是七个案例在 UE5 编辑器中的详细操作步骤。通过这些具体实践,可以有效掌握 Branch 节点在不同游戏机制中的应用。

感谢您的来访,获取更多精彩文章请收藏本站。

THE END
喜欢就支持一下吧
点赞11 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容