banner
YZ

周周的Wiki

种一棵树最好的时间是十年前,其次是现在。
zhihu
github
csdn

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

Actor 通信介绍#

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

Actor 通信方法表:

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

通信方法演示#

准备工作#

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

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

直接通信#

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

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

  2. 添加静态材质
    双击打开 BP_Cube-- 在左边组件窗口点击添加 -- 搜索并选择立方体(Cube)。
    image.png

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

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

  5. 给第三人称蓝图 BP_ThirdPersonCharacter 添加按键事件
    在内容菜单搜索 BP_ThirdPersonCharacter 并双击打开 -- 在蓝图空白处右键搜索数字按键 0 事件(Keyboard Events节点)。
    image.png
    Pressed引脚拖出一根线松开搜索Get Actor Of Class节点 -- 在引脚Actor Class点击下拉框搜索并选择 BP_Cube-- 连接Flip Flop节点 -- 从 return value 引脚处拖出显连接 On Cube Visible 函数。具体连接图如下:
    image.png

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

类型转换通信#

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

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

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

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

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

  5. 运行测试,靠近 Cube 时旋转 ,远离时停止旋转。
    rotate.gif

事件分发器通信#

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

  1. 编写一个持有事件分发器的 Actor
    在内容菜单新建一个 Actor 类型的蓝图类 -- 命令为 BP_EeventActor-- 添加一个 Box 组件 -- 并在我的蓝图中事件分发器一栏添加 + 号 -- 添加事件分发器并命名为 OnBoxEvent-- 在事件图表中添加 On Component Begin Overlay 事件 -- 将事件分发器拖拽到图表中选择调用,连接图如下:
    image.png
    编译保存,并将其放进场景中任意位置
    image.png
  2. 创建第一个事件接收器 Actor--BP_CircularReceive
    编写蓝图逻辑,将四个 QuarterCylinder 隐藏。
    添加一个变量命名为 EventActor 在细节面板设置变量类型为 BP_EevntActor, 并设置为公开变量 -- 添加一个变量命名为 CylinderList,在细节面板设置变量类型为 Static Mesh Actor(数组类型),并设置为公开。-- 在 EvenActor 变量细节面板事件栏下添加 On Box Event 右边的 + 号,开始编写逻辑:
    image.png
    将 BP_CircularReceive 拖放到场景中,在细节面板分别赋值变量的引用:
    image.png
  3. 编写第二个事件接收器 Actor--BP_ExplosionActor
    在内容菜单里搜索Blueprint_Effect_Explosion,将其复制到自己定义的文件夹中并命名为 BP_ExplosionActor-- 将其拖到场景中圆柱的位置,稍微调整一下位置让在圆柱中间。同上一步一样添加变量 Eventor,将其事件完善,这里是启用爆炸效果。
    image.png
    还需要将两个子组件 P_Explosion 和 ExplosionAudio 的激活属性 Auto Activate 取消勾选。最后将其放置场景中并设置变量引用:
    image.png
  4. 测试事件分发器效果
    event.gif

接口通信#

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

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

  1. 创建接口
    右键目录空白处创建蓝图接口类
    image.png
    双击打开添加函数命名为 Interaction
    image.png
  2. 创建可交互开关的灯
    在内容菜单搜索Blueprint_CeilingLight将其复制到自定义的目录,并重命名为 BP_Light-- 将其放置到场景中。
    双击打开蓝图点击类设置添加接口 BPI_Interaction,编译保存后再我的蓝图接口栏下右击 Interaction 接口选择实现事件可以看到 Event Interaction 节点自动添加到蓝图中。
    image.png
    编写交替开关灯的逻辑:
    image.png
  3. 创建可交互的球体
    新建一个 Actor 蓝图类命名为 BP_Sphere,添加一个球体组件,同第 2 步一样添加接口 Interaction 并实现切换材质的逻辑:
    image.png
  4. 修改玩家蓝图并测试接口事件
    找到蓝图 BP_ThirdPersonCharacter,在其 OnComponent Begin Overlap 事件中添加执行节点 Interaction (Message)。
    image.png
    编译保存并运行:
    interface.gif

总结#

  1. 直接通信

    • 适用于简单的场景,当你需要直接与特定的 Actor 交互时非常有效。需要确保你有正确的引用。
  2. 类型转换

    • 当你需要访问特定类的功能或属性时,类型转换是一个很好的选择。它允许你在运行时验证和访问 Actor 的特定功能。
  3. 事件分发器

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

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

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

加载中...
此文章数据所有权由区块链加密技术和智能合约保障仅归创作者所有。