【UE】UEC++委托代理
一、委托的声明与定义
#pragma once#include "CoreMinimal.h"
#include "GameFramework/GameModeBase.h"
#include "DelegateGameMode.generated.h"//
// Declare DECLARE_DELEGATE
//
DECLARE_DELEGATE(FDeclareDelegate_00);
DECLARE_DELEGATE_OneParam(FDeclareDelegate_01, bool);
DECLARE_DELEGATE_TwoParams(FDeclareDelegate_02, bool, int32);
DECLARE_DELEGATE_RetVal(bool, FDeclareDelegate_03);
DECLARE_DELEGATE_RetVal_OneParam(bool, FDeclareDelegate_04, bool);//
// Declare DECLARE_MULTICAST_DELEGATE
//
DECLARE_MULTICAST_DELEGATE(FDeclareMulticastDelegate_00);
DECLARE_MULTICAST_DELEGATE_OneParam(FDeclareMulticastDelegate_01, int32);//
// Declare DECLARE_DYNAMIC_DELEGATE
//
DECLARE_DYNAMIC_DELEGATE(FDeclareDynamicDelegate_00);
DECLARE_DYNAMIC_DELEGATE_OneParam(FDeclareDynamicDelegate_01, int32, iValue);
DECLARE_DYNAMIC_DELEGATE_RetVal(bool, FDeclareDynamicDelegate_02);
DECLARE_DYNAMIC_DELEGATE_RetVal_OneParam(bool, FDeclareDynamicDelegate_03, int32, iValue);//
// Declare DECLARE_DYNAMIC_MULTICAST_DELEGATE
//
DECLARE_DYNAMIC_MULTICAST_DELEGATE(FDeclareDynamicMulticastDelegate_00);
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FDeclareDynamicMulticastDelegate_01, int32, iValue);UCLASS()
class DELEGATE_API ADelegateGameMode : public AGameModeBase
{GENERATED_BODY()
public://// Define DECLARE_DELEGATE//FDeclareDelegate_00 DeclareDelegate_00;FDeclareDelegate_01 DeclareDelegate_01;FDeclareDelegate_02 DeclareDelegate_02;FDeclareDelegate_03 DeclareDelegate_03;FDeclareDelegate_04 DeclareDelegate_04;//// Define DECLARE_MULTICAST_DELEGATE//FDeclareMulticastDelegate_00 DeclareMulticastDelegate_00;FDeclareMulticastDelegate_01 DeclareMulticastDelegate_01;//// Define DECLARE_DYNAMIC_DELEGATE//FDeclareDynamicDelegate_00 DeclareDynamicDelegate_00;FDeclareDynamicDelegate_01 DeclareDynamicDelegate_01;FDeclareDynamicDelegate_02 DeclareDynamicDelegate_02;FDeclareDynamicDelegate_03 DeclareDynamicDelegate_03;//// Define DECLARE_DYNAMIC_MULTICAST_DELEGATE//FDeclareDynamicMulticastDelegate_00 DeclareDynamicMulticastDelegate_00;FDeclareDynamicMulticastDelegate_01 DeclareDynamicMulticastDelegate_01;
};
二、单播绑定与解绑
#pragma once#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "DeclareDelegate.generated.h"UCLASS()
class DELEGATE_API ADeclareDelegate : public AActor
{GENERATED_BODY()
public: ADeclareDelegate();virtual void Tick(float DeltaTime) override;
protected:virtual void BeginPlay() override;virtual void EndPlay(const EEndPlayReason::Type EndPlayReason) override;
public:UFUNCTION()void BindDelegate();UFUNCTION()void UnBindDelegate();UFUNCTION()void FunNoParam();UFUNCTION()void FunOneParam(bool bValue);UFUNCTION()void FunTwoParam(bool bValue, int32 iValue);UFUNCTION()bool FunRetValNoParam();UFUNCTION()bool FunRetValOneParam(bool bValue);
};
#include "DeclareDelegate.h"#include "Delegate/GameMode/DelegateGameMode.h"
#include "Kismet/GameplayStatics.h"ADeclareDelegate::ADeclareDelegate()
{PrimaryActorTick.bCanEverTick = false;
}void ADeclareDelegate::Tick(float DeltaTime)
{Super::Tick(DeltaTime);
}void ADeclareDelegate::BeginPlay()
{Super::BeginPlay();BindDelegate();
}void ADeclareDelegate::EndPlay(const EEndPlayReason::Type EndPlayReason)
{Super::EndPlay(EndPlayReason);UnBindDelegate();
}void ADeclareDelegate::BindDelegate()
{UE_LOG(LogTemp,Log,TEXT("DeclareDelegateActor::BindDegelate"))if(GetWorld()){ADelegateGameMode* DelegateGameMode = Cast<ADelegateGameMode>(UGameplayStatics::GetGameMode(GetWorld()));DelegateGameMode->DeclareDelegate_00.BindUObject(this, &ThisClass::FunNoParam);DelegateGameMode->DeclareDelegate_01.BindUFunction(this, "FunOneParam");DelegateGameMode->DeclareDelegate_02.BindUObject(this, &ThisClass::FunTwoParam);DelegateGameMode->DeclareDelegate_03.BindUObject(this, &ThisClass::FunRetValNoParam);DelegateGameMode->DeclareDelegate_04.BindUFunction(this, "FunRetValOneParam");}
}void ADeclareDelegate::UnBindDelegate()
{UE_LOG(LogTemp,Log,TEXT("DeclareDelegateActor::UnBindDegelate"))if(GetWorld()){ADelegateGameMode* DelegateGameMode = Cast<ADelegateGameMode>(UGameplayStatics::GetGameMode(GetWorld()));DelegateGameMode->DeclareDelegate_00.Unbind();DelegateGameMode->DeclareDelegate_01.Unbind();DelegateGameMode->DeclareDelegate_02.Unbind();DelegateGameMode->DeclareDelegate_03.Unbind();DelegateGameMode->DeclareDelegate_04.Unbind();}
}void ADeclareDelegate::FunNoParam()
{UE_LOG(LogTemp,Log,TEXT("DeclareDelegateActor::FunNoParam"))
}void ADeclareDelegate::FunOneParam(bool bValue)
{UE_LOG(LogTemp,Log,TEXT("DeclareDelegateActor::FunOneParam"))
}void ADeclareDelegate::FunTwoParam(bool bValue, int32 iValue)
{UE_LOG(LogTemp,Log,TEXT("DeclareDelegateActor::FunTwoParam"))
}bool ADeclareDelegate::FunRetValNoParam()
{UE_LOG(LogTemp,Log,TEXT("DeclareDelegateActor::FunRetValNoParam"))return false;
}bool ADeclareDelegate::FunRetValOneParam(bool bValue)
{UE_LOG(LogTemp,Log,TEXT("DeclareDelegateActor::FunRetValOneParam"))return bValue;
}
三、多播绑定与解绑
#pragma once#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "DeclareMulticastDelegate.generated.h"UCLASS()
class DELEGATE_API ADeclareMulticastDelegate : public AActor
{GENERATED_BODY()public: ADeclareMulticastDelegate();virtual void Tick(float DeltaTime) override;
protected:virtual void BeginPlay() override;virtual void EndPlay(const EEndPlayReason::Type EndPlayReason) override;
public:UFUNCTION()void BindDelegate();UFUNCTION()void UnBindDelegate();UFUNCTION()void FunNoParam_One();UFUNCTION()void FunNoParam_Two();UFUNCTION()void FunOneParam_One(int32 iValue);UFUNCTION()void FunOneParam_Two(int32 iValue);
private:FDelegateHandle DelegateHandle;TArray<FDelegateHandle> DelegateHandles;
};
#include "DeclareMulticastDelegate.h"#include "Delegate/GameMode/DelegateGameMode.h"
#include "Kismet/GameplayStatics.h"ADeclareMulticastDelegate::ADeclareMulticastDelegate()
{PrimaryActorTick.bCanEverTick = false;
}void ADeclareMulticastDelegate::Tick(float DeltaTime)
{Super::Tick(DeltaTime);
}void ADeclareMulticastDelegate::BeginPlay()
{Super::BeginPlay();BindDelegate();
}void ADeclareMulticastDelegate::EndPlay(const EEndPlayReason::Type EndPlayReason)
{Super::EndPlay(EndPlayReason);UnBindDelegate();
}void ADeclareMulticastDelegate::BindDelegate()
{UE_LOG(LogTemp,Log,TEXT("DeclareMulticastDelegateActor::BindDegelate"))if(GetWorld()){ADelegateGameMode* DelegateGameMode = Cast<ADelegateGameMode>(UGameplayStatics::GetGameMode(GetWorld()));DelegateGameMode->DeclareMulticastDelegate_00.AddUObject(this, &ThisClass::FunNoParam_One);DelegateHandle = DelegateGameMode->DeclareMulticastDelegate_00.AddUFunction(this, "FunNoParam_Two");DelegateHandles.Add(DelegateGameMode->DeclareMulticastDelegate_01.AddUObject(this, &ThisClass::FunOneParam_One));DelegateHandles.Add(DelegateGameMode->DeclareMulticastDelegate_01.AddUFunction(this, "FunOneParam_Two"));}
}void ADeclareMulticastDelegate::UnBindDelegate()
{UE_LOG(LogTemp,Log,TEXT("DeclareMulticastDelegateActor::UnBindDelegate"))if(GetWorld()){ADelegateGameMode* DelegateGameMode = Cast<ADelegateGameMode>(UGameplayStatics::GetGameMode(GetWorld()));DelegateGameMode->DeclareMulticastDelegate_00.RemoveAll(this);for(FDelegateHandle Handle : DelegateHandles){DelegateGameMode->DeclareMulticastDelegate_01.Remove(Handle);}}
}void ADeclareMulticastDelegate::FunNoParam_One()
{UE_LOG(LogTemp,Log,TEXT("DeclareMulticastDelegateActor::FunNoParam_One"))
}void ADeclareMulticastDelegate::FunNoParam_Two()
{UE_LOG(LogTemp,Log,TEXT("DeclareMulticastDelegateActor::FunNoParam_Two"))if(GetWorld()){ADelegateGameMode* DelegateGameMode = Cast<ADelegateGameMode>(UGameplayStatics::GetGameMode(GetWorld()));DelegateGameMode->DeclareMulticastDelegate_00.Remove(DelegateHandle);}
}void ADeclareMulticastDelegate::FunOneParam_One(int32 iValue)
{UE_LOG(LogTemp,Log,TEXT("DeclareMulticastDelegateActor::FunOneParam_One"))
}void ADeclareMulticastDelegate::FunOneParam_Two(int32 iValue)
{UE_LOG(LogTemp,Log,TEXT("DeclareMulticastDelegateActor::FunOneParam_Two"))
}
四、动态单播绑定与解绑
#pragma once#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "DeclareDynamicDelegate.generated.h"UCLASS()
class DELEGATE_API ADeclareDynamicDelegate : public AActor
{GENERATED_BODY()
public: ADeclareDynamicDelegate();virtual void Tick(float DeltaTime) override;
protected:virtual void BeginPlay() override;virtual void EndPlay(const EEndPlayReason::Type EndPlayReason) override;
public: UFUNCTION()void BindDelegate();UFUNCTION()void UnBindDelegate();UFUNCTION()void FunNoParam();UFUNCTION()void FunOneParam(int32 iValue);UFUNCTION()bool FunRetValNoParam();UFUNCTION()bool FunRetValOneParam(int32 iValue);
};
#include "DeclareDynamicDelegate.h"#include "Delegate/GameMode/DelegateGameMode.h"
#include "Kismet/GameplayStatics.h"ADeclareDynamicDelegate::ADeclareDynamicDelegate()
{PrimaryActorTick.bCanEverTick = false;
}void ADeclareDynamicDelegate::Tick(float DeltaTime)
{Super::Tick(DeltaTime);
}void ADeclareDynamicDelegate::BeginPlay()
{Super::BeginPlay();BindDelegate();
}void ADeclareDynamicDelegate::EndPlay(const EEndPlayReason::Type EndPlayReason)
{Super::EndPlay(EndPlayReason);UnBindDelegate();
}void ADeclareDynamicDelegate::BindDelegate()
{UE_LOG(LogTemp,Log,TEXT("DeclareDynamicDelegate::BindDelegate"))if(GetWorld()){ADelegateGameMode* DelegateGameMode = Cast<ADelegateGameMode>(UGameplayStatics::GetGameMode(GetWorld()));DelegateGameMode->DeclareDynamicDelegate_00.BindDynamic(this, &ThisClass::FunNoParam);DelegateGameMode->DeclareDynamicDelegate_01.BindUFunction(this, "FunOneParam");DelegateGameMode->DeclareDynamicDelegate_02.BindDynamic(this, &ThisClass::FunRetValNoParam);DelegateGameMode->DeclareDynamicDelegate_03.BindUFunction(this, "FunRetValOneParam");}
}void ADeclareDynamicDelegate::UnBindDelegate()
{UE_LOG(LogTemp,Log,TEXT("DeclareDynamicDelegate::UnBindDelegate"))if(GetWorld()){ADelegateGameMode* DelegateGameMode = Cast<ADelegateGameMode>(UGameplayStatics::GetGameMode(GetWorld()));DelegateGameMode->DeclareDynamicDelegate_00.Clear();DelegateGameMode->DeclareDynamicDelegate_01.Unbind();DelegateGameMode->DeclareDynamicDelegate_02.Clear();DelegateGameMode->DeclareDynamicDelegate_03.Unbind();}
}void ADeclareDynamicDelegate::FunNoParam()
{UE_LOG(LogTemp,Log,TEXT("DeclareDynamicDelegate::FunNoParam"))
}void ADeclareDynamicDelegate::FunOneParam(int32 iValue)
{UE_LOG(LogTemp,Log,TEXT("DeclareDynamicDelegate::FunOneParam"))
}bool ADeclareDynamicDelegate::FunRetValNoParam()
{UE_LOG(LogTemp,Log,TEXT("DeclareDynamicDelegate::FunRetValNoParam"))return false;
}bool ADeclareDynamicDelegate::FunRetValOneParam(int32 iValue)
{UE_LOG(LogTemp,Log,TEXT("DeclareDynamicDelegate::FunRetValOneParam"))return false;
}
五、动态多播绑定与解绑
#pragma once#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "DeclareDynamicMulticastDelegate.generated.h"UCLASS()
class DELEGATE_API ADeclareDynamicMulticastDelegate : public AActor
{GENERATED_BODY()
public: ADeclareDynamicMulticastDelegate();virtual void Tick(float DeltaTime) override;
protected:virtual void BeginPlay() override;virtual void EndPlay(const EEndPlayReason::Type EndPlayReason) override;
public:UFUNCTION()void BindDelegate();UFUNCTION()void UnBindDelegate();UFUNCTION()void FunNoParam_One();UFUNCTION()void FunNoParam_Two();UFUNCTION()void FunOneParam_One(int32 iValue);UFUNCTION()void FunOneParam_Two(int32 iValue);
};
#include "DeclareDynamicMulticastDelegate.h"#include "Delegate/GameMode/DelegateGameMode.h"
#include "Kismet/GameplayStatics.h"ADeclareDynamicMulticastDelegate::ADeclareDynamicMulticastDelegate()
{PrimaryActorTick.bCanEverTick = false;
}void ADeclareDynamicMulticastDelegate::Tick(float DeltaTime)
{Super::Tick(DeltaTime);
}void ADeclareDynamicMulticastDelegate::BeginPlay()
{Super::BeginPlay();BindDelegate();
}void ADeclareDynamicMulticastDelegate::EndPlay(const EEndPlayReason::Type EndPlayReason)
{Super::EndPlay(EndPlayReason);UnBindDelegate();
}void ADeclareDynamicMulticastDelegate::BindDelegate()
{UE_LOG(LogTemp,Log,TEXT("DeclareDynamicMulticastDelegate::BindDelegate"))if(GetWorld()){ADelegateGameMode* DelegateGameMode = Cast<ADelegateGameMode>(UGameplayStatics::GetGameMode(GetWorld()));DelegateGameMode->DeclareDynamicMulticastDelegate_00.AddDynamic(this, &ThisClass::FunNoParam_One);DelegateGameMode->DeclareDynamicMulticastDelegate_00.AddUniqueDynamic(this, &ThisClass::FunNoParam_Two);DelegateGameMode->DeclareDynamicMulticastDelegate_01.AddDynamic(this, &ThisClass::FunOneParam_One);DelegateGameMode->DeclareDynamicMulticastDelegate_01.AddUniqueDynamic(this, &ThisClass::FunOneParam_Two);}
}void ADeclareDynamicMulticastDelegate::UnBindDelegate()
{UE_LOG(LogTemp,Log,TEXT("DeclareDynamicMulticastDelegate::UnBindDelegate"))if(GetWorld()){ADelegateGameMode* DelegateGameMode = Cast<ADelegateGameMode>(UGameplayStatics::GetGameMode(GetWorld()));DelegateGameMode->DeclareDynamicMulticastDelegate_00.Remove(this, "FunNoParam_One");DelegateGameMode->DeclareDynamicMulticastDelegate_00.RemoveDynamic(this, &ThisClass::FunNoParam_Two);DelegateGameMode->DeclareDynamicMulticastDelegate_01.RemoveAll(this);}
}void ADeclareDynamicMulticastDelegate::FunNoParam_One()
{UE_LOG(LogTemp,Log,TEXT("DeclareDynamicMulticastDelegate::FunNoParam_One"))
}void ADeclareDynamicMulticastDelegate::FunNoParam_Two()
{UE_LOG(LogTemp,Log,TEXT("DeclareDynamicMulticastDelegate::FunNoParam_Two"))
}void ADeclareDynamicMulticastDelegate::FunOneParam_One(int32 iValue)
{UE_LOG(LogTemp,Log,TEXT("DeclareDynamicMulticastDelegate::FunOneParam_One"))
}void ADeclareDynamicMulticastDelegate::FunOneParam_Two(int32 iValue)
{UE_LOG(LogTemp,Log,TEXT("DeclareDynamicMulticastDelegate::FunOneParam_Two"))
}
六、委托的调用
#pragma once#include "CoreMinimal.h"
#include "GameFramework/PlayerController.h"
#include "DelegateController.generated.h"UCLASS()
class DELEGATE_API ADelegateController : public APlayerController
{GENERATED_BODY()
public:virtual void SetupInputComponent() override;//// Call Declare Delegate//UFUNCTION()void CallDeclareDelegate();//// Call Declare Multicast Delegate//UFUNCTION()void CallDeclareMulticastDelegate();//// Call Declare Dynamic Delegate//UFUNCTION()void CallDeclareDynamicDelegate();//// Call Declare Dynamic Multicast Delegate//UFUNCTION()void CallDeclareDynamicMulticastDelegate();
};
#include "DelegateController.h"#include "DelegateGameMode.h"
#include "Kismet/GameplayStatics.h"void ADelegateController::SetupInputComponent()
{Super::SetupInputComponent();InputComponent->BindAction("DeclareDelegate", IE_Pressed, this, &ThisClass::CallDeclareDelegate);InputComponent->BindAction("DeclareMulticastDelegate", IE_Pressed, this, &ThisClass::CallDeclareMulticastDelegate);InputComponent->BindAction("DeclareDynamicDelegate", IE_Pressed, this, &ThisClass::CallDeclareDynamicDelegate);InputComponent->BindAction("DeclareDynamicMulticastDelegate", IE_Pressed, this, &ThisClass::CallDeclareDynamicMulticastDelegate);
}void ADelegateController::CallDeclareDelegate()
{if(GetWorld() == nullptr) return;const ADelegateGameMode* DelegateGameMode = Cast<ADelegateGameMode>(UGameplayStatics::GetGameMode(GetWorld()));if(DelegateGameMode == nullptr) return;if(DelegateGameMode->DeclareDelegate_00.IsBound()){DelegateGameMode->DeclareDelegate_00.Execute();}DelegateGameMode->DeclareDelegate_01.ExecuteIfBound(true);DelegateGameMode->DeclareDelegate_02.ExecuteIfBound(true, 11);if(DelegateGameMode->DeclareDelegate_03.IsBound()){bool bValue = DelegateGameMode->DeclareDelegate_03.Execute();}if(DelegateGameMode->DeclareDelegate_04.IsBound()){bool bValue = DelegateGameMode->DeclareDelegate_04.Execute(true);}
}void ADelegateController::CallDeclareMulticastDelegate()
{if(GetWorld() == nullptr) return;const ADelegateGameMode* DelegateGameMode = Cast<ADelegateGameMode>(UGameplayStatics::GetGameMode(GetWorld()));if(DelegateGameMode == nullptr) return;if(DelegateGameMode->DeclareMulticastDelegate_00.IsBound()){DelegateGameMode->DeclareMulticastDelegate_00.Broadcast();}if(DelegateGameMode->DeclareMulticastDelegate_01.IsBound()){DelegateGameMode->DeclareMulticastDelegate_01.Broadcast(11);}
}void ADelegateController::CallDeclareDynamicDelegate()
{if(GetWorld() == nullptr) return;const ADelegateGameMode* DelegateGameMode = Cast<ADelegateGameMode>(UGameplayStatics::GetGameMode(GetWorld()));if(DelegateGameMode == nullptr) return;if(DelegateGameMode->DeclareDynamicDelegate_00.IsBound()){DelegateGameMode->DeclareDynamicDelegate_00.Execute();}DelegateGameMode->DeclareDynamicDelegate_01.ExecuteIfBound(11);if(DelegateGameMode->DeclareDynamicDelegate_02.IsBound()){bool bValue = DelegateGameMode->DeclareDynamicDelegate_02.Execute();}if(DelegateGameMode->DeclareDynamicDelegate_03.IsBound()){bool bValue = DelegateGameMode->DeclareDynamicDelegate_03.Execute(11);}
}void ADelegateController::CallDeclareDynamicMulticastDelegate()
{if(GetWorld() == nullptr) return;const ADelegateGameMode* DelegateGameMode = Cast<ADelegateGameMode>(UGameplayStatics::GetGameMode(GetWorld()));if(DelegateGameMode == nullptr) return;if(DelegateGameMode->DeclareDynamicMulticastDelegate_00.IsBound()){DelegateGameMode->DeclareDynamicMulticastDelegate_00.Broadcast();}if(DelegateGameMode->DeclareDynamicMulticastDelegate_01.IsBound()){DelegateGameMode->DeclareDynamicMulticastDelegate_01.Broadcast(11);}
}
七、运行结果
1、运行开始
2、调用单播
3、调用多播
再次调用