蓝图间通信是一个复杂关卡能否正常运行的关键,笔者在这里提供几种蓝图类之间的信息交互方法,希望能对读者有所帮助。

1.类引用

这是最直接的一种蓝图类之间的信息交互方式。首先在Editor中创建2个Actor蓝图类,分别命名为TargetActor和ControllerActor,双击打开TargetActor编辑器,将组件窗口中的DefaultSceneRoot替换成Cube,并设置成Movable,编译后保存退出,然后打开ControllerActor,将组件窗口中的DefaultSceneRoot替换成Sphere,新建变量Actor,类型为Actor引用,将其设为公共变量。返回关卡编辑器中,将2个Actor拖放进场景中

点击ControllerActor,在Details面板中可以看到Default选项将Actor设为TargetActor或者点击右侧的针状标记,然后选中场景中的TargetActor

返回ControllerActor编辑器中,添加一个Event Tick事件

运行关卡后可以看到TargetActor在不断地上升,说明在ControllerActor蓝图类中的逻辑成功地运行了,两个蓝图类之间完成了信息交互。

2.Get All Actors of Class

Get All Actors of Class是一种整体上的调用,首先在TargetActor的事件图表中封装一个函数命名为AddOffset

函数逻辑如下所示,是一个简单的物体移动操作。

然后在关卡蓝图中添加一个F按键驱动事件

可以看到Get All Actors of Class得到的输出结果是一个数组,它包含了在关卡场景中所有存在的同种类蓝图。运行关卡后按F键测试时可以看到TargetActor垂直向上移动,如果在场景中拖放2个或者更多个TargetActor,可以看到所有的Actor都会垂直向上移动,如果只想让其中的某个或某几个Actor进行这种移动,可以对输出数组进行选择。

3.接口调用

UE4的接口调用技术有点简单粗暴,而且主要体现在主蓝图对子蓝图的信息通信。

在内容浏览器中添加一个蓝图接口,命名为TestInterface

双击打开接口,直接使用其创建时自带的一个接口函数,将其重命名为TestAddOffset

(这里相当于接口的函数定义),新增一个函数输入命名为Offset,类型为Vector。

在关卡蓝图中将ClassSettings的Interfaces添加刚才创建的TestInterface

添加F按键驱动事件

在Get All Actors with Interface中将Interface设置为TestInterface,然后查找TestAddOffset函数(注意这里是调用Message,相当于发送一个调用接口中特定函数的请求),这里随意设置一个Offset值作为物体的移动距离。

返回TargetActor的蓝图中进行同样的设置,然后调用Event TestAddOffset(这里相当于接口的函数实现),进行逻辑编写

完成后运行关卡,可以发现F键运行正常。

读者可以发现一个现象,TestAddOffset事件只可以在子蓝图(像TargetActor,ControllerActor,甚至控制器PlayerController)中调用,但就是无法在关卡蓝图中调用,而调用接口函数的信息方法Get All Actors with Interface则可以在任意蓝图中使用(前提是蓝图中的ClassSettings中添加了该接口),用一个形象化的比喻就像上级领导或同事之间可以命令其去帮你办事,但下属是没有权利命令上级领导的。

4.事件调度

事件调度是一个比较简便的方法,主要在于区分调度者和被调度者。

一般在调度者蓝图中定义事件调度器。打开ControllerActor蓝图编辑器,添加一个事件调度,命名为OffsetTest

为了便于理解事件调度器是如何工作的,这里给Offset添加一个Vector输入,命名为NewOffset

在事件图表中添加1按键驱动,将OffsetTest拖入事件图表中,选择call选项,并设置NewOffset的值,之后连线编译。

这里的1按键驱动在常规情况下是不会被响应的,所以需要额外的操作,让控制器在事件开始时给予这个蓝图允许输入权限就行了

接下来进入TargetActor蓝图中,进行事件的绑定

这里可以理解为在事件开始时通过全局搜索到Offset事件调度器的绑定选项,然后从Event节点绑定一个自定义事件,该事件的输出就是事件调度器在ControllerActor事件图表里定义的输出内容,之后进行物体的移动,整个逻辑就完成了。

运行关卡后按1键可以看到物体正常移动了。

以上就是笔者所知道的所有蓝图通信的方法了,欢迎读者进行完善补充!