6. 自定義事件(Custom Event)
首先添加事件聲明宏到 MyTriggerVolume 類中(不是 GameMode)
自定義事件聲明如下:
DECLARE_EVENT(AMyTriggerVolume, FPlayerEntered)
第一個參數是具體實作事件的類,也是唯一能調用 Broadcast 的類
第二個參數是我們事件函數的簽名
并添加剛剛聲明的事件簽名的執行個體
FPlayerEntered OnPlayerEntered;
在 MyTriggerVolume.cpp 的 NotifyActorBeginOverlap 中
添加事件的廣播代碼:
// 自定義事件
// FPlayerEntered TriggerVolEventListenner
OnPlayerEntered.Broadcast();
如此,當玩家進入了觸發區域,MyTriggerVolume 才會通過事件執行個體進行廣播,其他第三方類因為沒有 OnPlayerEntered,是以無法進行廣播(差別于将委托執行個體定義在 GameMode 當中)。
其次,建立一個 Actor 子類,命名為 TriggerVolEventListener
TriggerVolEventListener.h
UPROPERTY()
UPointLightComponent* PointLight;
UPROPERTY(EditAnywhere)
AMyTriggerVolume* TriggerEventSource;
UFUNCTION()
void OnTriggerEvent();
TriggerVolumEventListener.cpp
// Sets default values
ATriggerVolEventListener::ATriggerVolEventListener()
{
// Set this actor to call Tick() every frame. You can turn this off to improve performance if you don't need it.
PrimaryActorTick.bCanEverTick = true;
PointLight = CreateDefaultSubobject<UPointLightComponent>("PointLight");
RootComponent = PointLight;
}
// Called when the game starts or when spawned
void ATriggerVolEventListener::BeginPlay()
{
Super::BeginPlay();
if (TriggerEventSource != nullptr)
{
TriggerEventSource->OnPlayerEntered.AddUObject(this, &ATriggerVolEventListener::OnTriggerEvent);
}
}
// Called every frame
void ATriggerVolEventListener::Tick( float DeltaTime )
{
Super::Tick( DeltaTime );
}
// 改變燈光的顔色
void ATriggerVolEventListener::OnTriggerEvent()
{
PointLight->SetLightColor(FLinearColor(0, 1, 0, 1));
}
在確定 MyTriggerVolume 的指針(TriggerEventSource)合法之後,綁定 TriggerVolumeListener 的 OnTriggerEvent 回調函數指針到 MyTriggerVolume 的觸發事件上
(完)