【Unreal C++】⑦イベントディスパッチャー【UE4】
今回はイベントディスパッチャーについてです。
BPでの実装は以下を参考に。
unrealengine.hatenablog.com
動的マルチキャストデリケートでBP側のイベントディスパッチャーと同等の処理が出来るみたいです。
呼び出し側
DECLARE_DYNAMIC_MULTICAST_DELEGATEマクロを用いてクラスを作成します。
命名規則からクラス名には「F」の接頭辞が必要です。
また宣言の際にプロパティをBlueprintAssignableにする必要があります。
Call.h
#include "CoreMinimal.h" #include "Call.generated.h" DECLARE_DYNAMIC_MULTICAST_DELEGATE(FhogeDispather); UCLASS() class HogeProject_API ACall : public AActor { GENERATED_BODY() public: // Sets default values for this actor's properties ACall(); protected: // Called when the game starts or when spawned virtual void BeginPlay() override; public: // Called every frame virtual void Tick(float DeltaTime) override; //Event Dispather(Multicast Delegate) UPROPERTY(BlueprintAssignable) FhogeDispather hogeDispather; }
先ほど作成したクラスの変数のBroadcastメソッドを呼んであげます。
Call.cpp
#include "Call.h" ACall::ACall() { } ACall::HogeFunc() { hogeDispather.Broadcast(); }
受信側
Funcは呼び出したい処理です。
UFUNCTION()がついてないとクラッシュしました。
Receive.h
#include "CoreMinimal.h" #include "Call.h" #include "Engine.h" //GEngine #include "Receive.generated.h" UCLASS() class HogeProject_API AReceive : public AActor { GENERATED_BODY() public: // Sets default values for this actor's properties AReceive(); protected: // Called when the game starts or when spawned virtual void BeginPlay() override; public: // Called every frame virtual void Tick(float DeltaTime) override; //Event Dispather(Multicast Delegate) UFUNCTION() void Func(); }
BeginPlayでAddDynamicを用いて作成したクラスの変数と呼びたい処理をバインディングします。
Receive.cpp
#include "Receive.h" // Sets default values AReceive::AReceive() { } // Called when the game starts or when spawned void AReceive::BeginPlay() { Super::BeginPlay(); //Event Dispather for (TActorIterator<ACall>ActItr(GEngine->GameViewport->GetWorld()); ActItr; ++ActItr) { ACall* Call = *ActItr; Call->hogeDispather.AddDynamic(this, &AReceive::Func); } } void AReceive::Func() { //呼び出したい処理 }
以上で呼び出し(call)側のHogefunc関数が呼ばれるタイミングで受信(Receive)側のFunc関数が同時に呼ばれます。