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

804 阅读3分钟

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

前言

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

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

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

步骤

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

  • UECPPGameModeBase.h
// 构建动态代理类型,注意 F 开头,注意分号结尾,我构建的是无参数代理
DECLARE_DYNAMIC_MULTICAST_DELEGATE(FGMDynMulDelegate);

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

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

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

  • UECPPGameModeBase.h
UPROPERTY(BlueprintAssignable)
FGMDynMulDelegate OnGmDynMulDelegate;

注意 标记宏不能缺失

03. 蓝图中绑定

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

  • 图一

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

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

04. 在 C++ 中执行多播调用

  • UECPPGameModeBase.cpp
// 在函数域中添加代码,并且保证程序能执行到
if(OnGmDynMulDelegate.IsBound()) // 检查是否存在有效绑定
{
    OnGmDynMulDelegate.Broadcast();
}

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

总结

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

UE 版本 4.19.2