【UE5 C++课程系列笔记】09——多播委托的基本使用-多播委托——绑定委托

时间:2024-12-17 07:07:29

绑定多播委托可使用以下7个绑定函数

 一、Add

        用于UObject实例的成员函数绑定到多播委托上。它会自动处理UObject的生命周期,当UObject被销毁时,会自动从委托中移除对应的绑定函数,防止出现悬空指针等问题。这是虚幻引擎中处理UObject相关委托绑定的常用方式,有助于确保系统的稳定性和安全性。

        在如下示例代码中,通过AddAAnotherClass实例的AnotherFunction成员函数绑定到AExampleClassMyMulticastDelegate多播委托上。

#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "MyExampleClass.generated.h"

DECLARE_MULTICAST_DELEGATE(FMyMulticastDelegate);

UCLASS()
class MYGAME_API AExampleClass : public AActor
{
    GENERATED_BODY()
public:
    FMyMulticastDelegate MyMulticastDelegate;

    void BindFunction()
    {
        AAnotherClass* AnotherObject = NewObject<AAnotherClass>();
        MyMulticastDelegate.Add(AnotherObject, &AAnotherClass::AnotherFunction);
    }
};

二、AddStatic

        用于绑定静态函数到多播委托。静态函数是属于类本身的函数,不依赖于类的具体实例,因此在绑定到委托时,不需要考虑对象生命周期相关的问题。这使得它在处理一些通用的、不依赖于特定对象状态的逻辑时非常方便,能够为多个对象共享相同的静态函数响应委托事件。

        在如下示例代码中,通过AddStaticMyUtilityClass的静态函数StaticFunction绑定到FMyStaticDelegate多播委托上。

#include "CoreMinimal.h"
#include "MyUtilityClass.generated.h"

DECLARE_MULTICAST_DELEGATE(FMyStaticDelegate);

class MyUtilityClass
{
public:
    static void StaticFunction()
    {
        // 这里是静态函数的具体逻辑
    }
};

void BindStaticFunction()
{
    FMyStaticDelegate StaticDelegate;
    StaticDelegate.AddStatic(&MyUtilityClass::StaticFunction);
}

三、AddRaw

        用于绑定普通的C++ 函数(非UObject相关的成员函数或静态函数)或者函数指针到多播委托。与Add()不同,它不会自动处理对象的生命周期等额外机制,开发者需要自己确保所绑定函数的有效性以及相关资源(如函数所属对象的生命周期,如果是类成员函数的话)的正确管理。这种方式提供了更大的灵活性,但也需要开发者更加谨慎地处理可能出现的问题。

        在如下示例代码中,通过AddRaw将全局函数GlobalFunction绑定到FMyRawDelegate多播委托上。

#include "CoreMinimal.h"

DECLARE_MULTICAST_DELEGATE(FMyRawDelegate);

void GlobalFunction()
{
    // 这里是全局函数的具体逻辑
}

void BindRawFunction()
{
    FMyRawDelegate MyRawDelegate;
    MyRawDelegate.AddRaw(GlobalFunction);
}

四、AddSP

        主要用于绑定共享指针(TSharedPtr)指向的对象的成员函数到多播委托。在虚幻引擎中,共享指针常用于管理对象的生命周期,AddSP()结合共享指针可以确保在对象的引用计数归零时正确处理与委托的绑定关系,避免出现悬空指针等错误情况。这种方式在处理对象的共享使用和生命周期管理方面提供了一种有效的解决方案。

        在如下示例代码中,通过AddSP将共享指针SharedPtr指向的MySharedClass对象的SharedFunction成员函数绑定到FMySPDelegate多播委托上。

#include "CoreMinimal.h"
#include "MySharedClass.generated.h"

DECLARE_MULTICAST_DELEGATE(FMySPDelegate);

UCLASS()
class MYGAME_API MySharedClass
{
    GENERATED_BODY()
public:
    void SharedFunction()
    {
        // 这里是成员函数的具体逻辑
    }
};

void BindSPFunction()
{
    TSharedPtr<MySharedClass> SharedPtr = MakeShared<MySharedClass>();
    FMySPDelegate MySPDelegate;
    MySPDelegate.AddSP(SharedPtr, &MySharedClass::SharedFunction);
}

五、AddUObject 

  AddUObject()Add()功能类似,用于UObject实例的成员函数绑定到多播委托。它是一种方便的、针对UObject的委托绑定方式,能够自动处理UObject的生命周期相关问题,保证委托在调用绑定函数时的安全性和有效性。在虚幻引擎的开发中,这种方式常用于在不同的UObject之间建立事件响应机制。

        在如下示例代码中,通过AddUObjectAAnotherClass实例的AnotherFunction成员函数绑定到AExampleClassMyMulticastDelegate多播委托上。

#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "MyExampleClass.generated.h"

DECLARE_MULTICAST_DELEGATE(FMyMulticastDelegate);

UCLASS()
class MYGAME_API AExampleClass : public AActor
{
    GENERATED_BODY()
public:
    FMyMulticastDelegate MyMulticastDelegate;

    void BindFunction()
    {
        AAnotherClass* AnotherObject = NewObject<AAnotherClass>();
        MyMulticastDelegate.AddUObject(AnotherObject, &AAnotherClass::AnotherFunction);
    }
};

六、Remove

        用于从多播委托中移除特定的绑定函数。当不再需要某个函数对委托事件做出响应时,或者在对象生命周期结束等情况下,需要手动使用Remove()来清理委托中的绑定关系,以避免不必要的函数调用或潜在的错误。

        在如下示例代码中,先使用AddRawSomeFunction绑定到MyDelegate,然后使用Remove将其从委托中移除。

#include "CoreMinimal.h"

DECLARE_MULTICAST_DELEGATE(FMyDelegate);

void SomeFunction()
{
    // 函数逻辑
}

void RemoveFunctionBinding()
{
    FMyDelegate MyDelegate;
    MyDelegate.AddRaw(SomeFunction);
    // 移除绑定
    MyDelegate.Remove(SomeFunction);
}

 七、RemoveAll

        用于移除多播委托中所有已绑定的函数。这在需要重置委托的状态,或者当持有委托的对象即将被销毁等情况下非常有用,可以确保委托处于一个干净的状态,不会在后续操作中意外调用已失效的绑定函数。

在如下代码中,RemoveAll操作会清除FMyAllDelegate多播委托中所有已绑定的函数。

#include "CoreMinimal.h"

DECLARE_MULTICAST_DELEGATE(FMyAllDelegate);

void RemoveAllFunctionBindings()
{
    FMyAllDelegate MyAllDelegate;
    // 假设已经绑定了一些函数,这里省略绑定过程

    // 移除所有绑定函数
    MyAllDelegate.RemoveAll();
}