虚幻四基础:蓝图之间的通信

时间:2024-04-07 20:40:11

太久没写了,中间去了趟成都找女朋友玩,罪过罪过。

首先创建一个Actor控件,也就是默认的带有三维坐标的白色小球,可以设置形状。然后将这个控件拖入到关卡蓝图里。

虚幻四基础:蓝图之间的通信
比如要实现一个打印当前类名字的功能:
Custom Event:自定义一个函数:连接到Print String。
然后Get Display Name获取当前类的名字,连接到Get Class获取Self自己的类。然后连到Event BeginPlay。就可以实现这样的功能。
然而这个功能并不是从外部调用的,而是内部实现的。所以要尝试从蓝图通信,从外部调用这个功能:

实例访问

虚幻四基础:蓝图之间的通信
虚幻四基础:蓝图之间的通信
首先打开关卡蓝图,里面会有一个已经放置好的Event BeginPlay,在里面可以直接创建一个实例
虚幻四基础:蓝图之间的通信

刚才创建的自定义的Actor名为TaskActor,这里可以直接创建出来。
虚幻四基础:蓝图之间的通信
然后就可以实现同样的功能。
那么两个Actor之间如何实现通信呢:
虚幻四基础:蓝图之间的通信
这里再创建一个Actor,ctrl C,ctrl V。
首先是比较常用的方式:
在TaskActorB的蓝图中,调出Get All Actors Of Class,可以遍历所有的Actors。
虚幻四基础:蓝图之间的通信
如图:Get All Actors of Class的紫色引脚Actor Class中,可以选择到Task Actor A。

管理模式访问

这种模式在实际应用中使用的非常多:
在Task Actor B中,通过SpawnActor Task Actor A生成一个Task Actor A类,然后使用GetActorTransform,Value Scale相同,Rotation相同,Location乘以一个系数,防止生成后重叠。这样可以通过B来管理A:
但是要注意,两方是一个包含关系,不能互相包含,这样会造成高维护成本。
虚幻四基础:蓝图之间的通信
在最后,可以通过Destroy Actor结束这个过程。其中Task A是使用Set A保存好的方法,可以直接调用。
虚幻四基础:蓝图之间的通信

蓝图接口访问

蓝图中的接口比较抽象,可以类比C++的接口来理解:
接口在C++的实现方式,就是纯虚函数。
在UE4中,接口在这里:
虚幻四基础:蓝图之间的通信
Blueprint Interface,打开之后可以在右上角的Functions创建方法,可以自定义Input和Output。假如我们创建了一个方法叫Print F
虚幻四基础:蓝图之间的通信
在ClassSetting中可以在Interface中点Add,可以找到之前在BP中自己定义的接口My Interface,然后在Event Graph里,可以找到Event Print F,连接一个Print String进行打印。

但是在蓝图中,不是父类对象,仍然可以调用子类的接口。

UMG和蓝图之间的访问

HUD掌管所有客户端界面的显示,因此所有的实例化都放在HUD里。首先创建一个UMG,不要在关卡蓝图中进行实例化,而是在HUD里进行实例化。
虚幻四基础:蓝图之间的通信
在Level中创建一个HUD,在HUD中创建实例。
虚幻四基础:蓝图之间的通信
不能通过UMG对Acotr,Pawn进行访问,而是通过PlayerController进行管理。获取HUD时也要通过Get Player Controller进行访问HUD,不能通过widget进行访问。因为服务器端没有副本。
虚幻四基础:蓝图之间的通信