UE4在C++中实现多播通知到蓝图(动态代理应用)

前言

代理是UE提供给开发者非常方便的完成监听者设计模式的礼物。官方对于代理的描述是用于方便的构建函数回调通知的便捷入口,分为单播,多播,动态多播,和事件。基本符合常规的代理设计方式。UE用非常巧妙的设计,为C++构建了代理模式。在C++中完成多播是非常简单的,而在开发中,我们经常会有需求将多播绑定到蓝图中,然后由C++完成调用,通知到蓝图中。本文将阐述操作过程。

C++和蓝图的通信是基于序列化对象基础上完成的,在UBT和UHT的帮助下,UE将C++和蓝图进行了高度的整合。但是无论如何整合,对于C++而言,本身需要编译成机器码,而蓝图更像是解释性语言(C#,java),所以如果想要完成C++通知到蓝图,必然需要用到序列化操作。

代理中,只有动态代理支持序列化,所以如果需要完成操作必须使用动态代理进行构建(动态单播无法绑定到蓝图中,只能使用动态多播)。

 

步骤

01.构建动态代理(动态多播代理)

//构建动态代理类型,注意F开头,注意分后结尾,我构建的是无参数代理

DECLARE_DYNAMIC_MULTICAST_DELEGATE(FGMDynMulDelegate);

构建过程注意类型需要用F开头,宏结尾分号。由于需要和蓝图进行通信,所以此操作构建的是数据类型。数据类型想要序列化需要使用F开头。

动态多播代理无法使用带有返回值的函数进行构建,但动态单播可以

 

02.在类内部声明动态代理对象

UPROPERTY(BlueprintAssignable)
FGMDynMulDelegate OnGmDynMulDelegate;

注意标记宏不能缺失

 

 

03.蓝图中绑定

在蓝图中持有对象,然后即可绑定,我的测试代码均放到了GameMode中,所以我将通知操作绑定到了关卡蓝图中,连线方式参照下图

图一

 

此蓝图是关卡蓝图,将GameMode设置给当前关卡!在开始时转换当前GM到CPP中的GM类型,即可使用绑定操作Bind Event to OnGmDynMulDelegate

并且获取到了Unbind操作节点,请自行阅读。

 

 

04.在CPP中执行多播调用

//在函数域中添加代码,并且保证程序能执行到

if (OnGmDynMulDelegate.IsBound())//检查是否存在有效绑定
{
OnGmDynMulDelegate.Broadcast();
}

编译工程,完成后启动工程,运行函数,查看绑定事件是否可以完成通知。

 

总结:

  1. 保证动态代理声明类型F开头,操作宏分号结尾
  2. 在代理对象上加入标记宏UPROPERTY(BlueprintAssignable)
  3. 只能使用动态多播和蓝图进行通信构建,不要使用动态单播

 

 

UE版本 4.19.2

 

 

3 条评论

添加评论

您的邮箱地址不会被公开。 必填项已用 * 标注