1.委托声明和定义
首先创建GameMode类(AMyGameModeBase)
在AMyGameModeBase.h委托声明和定义
//声明委托
DECLARE_MULTICAST_DELEGATE_OneParam(FMyDelegate, bool);
UCLASS()
class TEST_API AMyGameModeBase : public AGameModeBase
{
GENERATED_BODY()
public:
//实例化委托
FMyDelegate MyDelegate;
};
2.绑定事件
先创建一个Actor类 (AMyLight)
导入头文件 #include "MyGameModeBase.h"
在BeginPlay中,要先得到当前世界的GameMode,再转成自己创建的MyGameMode,然后绑定自己类定义的方法(SwitchLight)
void AMyLight::BeginPlay()
{
Super::BeginPlay();
UWorld *MyWorld = GetWorld();
if (MyWorld)
{
//得到当前世界的GameMode,再转成自己创建的MyGameMode
AGameModeBase *GameModeBase = UGameplayStatics::GetGameMode(MyWorld);
AMyGameModeBase *MyGameMode = Cast<AMyGameModeBase>(GameModeBase);
if (MyGameMode)
{
//绑定函数到委托中
MyGameMode->MyDelegate.AddUObject(this, &AMyLight::SwitchLight);
}
}
}
void AMyLight::SwitchLight(bool Value)
{
MyLight->SetVisibility(Value);
}
3.执行委托
创建一个Actor(MyTrigger.h)
导入头文件 #include "MyGameModeBase.h"
定义一个方法 DoExecute,DoExecute中通过MyGameMode->MyDelegate.Broadcast(value)进行广播(带一个参数),这样在第二步是绑定了该委托的方法就会执行。
void AMyTrigger::DoExecute(bool value)
{
UWorld *MyWorld = GetWorld();
if (MyWorld)
{
AGameModeBase *GameModeBase = UGameplayStatics::GetGameMode(MyWorld);
AMyGameModeBase *MyGameMode = Cast<AMyGameModeBase>(GameModeBase);
if (MyGameMode)
{
//委托广播
MyGameMode->MyDelegate.Broadcast(value);
}
}
}