環境
- Unreal Engine 5.3.2
- Rider 2023.3.3
概要
実際に記述方法として
先日登壇したUnreal Engine Meetup Connect - Vol.1 - ゲーム開発編にて紹介させていただきました。
Unreal Engine Meetup Connect - Vol.1 - ゲーム開発編 - connpass
本スライドのp12 - 15の内容をもう少し分かりやすくまとめた記事になります。
イスを支える技術 | ドクセル
ソースコードの全文は最後のまとめに貼ってあります。
コピペしていい感じに使ってください。
通常のUE_LOGのおさらい
以下のように記述するケースが多いかと思います。
UE_LOG(LogTemp, Log, TEXT("Log Message.")); UE_LOG(LogTemp, Warning, TEXT("Log Warning.")); UE_LOG(LogTemp, Error, TEXT("Log Error."));
これでもよいですが、LogTempはEngineやPlugin内でも100箇所近くで使用されており、何かと混在する可能性があります。
そのため、LogCateogoryを追加するのが望ましいです。
UE_LOGをもうちょっと使いやすくするには
今回のProject構成
プロジェクト/モジュール名 : Odin
プロジェクト構成
+- Source
+- Odin (Module名)
+- Odin.h
+- Odin.cpp
+- Odin.Build.cs
+- Odin.uproject
ここにOdinLoggerクラスを追加しました。
プロジェクト構成
+- Source
+- Odin (Module名)
+- Core
+- OdinLogger.h
+- OdinLogger.cpp
+- Odin.h
+- Odin.cpp
+- Odin.Build.cs
+- Odin.uproject
LogCategoryの追加
LogCategoryを追加するには
以下の2つのMacroを追加してやる必要があります。
DECLARE_LOG_CATEGORY_EXTERN({"LogCategoryName"}, Log, All); DEFINE_LOG_CATEGORY({"LogCategoryName"});
それぞれ、headerとcppに定義を追加します。
あとはUE_LOGを使用したいクラス箇所でOdinLogger.hをincludeして
以下のように記述することで独自のLogCategoryの使用が可能になります。
#include "Core/OdinLogger.h" ... (省略) UE_LOG(LogOdin, Log, TEXT("Odin Log Message."));
LogCategory を追加することの利点として
Output Log内のFilterが使えるようになることも利点の1つです。
UE_LOGを独自Categoryで再定義する
さて、先程の実装で新規にCategory分けができて便利になりました。
もう少し利便性を上げたいと思います。
都度UE_LOGのMacroを記述するのは結構手間ですので、以下の書き方だけで実行できるようにします。
ODIN_LOG(TEXT("Odin Log Message"));
先程追加したlog用のheaderファイルを以下のように改善します。
これでUE_LOGの呼び出しと検索がかなり楽になりました。
特にエラーだけやWarningだけを検索したいといったケースで役立つかと思います。
UE_LOGの場合だとEngine側のコードも検索にヒットしてしまうため、別途独自のLoggerを再定義するのはほぼほぼ必須だと思います。
ODIN_LOG(TEXT("Odin Log Message")); ODIN_WARNING(TEXT("Odin Log Warning")); ODIN_ERROR(TEXT("Odin Log Error."));
別Moduleでも使用したい場合
ここまでの実装では別Moduleからの呼び出しができません。
DECLARE_LOG_CATEGORY_EXTERNに少し手を加えるだけで対応ができます。
PrefixにModule名_APIを追加してやるだけです。
ODIN_API DECLARE_LOG_CATEGORY_EXTERN(LogOdin, Log, All);
まとめ
・独自のLogCateogoryを追加しよう
・UE_LOGの呼び出しを簡略化しよう
といった内容になります。
単純にUE_LOGの長い記述が短くなるだけでも楽になるので、こういった実装をするのも良いかなと思います。
最後にLoggerのheaderとcppの全文を載せておきます。
以上です!