zer0から始めるプログラミング生活

unreal EngineやUnityのTipsを書いていきます。

【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関数が同時に呼ばれます。