🐡

【UE5】BPで定義したイベントを自作C++関数に引数として渡す方法

2024/10/21に公開

概要

下記スクショの通り、たまにイベントを引数として渡せる機能があるのですが、自分でC++関数に渡すやり方がわからなかったので、調べてみたことを備忘録として記事にしました。

完成イメージはこういう感じのものをイメージしてます。

今回は自作のActorをC++側で用意し、Actorに対してDestroyActorが呼ばれたら自作イベントを呼ぶように実装しながら説明しようと思います。

環境

UE5.4.4

手順

  1. C++側にDelegateを用意する
  2. 用意したDelegateを引数にしたBlueprintCallable属性を入れた関数を用意する(今回は自作Actorに引数を作成します)
  3. BP側で用意した関数を呼ぶ

C++側にDelegateを用意する

下記のようにDelegateを定義します。

DECLARE_DYNAMIC_DELEGATE(FExampleDestroyDelegateActor); //自作Delegate

C++でのDelegateの書き方はまめおさんのこちらの記事を参考にさせていただきました。
UE4|IUE5 Delegate, EventDispatcherをC++で書く方法

今回はDECLARE_DYNAMIC_DELEGATEにしてますが、用途に応じてDECLARE_DELEGATEなどに変えていただければ幸いです。

用意したDelegateを引数にしたBlueprintCallable属性を入れた関数を用意する(今回は自作Actorに引数を作成します)

下記のように関数を定義して、実装します。

UFUNCTION(BlueprintCallable)
void RegisterDestroyDelegate(FExampleDestroyDelegateActor Delegate);
void AExampleDestroyDelegateActor::RegisterDestroyDelegate(FExampleDestroyDelegateActor Delegate)
{
    OnDestroyed.Add(Delegate); //Addにしてるのは別Delegateの内容をそのまま紐づけられたからそうしてます
}

Actorには元々Destroy時に呼ばれるコールバックOnDestroyedがあったため、今回はこちらを使って引数でもらったイベントを呼んでもらうようにします。

BP側で用意した関数を呼ぶ

自作Actorを継承したBPを作成し、下記のように実装します。

2秒後にアクターが破壊され、紐づけられた自作イベントのPrintStringが呼ぶようになっています。

余談

自分の場合ですが、よくイベントを引数に渡してるのを見かけるのがSetTimerByEventでした。
どうやって引数にイベントを渡すように定義して実装しているのかはこうなっていました。

FTimerHandle UKismetSystemLibrary::K2_SetTimerDelegate(FTimerDynamicDelegate Delegate, float Time, bool bLooping, bool bMaxOncePerFrame, float InitialStartDelay, float InitialStartDelayVariance)
{
    //以下処理
}

自分はRiderでプロジェクトを開いて、BPでSetTimerByEventを用意してそれをダブルクリックすると定義に飛べるので、それで今回のやり方を知りました。

終わりに

意外と調べても出てこなかったので、今回記事にさせていただきました。
参考になれば幸いです。

Discussion