天天看點

事件處理(Handling Events)和委托(Delegate)代碼示例(三)【UE4】【C++】

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 的觸發事件上

(完)

繼續閱讀