6. 自定义事件(Custom Event)
首先添加事件声明宏到 MyTriggerVolume 类中(不是 GameMode)
自定义事件声明如下:
DECLARE_EVENT(AMyTriggerVolume, FPlayerEntered)
第一个参数是具体实现事件的类,也是唯一能调用 Broadcast 的类
第二个参数是我们事件函数的签名
并添加刚刚声明的事件签名实例
FPlayerEntered OnPlayerEntered;
在 MyTriggerVolume.cpp 的 NotifyActorBeginOverlap 中
添加事件的广播代码:
// 自定义事件
// FPlayerEntered TriggerVolEventListenner
OnPlayerEntered.Broadcast();
如此,当玩家进入了触发区域,MyTriggerVolume 才会通过事件签名实例(OnPlayerEntered)进行广播,其他第三方类因为没有 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)
{
/// @NOTE 绑定
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 的触发事件上
(完)