UE4 Delegate(代理)相关源码分析(二)

UE4 Delegate(代理)相关源码分析


前言

  • 这是补充上一篇文章关于单播内容的文章
  • 部分代码啃不动, 啃成什么样子就写了, 之后可能会推到, 重写一些东西.

    如果没错, 现在写的很多东西, 之后都会推到, 重写, 查漏补缺? 会更系统化? 关联化?

  • 因为考试,鸽了一周, 今天考试结束.

    嗯, 大概, 可能, 之后会因为游戏再鸽(笑). xx游戏正在安装

核心类

  • TBaseDelegate 代理基类
  • 各种代理类型
    • TBaseStaticDelegateInstance
    • TBaseFunctorDelegateInstance
    • TWeakBaseFunctorDelegateInstance
    • TBaseRawMethodDelegateInstance
    • TBaseSPMethodDelegateInstance
    • TBaseUFunctionDelegateInstance
    • TBaseUObjectMethodDelegateInstance

正文

TBaseDelegate 代理基类

绑定和创建
在这里插入图片描述

BindWeakLambda这个是4.21新加功能, 嗯, 这个功能很有用.
写代码的时候常常为了省事, 省略一个函数定义, 定时器绑代理的时候绑Lambda, 结果this可能是野指针, 崩溃. TAT
今天查并写WeakLambda这个新功能的时候, 发现编译不过, 然后翻到了一个github, 然后发现他的写法. 骚!
从而导致BindWeakLambda用处也没有那么大了(笑)

创建是Create**(), 是一个静态函数, 返回一个TBaseDelegate类型的代理
具体的实现等详细内容在下面

执行
在这里插入图片描述
上文提到过TBaseDelegate父类FDelegateBase通过DelegateAllocator存储一个IDelegateInstance对象, 通过这个对象来实现代理.
所以这篇文章, 是对这里的补充, 也就是值这个IDelegateInstance对象.
相关知识涉及到C++一大堆底层知识, 近期没有深入研究的打算, 所以可能会有错误或者解释不清楚的地方, 之后会视情况修复.
在这里插入图片描述

Raw
  • TBaseRawMethodDelegateInstance
    在这里插入图片描述
    存储了一个C++对象和一个FMethodPtr结构体(对应的函数指针), 用于绑定一个类或结构体的函数

能力有限, 在往下 对象执行函数啊, 函数指针转换之类的也就只属于能看懂一点点罢了,
原理 是函数指针, 但 加上模版, 预定义宏这些, 啃起来就有点头疼了, 下面同

Static
  • TBaseStaticDelegateInstance
    在这里插入图片描述
    看到存储了一个FFuncPtr指针(函数指针), 用于绑定普通函数
ThreadSafeSP & SP
  • TBaseSPMethodDelegateInstance
    在这里插入图片描述
    存储一个TWeakPtr和FMethodPtr(函数指针), 这个是Raw的升级版, 绑定一个弱指针, 合理使用, 可以避免野空指针.
UFunction & UObject
  • TBaseUObjectMethodDelegateInstance在这里插入图片描述
    存储一个UObject指针和一个FMethodPtr(函数指针)

  • TBaseUFunctionDelegateInstance在这里插入图片描述
    存储一个FunctionName和一个TWeakObjectPtr, 会通过函数名称, 依靠强大的反射系统, 得到相应的UFunction.

这两个是最常用的.

Lambda
  • TBaseFunctorDelegateInstance
  • TWeakBaseFunctorDelegateInstance
    在这里插入图片描述在这里插入图片描述
    这是Lambda的, 看不懂, WeakLambda多存储了一个TWeakObjectPtr<>, 用于检测.

结语


  • 单播相关的也就这些了, 再往下就看不懂或者不在代理范围内了. 想要研究的可以自行啃代码. (笑)
  • 得益于UE4强大的反射功能, 嗯, 什么时候有能力, 在网上大神的指导下, 会深扒一下. 估计很久之后了(笑)
  • 一二两篇文章可能写的有点杂乱了.

总计

总计写的很简单了, 如果某点特别懵, 重新阅读, 或者啃代码吧.

  • UE4代理(下省略UE4)分单播和多播, 并有一个没卵用的事件.
  • 单播和多播均有普通代理和动态代理(C++的代理和蓝图的代理)
  • 普通代理(C++)有很多的绑定方式, 并可以额外传入定义外的参数
  • 代理的实现, 在很多地方是靠UE4的反射系统的.
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值