虚幻引擎游戏玩法：探索 Actor 之间的高效通信与交互技巧

Actor 通信介绍

Actor 类似于 Unity 中的空物体 GameObject，一种可以随意放置到场景中的游戏对象。UE 提供了多种供不同 Actor 之间通信的方法，本文将通过搭建 Demo 来演示以下表格中四种通信方法的要求和常见用法。

Actor 通信方法表：

通信方法 | 使用场景 | 前提条件 | 示例
直接通信 | 需要调用关卡中某一 Actor 的方法 | 需要引用关卡中的 Actor | 在关卡中的特定 Actor 上触发事件。
类型转换 | 希望验证 Actor 是否属于特定类，以便访问其属性。 | 需要引用关卡中的 Actor 以类型转换到所需的 Actor 类。 | 访问属于同一父类的子 Actor 的特定功能。
事件分发器 | 通过一个 Actor 来触发到多个 Actor 的事件。 | 其他 Actor 需要订阅事件，以便对事件作出响应。 | 通知不同类型的 Actor：某事件已经触发。
接口 | 当你需要为不同 Actor 添加相同功能时。 | 需要引用关卡中的 Actor，并且该 Actor 需要实现接口。 | 为不同类型的 Actor 添加交互行为。

通信方法演示

准备工作

打开虚幻引擎 -- 创建新项目 -- 选择游戏 -- 第三人称游戏 -- 勾选初学者内容包。

本 Demo 使用最新虚幻引擎版本 5.4 构建。

直接通信

本示例将实现由第三人称角色 Actor 蓝图控制 Cube 的显隐来演示直接通信方法的使用。

制作 BP_Cube 蓝图
打开内容侧滑菜单 -- 在内容菜单下新建 MyBlueprints 目录 -- 右键菜单选择蓝图类 -- 选择通用下的 Actor 类 -- 命令为 BP_Cube。

添加静态材质
双击打开 BP_Cube-- 在左边组件窗口点击添加 -- 搜索并选择立方体（Cube）。

编写 BP_Cube 蓝图
在左边我们蓝图下找到函数列表 -- 点击 + 号添加一个函数 -- 命名为 OnCubeVisible-- 按住键盘 Ctrl 键 + 鼠标拖拽变量 Cube 到蓝图中 -- 从 Cube 引脚拖出一根线松开 -- 搜索并选择Set Visibility函数。

给函数添加形参
选中函数 OnCubeVisible-- 在右边细节面板输入栏点击 + 号 -- 添加布尔变量 IsVisible-- 将函数参数 Is Visible 引脚连接到 Set Visibility 的 new Visibility 处 -- 点击编译保存蓝图。

给第三人称蓝图 BP_ThirdPersonCharacter 添加按键事件
在内容菜单搜索 BP_ThirdPersonCharacter 并双击打开 -- 在蓝图空白处右键搜索数字按键 0 事件（Keyboard Events节点）。

从Pressed引脚拖出一根线松开搜索Get Actor Of Class节点 -- 在引脚Actor Class点击下拉框搜索并选择 BP_Cube-- 连接Flip Flop节点 -- 从 return value 引脚处拖出显连接 On Cube Visible 函数。具体连接图如下：

将 Actor 物体 BP_Cube 从内容菜单拖放至场景中，并运行测试。不断按下数字键盘 0 键即可

类型转换通信

本示例将实现由第三人称角色 Actor 蓝图控制 Cube 的旋转来演示类型转换通信方法的使用。
继续使用 PracticeProject 项目完成这部分工作。

在 BP_Cube 蓝图编写旋转逻辑
双击打开 BP_Cube 蓝图 -- 在变量栏添加 IsRotate 变量 -- 在事件图标找到Event Tick节点 -- 将其执行引脚拖出连接至Branch分支节点 -- 将 True 引脚连接到Add Actor Local Rotation节点 -- 将 Delta Rotation 引脚的 Z 随意输入一个值 -- 将变量 IsRotate 拖出连接至 Branch 的 Condition 节点。

最后将 IsRotate 设置为公开变量（提供其他蓝图设置）。

编写 BP_ThirdPersonCharacter 蓝图添加碰撞函数
在组件 Capsule Component 处右键选择添加事件 -- 将On Component Begin Overlay 和 On Component End Overlap函数添加到事件图表中。

编写类型转换调用逻辑
在 Begin 节点中，从Other Actor引脚拖出连接到Cast To BP_Cube节点 -- 从 As BP Cube 节点连接到Set Is Rotate节点 -- 将引脚 Is Rotate 勾选。
同理操作设置 End 节点，只不过需要将最后的 Is Rotate 引擎取消勾选。如下图

设置角色 Pawn 的碰撞预设
要使角色发生重叠碰撞，还需要将组件的碰撞预设设置栏勾选 WorldDynamic。

运行测试，靠近 Cube 时旋转 ，远离时停止旋转。

事件分发器通信

类似于 Unity 中的委托事件，全局或局部公开的一个事件分发器，由需要的脚步自由订阅，只要订阅了该事件分发器，当事件触发时，这些订阅者就能收到消息，处理各自的逻辑。

编写一个持有事件分发器的 Actor
在内容菜单新建一个 Actor 类型的蓝图类 -- 命令为 BP_EeventActor-- 添加一个 Box 组件 -- 并在我的蓝图中事件分发器一栏添加 + 号 -- 添加事件分发器并命名为 OnBoxEvent-- 在事件图表中添加 On Component Begin Overlay 事件 -- 将事件分发器拖拽到图表中选择调用，连接图如下：

编译保存，并将其放进场景中任意位置

创建第一个事件接收器 Actor--BP_CircularReceive
编写蓝图逻辑，将四个 QuarterCylinder 隐藏。
添加一个变量命名为 EventActor 在细节面板设置变量类型为 BP_EevntActor, 并设置为公开变量 -- 添加一个变量命名为 CylinderList，在细节面板设置变量类型为 Static Mesh Actor（数组类型），并设置为公开。-- 在 EvenActor 变量细节面板事件栏下添加 On Box Event 右边的 + 号，开始编写逻辑：

将 BP_CircularReceive 拖放到场景中，在细节面板分别赋值变量的引用：

编写第二个事件接收器 Actor--BP_ExplosionActor
在内容菜单里搜索Blueprint_Effect_Explosion，将其复制到自己定义的文件夹中并命名为 BP_ExplosionActor-- 将其拖到场景中圆柱的位置，稍微调整一下位置让在圆柱中间。同上一步一样添加变量 Eventor，将其事件完善，这里是启用爆炸效果。

还需要将两个子组件 P_Explosion 和 ExplosionAudio 的激活属性 Auto Activate 取消勾选。最后将其放置场景中并设置变量引用：

测试事件分发器效果

接口通信

UE5 中，Actor 接口通信是一种非常有效的设计模式，接口负责定义一系列共有的行为或功能，这些行为或功能在不同 Actor 中可以有不同的实现方法。当你为不同 Actor 实现了相同类型的功能时，适合使用此通信方法。

本例中，将实现一个简单的交互系统，通过在两个不同 Actor 间通信，学习接口的用法。

创建接口
右键目录空白处创建蓝图接口类

双击打开添加函数命名为 Interaction

创建可交互开关的灯
在内容菜单搜索Blueprint_CeilingLight将其复制到自定义的目录，并重命名为 BP_Light-- 将其放置到场景中。
双击打开蓝图点击类设置添加接口 BPI_Interaction，编译保存后再我的蓝图接口栏下右击 Interaction 接口选择实现事件可以看到 Event Interaction 节点自动添加到蓝图中。

编写交替开关灯的逻辑：

创建可交互的球体
新建一个 Actor 蓝图类命名为 BP_Sphere，添加一个球体组件，同第 2 步一样添加接口 Interaction 并实现切换材质的逻辑：

修改玩家蓝图并测试接口事件
找到蓝图 BP_ThirdPersonCharacter，在其 OnComponent Begin Overlap 事件中添加执行节点 Interaction (Message)。

编译保存并运行：

总结

直接通信：

适用于简单的场景，当你需要直接与特定的 Actor 交互时非常有效。需要确保你有正确的引用。

类型转换：

当你需要访问特定类的功能或属性时，类型转换是一个很好的选择。它允许你在运行时验证和访问 Actor 的特定功能。

事件分发器：

适合需要广播事件的场景，能够让多个 Actor 响应同一事件，增强了系统的灵活性和扩展性。

接口：

提供了一种灵活的方式为不同类型的 Actor 添加共同的功能。通过接口实现，可以减少代码重复，提高可维护性。

通过这四种通信方法，开发者可以在 Unreal Engine 中高效地管理 Actor 之间的交互，构建复杂的游戏逻辑。选择合适的通信方式能够提升代码的可读性和可维护性，使得项目更加模块化。