PaperSloth’s diary

主にゲーム開発関連についての記事を書きます。

UE5 UE_LOGをもうちょっと使いやすくする話

環境

概要

実際に記述方法として
先日登壇した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の全文を載せておきます。

以上です!