BLOGブログ

2021.03.03UE4UE/ C++UE/ Debug

[UE4] VisualLoggerとはなんぞや。

執筆バージョン: Unreal Engine 4.26

こんちゃっす。
UE4に標準で用意されているVisualLogger。
触ったことないだけじゃなく、なにするものなのか分からなかったので調べてみました。

 

結論

ログをビジュアライズできる機能だった。

 

名前のまんま。

UE4でログを出すとなると、PrintStringだったり、UE_LOGでのテキスト出力ですが、
この機能では、タイムラインでの情報の確認、デバッグ形状(球体や線分など)の描画ができます。

開発のほとんどのバグはシンプルなバグで、バグの内容や画像、ログテキストだけで基本的には原因の特定が容易かと思いますが、
複雑なバグ、特にAI系のバグなどは上記だけではかなり難しいかと思います。動画だけだと足りないし、ログと照らし合わせるのもつらい。そもそも再現しない…。
VisualLoggerを使用することで、タイムラインを動かすことで特定秒数での情報が見やすくなりますし、エディタのビューポートで動きの確認も行えるため、かなり有用なのではないかと思います。
もしかしたら、拡張するともっといい感じに使えるかもしれませんね。

 

使用方法と機能

VisualLoggerはみんな大好きデベロッパーツールの中にあります。

ウィンドウ→デベロッパーツール→ビジュアルロガー

シンプルな見た目のVisualLogger

ログ記録の開始と保存


開始、一時停止、停止:ログの記録を操作します。
ロード:保存したログを読み込みます。
保存、すべて保存:保存は選択したオブジェクトのみ、すべて保存はログをとったすべてのオブジェクトを保存します。
クリア:全ての記録を削除します。
グラフ:よくわかりません。

ログの出力を行う

ログの出力を行うと↓のタイムライン出力したオブジェクトが追加されます。


左の欄から確認したいオブジェクトを選択し、右のタイムラインを動かすことで好きなポイントのログを確認できます。
この画像では1.5秒ごとにログの出力を行っています。

ログの出力はC++でソースコードを追加する必要があります。

〇テキストログの出力

以下のマクロを使用することでテキストログの出力を行うことができます。
マクロの内容は第一引数にOwnerがありますが、あとはUE_LOGと同じです。

/** 
* VisualLoggerにログを出力する。
* UE_VLOG(LogOwner, CategoryName, Verbosity, Format, ...)
*/
UE_VLOG(this, LogTemp, Log, TEXT("Location : %s"), *GetActorLocation().ToString());

/** 
* VisualLoggerと通常のログに出力する。
* UE_VLOG + UE_LOG
* UE_VLOG_UELOG(LogOwner, CategoryName, Verbosity, Format, ...)
*/
UE_VLOG_UELOG(this, LogTemp, Log, TEXT("Location : %s"), *GetActorLocation().ToString());

テキストログを出力するとテキストログビューで確認ができます。

〇デバッグ形状(球体や線分など)の描画

以下のマクロを使用することで球体や線分などのデバッグ形状を描画できます。

/**
* 線分の描画
* UE_VLOG_SEGMENT(LogOwner, CategoryName, Verbosity, SegmentStart, SegmentEnd, Color, Format, ...)
*/
UE_VLOG_SEGMENT(this, LogTemp, Log, FVector(0.0f, 0.0f, 0.0f), FVector(100.0f, 0.0f, 0.0f), FColor(255, 0, 0), TEXT("Segment"));

/**
* 球体の描画
* UE_VLOG_LOCATION(LogOwner, CategoryName, Verbosity, Location, Radius, Color, Format, ...)
*/
UE_VLOG_LOCATION(this, LogTemp, Verbose, GetActorLocation(), 10.0f, FColor(255, 0, 0), TEXT("PlayerLocation"));

上記以外にもボックスやコーンなど結構種類がありますので、調べてみてください。
入力したテキストと一緒にビューポートに表示されます。

スナップショット

ログを出力したタイミングで自動でスナップショットを取ってくれます。
ここに表示されるテキストはカスタムに設定できます。

スナップショットを取るには、IVisualLoggerDebugSnapshotInterfaceを継承させ、GrabDebugSnapshotをオーバーライドします。

#include "VisualLogger/VisualLoggerDebugSnapshotInterface.h"
class AMyCharacter : public ACharacter, public IVisualLoggerDebugSnapshotInterface
{
    ...
#if ENABLE_VISUAL_LOG
    //~ Begin IVisualLoggerDebugSnapshotInterface interface
    virtual void GrabDebugSnapshot(FVisualLogEntry* Snapshot) const override;
    //~ End IVisualLoggerDebugSnapshotInterface interface
#endif
}
#if ENABLE_VISUAL_LOG
#include "VisualLogger/VisualLoggerTypes.h"
#include "VisualLogger/VisualLogger.h"

void AMyCharacter::GrabDebugSnapshot(FVisualLogEntry* Snapshot) const
{
    FVisualLogStatusCategory LogStatusCategory;
    LogStatusCategory.Category = TEXT("My Project");
    LogStatusCategory.Add(TEXT("MyCharacter"), TEXT("AHAHAHAHAHAHAHA :D"));
    LogStatusCategory.Add(TEXT("Location"), *GetActorLocation().ToString());
    Snapshot->Status.Add(LogStatusCategory);
}
#endif

スナップショットは左下のスナップショットビューに表示されます。

 

VisualLogger自体は機能としてもシンプルでとても分かりやすかったです。
ほしいと思うタイミングは限られるかと思いますが、なかなか良さそうなのではないでしょうか。
是非みなさんも使ってみてください。