代理允许您在C++对象上以通用的但类型安全的方式调用成员函数。通过使用代理,可以将其动态地绑定到任何对象的成员函数上,然后在该对象上调用函数,即时调用者不知道该对象的类型也没关系。

任何时候都应该通过引用传递代理。

声明代理

通过使用以下提供的任何一个宏都可以声明代理。所使用的宏由要绑定到该代理上的函数的签名决定。系统预定义了各种通用函数签名的组合、可以根据这些组合声明代理类型、给返回值及参数填入需要的任何类型的类型名称。现在支持使用以下任何条件组合的代理签名:

  • 返回一个值的函数

  • 多达4个"负载" 变量

  • 多达8个函数参数

  • 声明为 'const'的函数

函数签名

声明宏

void Function()

DECLARE_DELEGATE( DelegateName )

void Function( <Param1> )

DECLARE_DELEGATE_OneParam( DelegateName, Param1Type )

void Function( <Param1>, <Param2> )

DECLARE_DELEGATE_TwoParams( DelegateName, Param1Type, Param2Type )

void Function( <Param1>, <Param2>, ... )

DECLARE_DELEGATE_<Num>Params( DelegateName, Param1Type, Param2Type, ... )

<RetVal> Function()

DECLARE_DELEGATE_RetVal( RetValType, DelegateName )

<RetVal> Function( <Param1> )

DECLARE_DELEGATE_RetVal_OneParam( RetValType, DelegateName, Param1Type )

<RetVal> Function( <Param1>, <Param2> )

DECLARE_DELEGATE_RetVal_TwoParams( RetValType, DelegateName, Param1Type, Param2Type )

<RetVal> Function( <Param1>, <Param2>, ... )

DECLARE_DELEGATE_RetVal_<Num>Params( RetValType, DelegateName, Param1Type, Param2Type, ... )

绑定代理

代理系统理解某些对象类型,且当使用这些对象时会启用附加功能。如果您把一个代理绑定到一个UObject或共享的指针类上,代理系统可以保持一个到该对象的弱引用,以便当该对象在该代理的底层被销毁了时,您可以通过调用 IsBound() 或 ExecuteIfBound() 函数处理这些情况。注意,所支持的各种对象类型有特定的绑定语法。

函数

描述

Bind()

绑定到一个现有的代理对象上。

BindRaw()

绑定到一个原始的C++指针全局函数代理上。原始指针不使用任何引用,所以如果从代理的底层删除了该对象,那么调用它可能是不安全的。因此,当调用Execute()时一定要小心!

BindSP()

绑定一个基于共享指针的成员函数代理。共享指针代理保持到您的对象的弱引用。您可以使用 ExecuteIfBound() 来调用它们。

BindUObject()

绑定一个基于UObject的成员函数代理。UObject 代理保持到您的对象的弱引用。您可以使用 ExecuteIfBound() 来调用它们。

UnBind()

解除绑定该代理。

例如我在项目中遇到的:

GM->SPState->UpdateStateWidget.BindRaw(GameHUDWidget->PlayerStateWidget.Get(), &SSIAiPlayerStateWidget::UpdateStateWidget);

PlayerStateWidget继承自SWidget

ShortcutWidget->RegisterShortCutContainer.BindUObject(GM->SPState,&ASIAiPlayerState::RegisterShortCutContainer);

SPState为APlayerState子类,最终继承自UObject,所以使用BindUObject

执行代理

绑定到代理上的函数可以通过调用代理的 Execute() 函数进行执行。在执行这些函数之前必须检查是否已经“绑定”了代理。这是为了使得代码更加安全,因为可能代理有时会具有未初始化且后续要访问的返回值及输出参数。执行一个未绑定的代理实际上有时会扰乱内存。可以调用 IsBound() 来判断执行该代理是否安全。同时,对于没有返回值的代理,您可以调用 ExecuteIfBound() 函数,但是一定要注意那些可能未初始化的输出参数。

执行函数

描述

Execute()

 

ExecuteIfBound()

 

IsBound()

转载于:https://www.cnblogs.com/lixiao24/p/9236229.html

UE4 代理 BindRaw和BindUObject相关推荐

  1. UE4代理委托(代理,动态代理,单播,多播)

    官方例子https://docs.unrealengine.com/en-us/Programming/UnrealArchitecture/Delegates 创建基于官方第三人称模版C++工程,项 ...

  2. UE4插件与编辑器Slate

    教程使用软件:Visual Studio2017 .UE4 4.20和4.19版本引擎 UE4插件与编辑器Slate源文链接 哈喽,大家好,我叫人宅,很高兴和大家分享一下我们这套教程. 我们的UE4课 ...

  3. 虚幻四如何实现第一人称_虚幻周报20200930 | 双节快乐么么哒!

    官方知乎号:虚幻引擎 搜集日期:20200921-20200927 整理编辑: 大钊,小辉辉 声明:文档搜集来自网上,难免遗漏,请联系我们投稿和添加关注.该文档版权归整理编辑者共同所有,单项内容版权归 ...

  4. UE4C++基础(二)

    基础回顾 UE4C++基础(一)_WLSTLA-CSDN博客 1. C++与UMG交互 ​ 首先我们需要设置玩家的输入模式,可以在PlayerController中的BeginPlay进行设置: vo ...

  5. UE4/UE5 代理使用介绍

    原创文章,转载请注明出处. ## 今晚北京时间晚10点,虚幻官方发布UE5,内心是五笔的机动. UE4有一套代理机制,整理了一下做个介绍.也请大家做补充. 有了代理,方便我们做代码设计,减轻耦合. 由 ...

  6. UE4 委托(代理)简单理解

    资料来源于: UE4官方文档 UE4 C++ -- 代理 UE4中的代理(Delegate)使用总结 (UE4 4.20)UE4的委托(Delegate)使用 什么是委托Delegates (网上大部 ...

  7. 【UE4 C++】代理(委托)

    这里写目录标题 单播代理 声明代理 常用绑定函数的使用 绑定UObject类型对象的成员函数的代理 绑定基于共享引用的成员函数的代理 绑定原始自定义对象成员函数的代理(执行需要检查IsBound) 绑 ...

  8. UE4的HLOD代理浅谈

    <前段时间接触了一些代理Lod的东西,用到了UE4的HLOD(Hierarchical Level of Detail),就顺便扒了下Epic他们这方面的文章,结合堡垒之夜里面的技术,简单的总结 ...

  9. UE4 C++:Delegate委托

    目录 概念 定义 声明委托 单播委托 声明宏 绑定委托 执行函数 用法示例 不带参数Delegate 带参数Delegate 传递有效负载数据 多播委托 声明宏 绑定多播委托 多播执行 动态委托 声明 ...

最新文章

  1. 老游戏与你共渡亲子时光
  2. 概率论与数理统计 第四版 浙江大学 盛骤,谢式千,潘承毅 个人阅读笔记
  3. 【信号与系统】Multisim 仿真信号合成与分解
  4. python整数类型的输出格式_Python整数类型(int)详解
  5. eoLinker API-Shop 常见热门的OCR文字识别API
  6. 运动斗士终南山的不老之道
  7. 远程手机控制开关应用
  8. MySQL-01.深入理解MySQL底层数据结构
  9. 微信动态表情保存到手机相册
  10. oracle分区备份,oracle分区表备份,只还原1个分区
  11. 杰理之设置恒流充电电流【篇】
  12. CI130X智能语音芯片应用于空气炸锅,可实现离线语音控制空气炸锅,高抗噪高识别率
  13. UIPATH 登录凭据
  14. pbe近似_量子化学中的主要近似
  15. 前端国际化,用jquery.i18n完成中英文切换
  16. window 卸载串口cp210x驱动并安装
  17. YOLOV5目标检测---labelimg图片标注工具(1)
  18. 移远BC25/28/35GMQTT连接阿里云物联网平台并实现属性上报
  19. RCE详解(远程命令/代码执行漏洞)
  20. 关于TPS3808G18DBVR

热门文章

  1. java 打印心形图案_简单漂亮的心形礼品盒折纸手工教程
  2. android 权限自动授权,Android判断是否某个权限是否授权
  3. python数字倒序
  4. 【slighttpd】基于lighttpd架构的Server项目实战(4)—简单的echo服务器
  5. matplotlib(六)三维作图
  6. 朴素贝叶斯算法详解及python代码实现
  7. 8大排序算法图文讲解
  8. elasticsearch配置文件详解
  9. 剖析亿级请求下的多级缓存
  10. Java Spark之创建RDD的两种方式和操作RDD