関連ブログ
- [UE4][UE5]開発環境の容量を少しでも減らす 2024.08.14UE
- [UE5] PushModel型のReplicationを使い、ネットワーク最適化を図る 2024.05.29UE
- [UE5]マテリアルでメッシュをスケールする方法 2024.01.17UE
CATEGORY
2022.04.28UE4UE/ C++UE/ Plugin
執筆バージョン: Unreal Engine 4.27 |
みなさん、こんにちは!
「あ~この処理、FCoreDelegates::OnInit のタイミングで実行したいな~!」と思ったことはありませんか?
私はあります。
今回は、FCoreDelegates::OnInit に処理を登録する方法について見ていきましょう。
FCoreDelegates::OnInit は、エンジンの初期化途中で Broadcast() される、エンジンに最初から用意されているデリゲートです。
FCoreDelegates::OnInit に処理を登録しておくと、エンジンの PreInit() 中のあるタイミングで処理を実行することができます。
詳しくは、エンジンコードの Engine/Source/Runtime/Launch/Private/LaunchEngineLoop.cpp を覗いてみてください。
さて、「FCoreDelegates::OnInit に処理を登録」すれば、自前の処理をこのタイミングで実行することができます。
「『FCoreDelegates::OnInit に処理を登録』する処理」は「FCoreDelegates::OnInit.Broadcast()」よりもさらに早く実行しなければなりません。
これは UMyGameInstance::Init() よりずっと早いタイミングです。
いったいどこで実行すればよいのでしょうか…?
その答えの一つが「モジュールやプラグインのロードタイミング ELoadingPhase::PostConfigInit を利用する」です。
というわけで、MyOnInitPlugin というコードプラグインを作成してみましょう。
まずヘッダに、FCoreDelegates::OnInit.Broadcast() 時に呼んでほしい関数の定義を追加します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
#pragma once #include "CoreMinimal.h" #include "Modules/ModuleManager.h" class FMyOnInitPluginModule : public IModuleInterface { public: /** IModuleInterface implementation */ virtual void StartupModule() override; virtual void ShutdownModule() override; private: // FCoreDelegates::OnInit.Broadcast() 時に呼んでほしい関数。 static void OnInitCalled(); }; |
次に、関数をデリゲートに登録する処理と、関数の中身を実装します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
#include "MyOnInitPlugin.h" #include "Misc/CoreDelegates.h" #define LOCTEXT_NAMESPACE "FMyOnInitPluginModule" void FMyOnInitPluginModule::StartupModule() { // This code will execute after your module is loaded into memory; the exact timing is specified in the .uplugin file per-module // FCoreDelegates::OnInit に関数を登録する。 FCoreDelegates::OnInit.AddStatic(&FMyOnInitPluginModule::OnInitCalled); } void FMyOnInitPluginModule::ShutdownModule() { // This function may be called during shutdown to clean up your module. For modules that support dynamic reloading, // we call this function before unloading the module. } void FMyOnInitPluginModule::OnInitCalled() { UE_LOG(LogTemp, Log, TEXT("FMyOnInitPluginModule::OnInitCalled() Executed !!")); } #undef LOCTEXT_NAMESPACE IMPLEMENT_MODULE(FMyOnInitPluginModule, MyOnInitPlugin) |
そして、プラグイン設定ファイルのロードタイミング LoadingPhase を Default から PostConfigInit へ変更します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
{ "FileVersion": 3, "Version": 1, "VersionName": "1.0", "FriendlyName": "MyOnInitPlugin", "Description": "", "Category": "Other", "CreatedBy": "", "CreatedByURL": "", "DocsURL": "", "MarketplaceURL": "", "SupportURL": "", "CanContainContent": true, "IsBetaVersion": false, "IsExperimentalVersion": false, "Installed": false, "Modules": [ { "Name": "MyOnInitPlugin", "Type": "Runtime", "LoadingPhase": "PostConfigInit" } ] } |
このプラグインをビルドして有効化すると、FCoreDelegates::OnInit.Broadcast() 時に処理を行うことができます。
エンジンの初期化の早い段階で処理を行うことになりますので、処理の依存関係にはご注意くださいね!