内容纲要

多播委托和单播委托功能差不多。它们只拥有对象的弱引用,可以与结构体一起使用,可以四处轻松复制等等。要注意的是多播委托不能使用返回值。

委托的声明

//非动态
DECLARE_MULTICAST_DELEGATE_OneParam(FTestMultiDelegate, bool);
//动态
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FTestDynamicMultiDelegate, bool, Value);

绑定委托

//常规多播
TestMultiDelegate.AddRaw(RawObject.Get(), &RawObject::DelegateTest);
TestMultiDelegate.AddSP(RawObject.ToSharedRef(), &RawObject::DelegateTest);
TestMultiDelegate.AddStatic(&RawObject::DelegateStatic);
TestMultiDelegate.AddUFunction(UObject, "TestMultiDelegate_Ret_PBool_Payload", 200);
TestMultiDelegate.AddLambda(UObject, 
    [FuncName](bool Value){
        UE_LOG(LogTemp, Warning, TEXT("%s in Lambda, bool=%u"), *FuncName, Value);
    });

//动态多播
TestDynamicMultiDelegate.AddDynamic(UEObject, &UDelegateObject::TestMultiDelegate_Ret_PBool);
//再次提醒 动态是用名字(查找的),
//AddDynamic 宏定义将 TestMultiDelegate_Ret_PBool 转成字符串再查找,
//TestMultiDelegate_Ret_PBool 方法也需要有 UFUNCTION() 标记

委托执行

Delegate.Broadcast(true);