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 之间的交互,构建复杂的游戏逻辑。选择合适的通信方式能够提升代码的可读性和可维护性,使得项目更加模块化。