绑定多播委托可使用以下7个绑定函数
一、Add
用于将UObject
实例的成员函数绑定到多播委托上。它会自动处理UObject
的生命周期,当UObject
被销毁时,会自动从委托中移除对应的绑定函数,防止出现悬空指针等问题。这是虚幻引擎中处理UObject
相关委托绑定的常用方式,有助于确保系统的稳定性和安全性。
在如下示例代码中,通过Add
将AAnotherClass
实例的AnotherFunction
成员函数绑定到AExampleClass
的MyMulticastDelegate
多播委托上。
#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
用于绑定静态函数到多播委托。静态函数是属于类本身的函数,不依赖于类的具体实例,因此在绑定到委托时,不需要考虑对象生命周期相关的问题。这使得它在处理一些通用的、不依赖于特定对象状态的逻辑时非常方便,能够为多个对象共享相同的静态函数响应委托事件。
在如下示例代码中,通过AddStatic
将MyUtilityClass
的静态函数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
之间建立事件响应机制。
在如下示例代码中,通过AddUObject
将AAnotherClass
实例的AnotherFunction
成员函数绑定到AExampleClass
的MyMulticastDelegate
多播委托上。
#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()
来清理委托中的绑定关系,以避免不必要的函数调用或潜在的错误。
在如下示例代码中,先使用AddRaw
将SomeFunction
绑定到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();
}