関連ブログ
- [UE4][UE5]開発環境の容量を少しでも減らす 2024.08.14UE
- [UE5] PushModel型のReplicationを使い、ネットワーク最適化を図る 2024.05.29UE
- [UE5]マテリアルでメッシュをスケールする方法 2024.01.17UE
CATEGORY
2016.09.25UE4UE/ C++
UE4C++を使用されている方は、ほとんどの方が UE_LOG というマクロを使用したことがあると思います。
これは、UE4C++の最も一般的なログ出力方法です。
今回は、この UE_LOG マクロについて、少しだけ掘り下げた使い方をご紹介します。
UE_LOG マクロの定義は下記のようになっています。
1 |
#define UE_LOG(CategoryName, Verbosity, Format, ...) |
呼び出し時は、よく使う書き方であれば下記のようになるかと思います。
1 |
UE_LOG(LogTemp, Log, TEXT("MyIntValue=%d"), MyIntValue); |
まずは、これらの引数の意味を見ていきます。
その名のとおり、カテゴリ名です。
UE_LOGで出力されるログは、多くのカテゴリに分かれています。
エンジン側で用意されているものの他、自分でカテゴリを定義することも出来ます。(後述)
Google翻訳で直訳すると「冗長」という意味だそうです。
これは、ログの詳細度のようなものです。
通常使用するのは、下記の7段階になっており、後のものほど詳細なログという扱いになります。
ログ出力する文字列です。一般的なフォーマット文字列が使用できます。(%d とか %s とか)
これらの引数のなかでも、特によく分からないのが、Verbosityの Display/Log/Verbose/VeryVerbose かと思います。
普段、もっともよく使うのは「Log」になりますが、特に考えずに「Log」を使用すると、普段のテストプレイや、そのログとは全く関係ない機能をテストする際などにログが埋まってしまい、邪魔になってしまいます。
パフォーマンスを検証する場合にも、大量のログ出力は決して軽い処理ではありません。
しかし、その機能をテストするためだけに、プログラムを再ビルドする手間をかけるのも面倒です。
そこで「Verbose」や「VeryVerbose」を使用します。
UE_LOG記述時に適切にVerbosityを設定しておくことで、特定の機能についてより深くログを取得したい場合だけログ出力するように出来ます。
どのVerbosityまでのログを出力するかは、logコマンドを使用することでランタイム中に変更することが出来ます。
どのVerbosityまでログ出力するかの変更は、コンソールコマンド「log」を使用します。
例えば下記のコマンドで「LogParticles」カテゴリのログ出力を「Verbose」に切り替えられます。
1 |
log LogParticles Verbose |
「LogParticles」カテゴリのVerbosityを「Verbose」に設定すると、全てのエフェクトの再生開始タイミングが出力されるようになります。
カテゴリの一覧と、各カテゴリの現在の設定を確認したい場合は、
1 |
log list |
で確認出来ます。
例えば下記のようなコードを実行した場合、
1 2 3 4 5 6 |
UE_LOG(LogTemp, Error, TEXT("Error...")); UE_LOG(LogTemp, Warning, TEXT("Warning...")); UE_LOG(LogTemp, Display, TEXT("Display...")); UE_LOG(LogTemp, Log, TEXT("Log...")); UE_LOG(LogTemp, Verbose, TEXT("Verbose...")); UE_LOG(LogTemp, VeryVerbose, TEXT("VeryVerbose...")); |
Verbosityを「Warning」「Log」「VeryVerbose」に切り替えた際に、それぞれ下記のようなログが出力されます。
普段、通常のプレイの邪魔にならない程度の情報は「Log」で、詳細な調査を行いたいとき用のログは「Verbose」、かなり本気のデバッグ時に細かく追跡するときは「VeryVerbose」といった使い方がよいのではないでしょうか。
自分でログのカテゴリを定義するには、下記の2行を記述する必要があります。
1 |
DECLARE_LOG_CATEGORY_EXTERN(LogMyGame, Log, All); |
1 |
DEFINE_LOG_CATEGORY(LogMyGame); |
「DECLARE_LOG_CATEGORY_EXTERN」は、共通のヘッダファイル等に記述するとよいでしょう。
「DEFINE_LOG_CATEGORY」は、cpp側に記述します。
「DECLARE_LOG_CATEGORY_EXTERN」の第二引数はそのカテゴリのデフォルトのVerbosity、
第三引数はコンパイル段階で有効化するVerbosityです。
例えば第三引数をVerboseにすると、ランタイムで設定を切り替えても、VeryVerboseのログは出力されなくなります。
これで、下記のような記述が可能になります。
1 |
UE_LOG(LogMyGame, Log, TEXT("MyGameLog...")); |
ブループリント上でよく使う「PrintString」は「LogBlueprintUserMessages」カテゴリに出力されます。
Verbosityは、「Print to Log」がONの時は「Log」、OFFのときは「Verbose」になっています。
実は、「Print to Log」をOFFにしても、「LogBlueprintUserMessages」カテゴリを「Verbose」に変更すれば、OutputLogウィンドウには出力されます。
ちなみに、スクリーンへの出力はUE_LOGとは別になります。興味があれば、KismetSystemLibrary.cpp 内のPrintString関数を見てみて下さい。
OutputLogウィンドウに出力されたログは、通常、プロジェクトの Saved/Logs フォルダにテキストファイルとして保存されています。
パッケージ済みゲームでも、Development以下のビルドであれば、同様にパッケージフォルダ内の Saved フォルダに保存されます。
チーム内の他メンバーの環境で発生した問題や、エディタを閉じてしまったりクラッシュしてしまった場合でも、適切にログ出力しておけば、ここから情報が得られる可能性があります。
以上、UE_LOGについてのご紹介でした。