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 的触发事件上
(完)