Visual Logger (ビジュアル ロガー) は、ゲームプレイ状態の視覚的表現を作成、記録し、そのデータをエディタ内でレビューする機能を提供する強力なデバッグ ツールです。デベロッパーは、プレイ セッション中にデバッグ出力をライブで確認したり、セッション終了後にエディタでレビューしたりできるため、ユーザーの報告やゲームの映像に基づくだけでは追跡が難しいゲームプレイのバグの解決が簡単になります。後でレビューするために情報を記録する機能は、稀な (再現が難しい) バグに対処する場合は特に重要です。例えば、ゲーム状態変数が 1 フレームの間変化するのが原因で発生する予期しない AI の動作について、データを記録して、バグが発生した前後のフレームをスクラブすることで事後調査できます。
ビジュアル ロガーを有効にするには、[Windows (ウィンドウ)] > [Developer Tools (デベロッパー ツール)] > [Visual Logger (ビジュアル ロガー)] のメニューを使用します。バージョン 4.7 より前の Unreal Engine では、コンソール コマンド「VisLog」を入力します。エディタを表示している場合は、ビジュアル ロガー ビューポートも開きます。

Epic Games のサンプル StrategyGame のセッション中にビジュアル ロガーを使用している様子。紫色の線は AI のパスを示している。赤色の場所マーカーはタイムラインで選択した点を示している。
ビジュアル ロガー ビューポート
エディタのビジュアル ロガー ビューポートでは、記録済みのセッションのビジュアル ロガー出力をレビューして、事後にバグ レビューを行うことができます。

エディタのビジュアル ロガー ビューポート。
このビューポートには、視覚的データを記録したアクタすべてのリスト、アクタ リストで選択したアクタのステータスの詳細なスナップショット、デバッグ メッセージ出力を表示するテキスト ウィンドウ、記録データをスクラブできるタイム バーがあります。
アクタ リスト
次の画像で強調表示されている領域は、記録セッション中にビジュアル ロガーに情報が記録されたアクタのリストです。ユーザーが特定のアクタのログ情報をすばやく検索できるように、検索バーもあります。

アクタ リストと検索バー。
アクタ スナップショット ビュー
UE_VLOG
マクロでアクタが収集するデータは、次の画像で強調表示されている領域に表示されます。ビジュアル ロガーでは、アクタ リストで選択したアクタからのデータを、タイムライン スクラバで示された時間に表示します。スナップショットの一部としてビジュアル ロガーがキャプチャするデータは、ゲームのコード内でカテゴリ分けやカスタマイズできます。また、それらのカテゴリは展開したり折りたたんだりできます。
同じフレームで、同じアクタから複数のビジュアル ログ呼び出しを行うと、以前キャプチャしたデータは上書きされます。

アクタ スナップショット領域。カスタム カテゴリが展開されている。
テキスト ウィンドウ
ビジュアル ロガーのテキスト ウィンドウには、現在のフレームのログ メッセージがカテゴリ別に表示されます。同じカテゴリ、同じフレームで記録された複数のログ メッセージは、リストとして表示されます。

デバッグ メッセージが表示されるテキスト ウィンドウ領域。
タイムライン
タイムライン ビューには、任意の時点までロガーを進行 (または巻き戻し) するためのバーがあります。以下の画像では、スクラバが 23.53 秒の位置にあり、アクタ リストでは「StrategyAIController_1」が選択されています。タイム バーをスクラブすることで、記録されたログ データのさまざまな時点において、選択したアクタのステータスとテキスト ウィンドウを確認できます。

タイムライン領域。
ビジュアル ロガーのサポートを追加する
ビジュアル ロガーに追加できるデータ型は 3 つあります。
データ型 | 出力の説明 |
---|---|
アクタ スナップショット | アクタ スナップショット領域に表示されます。アクタが存在する間、1 フレームにつき 1 回更新します。 |
ログ メッセージ | ビジュアル ロガーで記録するすべてのテキストはテキスト ウィンドウに表示されます。テキストは 1 フレームごとに表示されます。 |
デバッグ形状 | ゲーム ワールドにはさまざまな形状を描画できます。それらの形状は複数フレームの間持続します。サイズや色など、調整可能なパラメータを持ちます。 |
アクタ スナップショットを撮影する
アクタ スナップショット ビューにデータを追加するには、まず IVisualLoggerDebugSnapshotInterface
インターフェース関数を以下のように実装しなければなりません。
class MYPROJECT_API AMyActor : public AActor, public IVisualLoggerDebugSnapshotInterface
このインターフェースに唯一存在する関数 GrabDebugSnapshot
はデフォルトでは何も行いません。この関数をオーバーライドしてビジュアル ロガーに情報を与えることができます。GrabDebugSnapshot
はビジュアル ロギングを有効にしたビルドのみで実行するので、これに関連するすべてのコード周りの ENABLE_VISUAL_LOG
マクロを確認することはグッドプラクティスです。たとえば、Actor クラスの関数定義には次のようなコード ブロックが含まれます。
#if ENABLE_VISUAL_LOG
//~ Begin IVisualLoggerDebugSnapshotInterface interface
// Adds information about this Actor to the Visual Logger.
virtual void GrabDebugSnapshot(FVisualLogEntry* Snapshot) const override;
//~ End IVisualLoggerDebugSnapshotInterface interface
#endif
次のサンプル コードは、GDC デモの一部です。FPS テンプレートの Character クラスをカスタマイズしたバージョンの AGDCCharacter
にビジュアル ログを追加しました。このコードは、"GDC Sample" カテゴリの下にエントリを 1 つ追加します。このエントリは、"Projectile Class" というラベルが付けられ、キャラクターが発射するときにスポーンする発射物のタイプを含みます。
#if ENABLE_VISUAL_LOG
void AGDCCharacter::GrabDebugSnapshot(FVisualLogEntry* Snapshot) const
{
Super::GrabDebugSnapshot(Snapshot);
const int32 CatIndex = Snapshot->Status.AddZeroed();
FVisualLogStatusCategory& PlaceableCategory = Snapshot->Status[CatIndex];
PlaceableCategory.Category = TEXT("GDC Sample");
PlaceableCategory.Add(TEXT("Projectile Class"), ProjectileClass != nullptr ?ProjectileClass->GetName() :TEXT("None"));
}
#endif
この関数は、ビジュアル ロガーの最初の呼び出し時に自動的に実行されます。アクタ スナップショット ビューに表示したい情報を、この関数に何でも追加してください。

AGDCCharacter のアクタ スナップショットが表示されているビジュアル ロガー。
テキストをログ記録する
UE_VLOG
マクロを使用してテキスト ウィンドウにログを記録できます。テキスト ウィンドウにはフレームごとに情報が表示されます。そのため、記録したデータをスクラブすると、現在のフレームでログ記録されたテキストのみが表示されます。テキストはどこでもログ記録できます。UE_VLOG
マクロは、ビジュアル ログ システムをサポートしていないビルドのコンパイルからは削除されるため、ENABLE_VISUAL_LOG
マクロを確認せずに使用しても問題ありません。このマクロは、テキストに関連付けられたアクタ、ログ カテゴリ、冗長性レベル (表示のフィルタリングに使用)、およびテキスト自体を示すパラメータを受け取ります。
次のサンプルコードでは、カスタマイズされた Character が UE_VLOG
を使用して、発射物を発射した後の情報を記録します。
void AGDCCharacter::OnFire()
{
// Try to fire a projectile
if (ProjectileClass != NULL)
{
// Collect our aim rotation.
const FRotator SpawnRotation = GetControlRotation();
// MuzzleOffset is in camera space, so transform it to world space before offsetting from the character location to find the final muzzle position.
const FVector SpawnLocation = GetActorLocation() + SpawnRotation.RotateVector(GunOffset);
UWorld const World = GetWorld();
if (World != NULL)
{
// Spawn the projectile into the world at the muzzle's location.
World->SpawnActor

AGDCCharacter のデバッグ テキストを表示するビジュアル ロガー。
重複したメッセージを標準ログに送信する必要がある場合は、同じデータを使用して UE_VLOG
を呼び出した後に UE_LOG
を続ける代わりに、UE_VLOG_UELOG
を使用します。
デバッグ形状を描画する
ゲーム ワールド内の形状情報をログ記録する機能は、何が起きているのかの視覚化に役立つ強力な機能です。次の画像は、ビジュアル ロガーでサポートされている各種形状の一部を示したものです。

パス情報、円柱、コーン、カプセル、ボックス形状。
次のマクロは、形状のログ記録のサポートを提供しています。各マクロには、形状を持ったアクタ、ログ カテゴリ、冗長性レベル、追加の形状定義パラメータ (形状によって異なる)、形状に伴うテキストが必要です。次の表に、利用可能な形状と、各形状に必要な追加パラメータに関する情報を示します。
形状 | 説明 | 追加のパラメータ |
---|---|---|
UE_VLOG_SEGMENT |
1 ピクセルの厚さの線分。 |
|
UE_VLOG_SEGMENT_THICK |
さまざまな厚さの線分。 |
|
UE_VLOG_LOCATION |
球。 |
|
UE_VLOG_BOX |
座標軸に平行なボックス。 |
|
UE_VLOG_OBOX |
回転したボックス。 |
|
UE_VLOG_CONE |
コーン。 |
|
UE_VLOG_CYLINDER |
円柱。 |
|
UE_VLOG_CAPSULE |
カプセル。 |
|
UE_VLOG_MESH |
3D メッシュ。 |
|
UE_VLOG_CONVEXPOLY |
2D 凸包ポリゴン。 |
|
UE_VLOG_ARROW |
矢印線分。 |
|