参考:
https://docs.unrealengine.com/zh-CN/Programming/UnrealArchitecture/Reference/Functions/index.html
https://docs.unrealengine.com/zh-CN/Programming/UnrealArchitecture/Delegates/Dynamic/index.html
实现一个简单的demo,主要通过拉近拉远来实现灯光的控制。
实现逻辑如下:
定义一个委托:
这里我定义的是一个有参数的委托
DECLARE_DELEGATE_OneParam(MyDelegate,bool)
/**
*
*/
UCLASS()
class TARRAYTEST_API ATArrayTestGameModeBase : public AGameModeBase
{
GENERATED_BODY()
public:
MyDelegate myDelegate;
};
实现触发函数:这里主要通过ExecuteIfBound在调用委托
void AMyTrigger::NotifyActorBeginOverlap(AActor* OtherActor)
{
GEngine->AddOnScreenDebugMessage(-1, 5.0f, FColor::Blue, FString::Printf(TEXT("%s is entered me!"), *(OtherActor->GetName())));
UWorld* TheWorld = GetWorld();
if (TheWorld != nullptr)
{
AGameModeBase* GameMode = Cast<AGameModeBase>(UGameplayStatics::GetGameMode(TheWorld));
ATArrayTestGameModeBase* MyGameMode = Cast<ATArrayTestGameModeBase>(GameMode);
if (nullptr != MyGameMode)
{
MyGameMode->myDelegate.ExecuteIfBound(true);
}
}
}
void AMyTrigger::NotifyActorEndOverlap(AActor* OtherActor)
{
GEngine->AddOnScreenDebugMessage(-1, 5.0f, FColor::Red, FString::Printf(TEXT("%s is leaving me!"), *(OtherActor->GetName())));
UWorld* TheWorld = GetWorld();
if (TheWorld != nullptr)
{
AGameModeBase* GameMode = Cast<AGameModeBase>(UGameplayStatics::GetGameMode(TheWorld));
ATArrayTestGameModeBase* MyGameMode = Cast<ATArrayTestGameModeBase>(GameMode);
if (nullptr != MyGameMode)
{
MyGameMode->myDelegate.ExecuteIfBound(false);
}
}
}
绑定委托:
void ATriggerListener::BeginPlay()
{
Super::BeginPlay();
UWorld* TheWorld = GetWorld();
if (TheWorld != nullptr)
{
AGameModeBase* GameMode = Cast<AGameModeBase>(UGameplayStatics::GetGameMode(TheWorld));
ATArrayTestGameModeBase* MyGameMode = Cast<ATArrayTestGameModeBase>(GameMode);
if (nullptr != MyGameMode)
{
MyGameMode->myDelegate.BindUObject(this,&ATriggerListener::EnableLight);
}
}
}
解绑委托
void ATriggerListener::EndPlay(EEndPlayReason::Type EEndPlayReason)
{
UWorld* TheWorld = GetWorld();
if (TheWorld != nullptr)
{
AGameModeBase* GameMode = Cast<AGameModeBase>(UGameplayStatics::GetGameMode(TheWorld));
ATArrayTestGameModeBase* MyGameMode = Cast<ATArrayTestGameModeBase>(GameMode);
if (nullptr != MyGameMode)
{
MyGameMode->myDelegate.Unbind();
}
}
}
委托的实现函数:
void ATriggerListener::EnableLight(bool Enable)
{
PointLight->SetVisibility(Enable);
}
另外能赋值给委托的函数,需要加上UFUNCTION()
看我的定义:
UFUNCTION()
void EnableLight(bool Enable);