BLOGブログ

2022.06.29UE4UE/ C++UE/ Debug

[UE4] Message Log を使って C++ 特定行へのジャンプ、 BP ノードへのリンクを実装する

執筆バージョン: Unreal Engine 4.27



皆さんこんにちは、エンジニアの森です

今回は、C++ から Message Log ウィンドウにログを出す方法と、 FTokenizedMessage の使い方について紹介します

Message Log ではなく Output Log ウィンドウにログを出すには以前の記事公式ドキュメントを参照してください

[UE4] UE_LOGについてあれこれ

目次

Message Log ウィンドウとは
PIE ログ出力
C++へのリンク
ブループリントノードへのリンク
ログリストを追加する
ブループリント Call Stack の表示
Build 実行時にエラーチェックしてログを出す
プロジェクトダウンロード


Message Log ウィンドウとは

Message Log は UE のメニューから[Window] >[Developer Tools] >[MessageLog]と選んだときに表示されるウィンドウです

メニューから Message Log を開く


Message Log の見た目

主にブループリント内で無効なオブジェクトへのアクセスや配列の範囲外参照をしたときなどは、ここにエラーが表示されます

今回は、Blueprint Function Library を使用して Message Log ウィンドウへのログ出力を制御する仕組みを作ります

また、このウィンドウ自体はエディター専用のものです

あらかじめランタイムモジュールを切り分けた上、ソースコード中では WITH_EDITOR マクロの中で利用するようにしています


PIE ログ出力

早速ログ出力処理を作りましょう

ログ出力には FMessageLog::AddMessageFMessageLog::Info を使います

ソースコードを書いていきますが、今回はあらかじめ「MyMessageLogRuntime」モジュールを作成しておきました

プロジェクト名は「MyMessageLog」です

本ブログ記事の最後にプロジェクトを載せているので、手元で結果を確認したい方はそちらからお願いします

適当な BP アクターを作って、これを呼び出しました

ログ出力 BP

すると、このようにログが出てきます

出力結果

FMessageLog::AddMessage を使うと、Output Log にも同じ内容が出力されます

一方で、 FMessageLog::Info を使う場合は、Output Log への出力は行われないようです

他の、FMessageLog::WarningFMessageLog::Message でも同様に Output Log へは出力されませんでした

このとき FMessageLog::CriticalError を使ったり、EMessageSeverity::CriticalError を使ってメッセージ表示しようとするとプログラムにブレークがかかります


C++へのリンク

C++ からログ出力するためのマクロを作りましょう

マクロの名前は「MY_LOG」とします

実装には FSourceCodeNavigation::OpenSourceFile を使います

マクロの中身で OnMessageTokenActivated を使用して、ログを出力した行へのリンクを仕込みます

エラーと警告は画面にも表示します

このように動作します↓

C++ ナビゲーションの動作

これで MY_LOG マクロを書いた行までジャンプする機能ができました

自分でエラーを出力すると、実行終了時の見慣れたダイアログも出てきます

エラーメッセージ


ブループリントノードへのリンク

今度は先ほど作成した BP ノードに対して同じものを作ります

(ノードを呼び出したグラフへのリンクを仕込みます)

以下、そのためのソースコードです

関数を CustomThunk にして、FFrame を取得し、FKismetDebugUtilities::FindClassForNode でノード情報を取得しています

このあたりのソースコードはエンジンのデフォルト実装を参考にしています(Kismet2/KismetDebugUtilities.h)

動作はこのようになります↓

BP ナビゲーションの動作

デリゲートを使用しているので、他にも任意のアクションを仕込むことができます

詳しくは公式ドキュメントのこちらデリゲートの項目を参照してください


ログリストを追加する

PIE 以外のログリストを追加してみます

追加には、 FMessageLogModule::RegisterLogListing を使用します

この関数は、既にリストが存在する場合には、それを「上書き」するようになっているので、先に FMessageLogModule::IsRegisteredLogListing で存在チェックが必要です

追加時に指定するパラメーターはこちらを参考にしてください

ログ登録 BP


ログリストの追加


ブループリント Call Stack の表示

BP のミスにより無限ループを起こしたときなどには、ログ内にコールスタックが表示されます

無限ループの BP



コールスタックが表示される

自作関数でもこのような UI 込みでコールスタックにログを出すものを作ってみます

↓動作

コールスタックが表示された


Build 実行時にエラーチェックしてログを出す

例えば、通常の SkeletalMeshActor をワールドに置いて、Skeletal Mesh 欄に None をセットすると、ビルド時に警告が出ます (メニューを開いて Map Check のみ実行しても確認できます)

このとき、アクター名をクリックすればワールド上でどこにあるアクターなのか分かります


Ctrl+Alt でドキュメントのプレビューも出てきます(文字化けしてますが…)


Ctrl+Alt ではなく単に Docs の部分をクリックすると、FMapErrorToken により以下のような形式で URL が生成され、そこに飛ばされます (実装は FDocumentationLink::ToUrl)

https://docs.unrealengine.com/4.27/en//Shared/Editor/MapErrors/index.html?utm_source=editor&utm_medium=docs&utm_campaign=msg_log

↑アクセスすると公式ドキュメントに飛びます

この機能を使うのは簡単で、AActor::CheckForErrors をオーバーライドするだけです

AActor::CheckForErrors をオーバーライドしましょう

オーバーライド関数の中で警告かエラーを出力すれば UE によってカウントされ、Map Check の結果としてユーザーに届きます

また、この関数は BP エディター上でコンパイルを走らせた時にも呼ばれていて、その場合もコンパイル中の Map Check ログとして出てくるようです

ログに出す内容としては FMapErrorToken はあえて使わず、アクターの情報 + 任意の URL に飛ばすのみにします

↓動作


というわけで、今回は Message Log ウィンドウにログ出力する方法を見ていきました

主にデバッグ目的で使用する方法を取り扱いましたが、IMessageToken の継承先を見るとまだまだ紹介できていない機能がありそうです

余裕がある方はさらに詳しく調べてみてください

ありがとうございました


プロジェクトダウンロード

今回作ったプロジェクトをダウンロードできます

UE バージョンは 4.27.2 です