多播委托

多播委托拥有大部分与单播委托相同的功能。它们只拥有对对象的弱引用,可以与结构体一起使用,可以四处轻松复制等等。就像常规委托一样,多播委托可以远程加载/保存和触发;但多播委托函数不能使用返回值。它们最适合用来四处轻松传递一组委托。

声明多播委托

多播委托在声明方式上与声明标准委托相同,只是前者使用特定于多播委托的宏变体。

声明宏 说明
DECLARE_MULTICAST_DELEGATE[_RetVal, ...]\( DelegateName \) 创建一个多播委托。
DECLARE_DYNAMIC_MULTICAST_DELEGATE[_RetVal, ...]\( DelegateName \) 创建一个动态多播委托。

绑定多播委托

多播委托可以绑定多个函数,当委托触发时,将调用所有这些函数。因此,绑定函数在语义上与数组更加类似。

函数 说明
Add() 将函数委托添加到该多播委托的调用列表中。
AddStatic() 添加原始 C++ 指针全局函数委托。
AddRaw() 添加原始 C++ 指针委托。原始指针不使用任何类型的引用,因此如果从委托下面删除了对象,则调用此函数可能不安全。调用 Execute() 时请小心!
AddLambda() 添加一个函子。这通常用于那些不会捕获指针的 lambda 函数。
AddSPLambda() 添加一个函子。它只有在对目标共享指针的弱引用有效的情况下才会被调用。
AddWeakLambda() 添加一个函子。它只有在对 UObject 的弱引用有效的情况下才会被调用。
AddSP() 添加基于共享指针的(快速、非线程安全)成员函数委托。共享指针委托保留对对象的弱引用。
AddUObject() 添加基于 UObject 的成员函数委托。UObject 委托保留对对象的弱引用。
Remove() 从该多播委托的调用列表中删除函数(性能为 O(N))。请注意,委托的顺序可能不会被保留!
RemoveAll() 从该多播委托的调用列表中删除绑定到指定 UserObject 的所有函数。请注意,委托的顺序可能不会被保留!

RemoveAll() 将删除绑定到所提供指针的所有已注册委托。切记,未绑定到对象指针的原始委托不会被该函数所删除!

请参阅 DelegateSignatureImpl.inl(位于 ..\Engine\Source\Runtime\Core\Public\Delegates\ 中)了解这些函数的变体、参数和实现。

多播执行

多播委托允许您附加多个函数委托,然后通过调用多播委托的 Broadcast() 函数一次性同时执行它们。多播委托签名不得使用返回值。

在多播委托上调用 Broadcast() 总是安全的,即使是在没有任何绑定时也是如此。唯一需要注意的是,如果您使用委托来初始化输出变量,通常会带来非常不利的后果。

调用 Broadcast() 时绑定函数的执行顺序尚未定义。执行顺序可能与函数的添加顺序不相同。

函数 说明
Broadcast() 将该委托广播给所有绑定的对象,但可能已过期的对象除外。