BLOGブログ

2022.04.28UE4UE/ C++UE/ Plugin

[UE4] FCoreDelegates::OnInit に処理を登録する

執筆バージョン: Unreal Engine 4.27

みなさん、こんにちは!

「あ~この処理、FCoreDelegates::OnInit のタイミングで実行したいな~!」と思ったことはありませんか?

私はあります。

今回は、FCoreDelegates::OnInit に処理を登録する方法について見ていきましょう。

FCoreDelegates::OnInit とは?

FCoreDelegates::OnInit は、エンジンの初期化途中で Broadcast() される、エンジンに最初から用意されているデリゲートです。
FCoreDelegates::OnInit に処理を登録しておくと、エンジンの PreInit() 中のあるタイミングで処理を実行することができます。
詳しくは、エンジンコードの Engine/Source/Runtime/Launch/Private/LaunchEngineLoop.cpp を覗いてみてください。

FCoreDelegates::OnInit に処理を登録するには?

さて、「FCoreDelegates::OnInit に処理を登録」すれば、自前の処理をこのタイミングで実行することができます。
「『FCoreDelegates::OnInit に処理を登録』する処理」は「FCoreDelegates::OnInit.Broadcast()」よりもさらに早く実行しなければなりません。
これは UMyGameInstance::Init() よりずっと早いタイミングです。
いったいどこで実行すればよいのでしょうか…?

その答えの一つが「モジュールやプラグインのロードタイミング ELoadingPhase::PostConfigInit を利用する」です。

FCoreDelegates::OnInit に処理を登録してみよう

というわけで、MyOnInitPlugin というコードプラグインを作成してみましょう。

まずヘッダに、FCoreDelegates::OnInit.Broadcast() 時に呼んでほしい関数の定義を追加します。

次に、関数をデリゲートに登録する処理と、関数の中身を実装します。

そして、プラグイン設定ファイルのロードタイミング LoadingPhase を Default から PostConfigInit へ変更します。

このプラグインをビルドして有効化すると、FCoreDelegates::OnInit.Broadcast() 時に処理を行うことができます。
エンジンの初期化の早い段階で処理を行うことになりますので、処理の依存関係にはご注意くださいね!