UE4 代理 BindRaw和BindUObject
代理允许您在C++对象上以通用的但类型安全的方式调用成员函数。通过使用代理,可以将其动态地绑定到任何对象的成员函数上,然后在该对象上调用函数,即时调用者不知道该对象的类型也没关系。
任何时候都应该通过引用传递代理。
声明代理
通过使用以下提供的任何一个宏都可以声明代理。所使用的宏由要绑定到该代理上的函数的签名决定。系统预定义了各种通用函数签名的组合、可以根据这些组合声明代理类型、给返回值及参数填入需要的任何类型的类型名称。现在支持使用以下任何条件组合的代理签名:
返回一个值的函数
多达4个"负载" 变量
多达8个函数参数
声明为 'const'的函数
|
函数签名 |
声明宏 |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
绑定代理
代理系统理解某些对象类型,且当使用这些对象时会启用附加功能。如果您把一个代理绑定到一个UObject或共享的指针类上,代理系统可以保持一个到该对象的弱引用,以便当该对象在该代理的底层被销毁了时,您可以通过调用 IsBound() 或 ExecuteIfBound() 函数处理这些情况。注意,所支持的各种对象类型有特定的绑定语法。
|
函数 |
描述 |
|---|---|
|
|
绑定到一个现有的代理对象上。 |
|
|
绑定到一个原始的C++指针全局函数代理上。原始指针不使用任何引用,所以如果从代理的底层删除了该对象,那么调用它可能是不安全的。因此,当调用Execute()时一定要小心! |
|
|
绑定一个基于共享指针的成员函数代理。共享指针代理保持到您的对象的弱引用。您可以使用 |
|
|
绑定一个基于UObject的成员函数代理。UObject 代理保持到您的对象的弱引用。您可以使用 |
|
|
解除绑定该代理。 |
例如我在项目中遇到的:
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() 函数,但是一定要注意那些可能未初始化的输出参数。
|
执行函数 |
描述 |
|---|---|
|
|
|
|
|
|
|
|
UE4 代理 BindRaw和BindUObject的更多相关文章
- [UE4]代理事件(C++)
用宏定义类似格式: DECLARE_DELEGATE //普通代理 DECLARE_DYNAMIC_DELEGATE_TwoParams //动态代理 DECLARE_DYNAMIC_MULTICAS ...
- UEC++ 代理/委托
代理: 代理可以帮助我们解决一对一或是一对多的任务分配工作.主要可以帮助我们解决通知问题.我们可以通过代理完成调用某一个对象的一个函数,而不直接持有该对象的任何指针. 代理就是为你跑腿送信的,你可以不 ...
- [UE4]事件代理,无输出参数,蓝图中不需要绑定
.h UFUNCTION(BlueprintImplementableEvent, meta=(DisplayName = "LoginSuccess")) void LoginS ...
- [UE4]多播代理实例
.h DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FLoginErrorEvent, FString, ErrorMessage); UPROPERTY(B ...
- [UE4]多播代理
1. 第一种 DECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams(FReceiveDelegateEvent, FString, Value1, FString, ...
- 全面理解UE4委托
UE4中的delegate(委托)常用于解耦不同对象之间的关联:委托的触发者不与监听者有直接关联,两者通过委托对象间接地建立联系 监听者通过将响应函数绑定到委托上,使得委托触发时立即收到通知,并进行相 ...
- UE4技术总结——委托
UE4技术总结--委托 目录 UE4技术总结--委托 一.定义 二.用法 2.1 声明与调用委托 2.1.1 单播委托 2.1.1.a 声明 2.1.1.b 绑定 2.1.1.c 执行委托 2.1.1 ...
- 【UE4 C++ 基础知识】<8> Delegate 委托
概念 定义 UE4中的delegate(委托)常用于解耦不同对象之间的关联:委托的触发者不与监听者有直接关联,两者通过委托对象间接地建立联系. 监听者通过将响应函数绑定到委托上,使得委托触发时立即收到 ...
- UE4 WCF RestFul 服务器 读取JSON 数据并解析 简单实例
Note:不知道为什么通过Txt读取的JsonString,如果TXT 不是ANSI编码的话,会报JsonArrayStringToUStruct Unable to parse. bool UWg ...
随机推荐
- Codeforces 348B:Apple Tree(DFS+LCM+思维)
http://codeforces.com/contest/348/problem/B 题意:给一棵树,每个叶子结点有w[i]个苹果,每个子树的苹果数量为该子树所有叶子结点苹果数量之和,要使得每个结点 ...
- LightGBM,面试会问到的都在这了(附代码)!
1. LightGBM是什么东东 不久前微软DMTK(分布式机器学习工具包)团队在GitHub上开源了性能超越其他boosting工具的LightGBM,在三天之内GitHub上被star了1000次 ...
- 小代学Spring Boot之数据源
想要获取更多文章可以访问我的博客 - 代码无止境. 经过一天对Spring Boot的研究,小代同学已经对Spring Boot框架有了一个大概的认识.并且还创建了一个简单的Spring Boot的W ...
- django基础知识之验证码:
验证码 在用户注册.登录页面,为了防止暴力请求,可以加入验证码功能,如果验证码错误,则不需要继续处理,可以减轻一些服务器的压力 使用验证码也是一种有效的防止crsf的方法 验证码效果如下图: 验证码视 ...
- python中的 == 和 is 的区别
== 比较的是两边的值 is 比较的是两边的内存地址 通过 id()获取内存地址 小数据池:我们使用过的值存储在小数据池中,供其他数据使用. 小数据池仅限于 数字 和 字符串: 数字的小数池范围 ...
- Vs连接Mysql数据库
Vs连接Mysql数据库步骤 1. 首先下载mysql数据库,安装,建库建表 https://www.yiibai.com/mysql/getting-started-with-mysql-store ...
- Linux命令学习-tail命令
Linux中,tail命令的全称就是tail,主要用于监控日志文件. 对于一个正在运行应用来说,其对应的log日志文件肯定是在不断的更新,此时,便可通过tail命令来动态显示日志文件的内容.假设当前目 ...
- 一台服务器通过nginx配置多个域名(80端口)
1. 问题描述 多个域名对应一个服务器,为了避免域名后增加端口号,两个域名都需要占用80端口号,使用nginx来进行配置. 2. 解决方案 目前项目中,线上正在使用(100%可用)多域名对应一个服务器 ...
- Python之爬虫有感(一)
urllib.request.Request('URL',headers = headers)User-Agent 是爬虫和反爬虫斗争的第一步,发送请求必须带User—Agent使用流程: 1. ...
- Python重试模块retrying
Python重试模块retrying 工作中经常碰到的问题就是,某个方法出现了异常,重试几次.循环重复一个方法是很常见的.比如爬虫中的获取代理,对获取失败的情况进行重试. 刚开始搜的几个博客讲的有点问 ...