Unreal Engine (UE) Advent Calendar 2023 シリーズ2一日目の記事です。
仕事でFWorldDelegatesの一部を利用したので、簡潔に調べた内容を記載します。
FWorldDelegatesに色々なデリゲートがありますが、全部調査する時間が取れなかったため、UWorldのTick処理中に呼ばれるDelegateに絞って紹介します。
使い方
以下のようにデリゲートを登録します。
// Worldから実行されるデリゲートを登録
FDelegateHandle OnPreTickHandle = FWorldDelegates::OnWorldPreActorTick.AddSP(this, &AMyActor::OnPreTick);
FDelegateHandle OnPostTickHandle = FWorldDelegates::OnWorldPostActorTick.AddSP(this, &AMyActor::OnPostTick);
※Blueprintでは使用できません。
何が便利か
C++限定の機能になりますが、レベルに配置された全ActorのTick実行前に何かしらの処理を挟みたい、逆に全ActorのTick実行後に何かしらの処理を挟みたい、という実装をしなければいけない場合に利用します。
かなり大雑把な例ですがネットワークを自前で実装したい場合、配置した全Actorの移動処理実行前に受信した座標をネットワークから取得して同期したい、全Actorの移動処理終了後に確定した位置情報をネットワークに送る等にFWorldDelegates::OnWorldPreActorTick、FWorldDelegates::OnWorldPostActorTickを利用すると要件を満たせます。
エンジン内部でも様々なモジュール、プラグインでOnWorldPreActorTick、OnWorldPostActorTick等を使用しているのでエンジンのソースコードを見ると結構面白い使い方を思いつくかもしれません。
Tickで呼ばれるデリゲート一覧
WorldのTickで呼ばれるデリゲート一覧です。
FWorldDelegates::OnWorldTickStart
エディターも含めて、配置された全ActorのTick処理実施前
エディターも含めた上でTickによる処理を実施する前に何かしらの処理を行いたい場合に使用します。
FWorldDelegates::OnWorldPreActorTick
配置された全ActorのTick処理実施前
ゲームプレイ時のみBroadcastが実行されます。全ActorのTick処理前に何かしらの処理を行いたい場合に使用します。
FWorldDelegates::OnWorldPostActorTick
配置された全ActorのTick処理終了後
ゲームプレイ時のみBroadcastが実行されます。全ActorのTick処理終了後に何かしらの処理を行いたい場合に使用します。
FWorldDelegates::OnWorldTickEnd
エディターも含めて、配置された全ActorのTick処理実施後
エディターも含めた全ActorのTick処理終了後に何かしらの処理を行いたい場合に使用します。
WorldのTickで呼ばれるデリゲートのタイミングを理解するために必須な資料
「UE4プログラマー勉強会 in 大阪 -エンジンの内部挙動について」の17ページから読むのを強くお勧めします。
Tick周りはUE5になった今でも非常に役に立つスライドです。
上記に加えてFWorldDelegatesのBroadcastが呼ばれるタイミングを理解すると、Tickが完全に理解できる...かもしれません。
特にActorのTickがどのように呼ばれているのか、をある程度理解できるかと思います。
(ここら辺読むとTick内で下手に組むと重くなると言われている理由も理解できる...かも)
※21ページにUWorld::Tickについて記載されています。
参考資料
今回記載したデリゲートのBroadcastが実行されているエンジンソースコードの場所
・LevelTick.cpp内のUWorld::Tick(1309行目あたり)
UE4プログラマー勉強会 in 大阪 -エンジンの内部挙動について
第005回 Tick関数がどう処理されているかUnrealC++を追ってみよう!
ドキュメント