Visual Logger (ビジュアル ロガー) は、ゲームプレイ状態の視覚的表現を作成、記録し、そのデータをエディタ内でレビューする機能を提供する強力なデバッグ ツールです。デベロッパーは、プレイ セッション中にデバッグ出力をライブで確認したり、セッション終了後にエディタでレビューしたりできるため、ユーザーの報告やゲームの映像に基づくだけでは追跡が難しいゲームプレイのバグの解決が簡単になります。後でレビューするために情報を記録する機能は、稀な (再現が難しい) バグに対処する場合は特に重要です。例えば、ゲーム状態変数が 1 フレームの間変化するのが原因で発生する予期しない AI の動作について、データを記録して、バグが発生した前後のフレームをスクラブすることで事後調査できます。
ビジュアル ロガーを有効にするには、[Windows (ウィンドウ)] > [Developer Tools (デベロッパー ツール)] > [Visual Logger (ビジュアル ロガー)] のメニューを使用します。バージョン 4.7 より前の Unreal Engine では、コンソール コマンド「VisLog」を入力します。エディタを表示している場合は、ビジュアル ロガー ビューポートも開きます。
ビジュアル ロガー ビューポート
エディタのビジュアル ロガー ビューポートでは、記録済みのセッションのビジュアル ロガー出力をレビューして、事後にバグ レビューを行うことができます。
このビューポートには、視覚的データを記録したアクタすべてのリスト、アクタ リストで選択したアクタのステータスの詳細なスナップショット、デバッグ メッセージ出力を表示するテキスト ウィンドウ、記録データをスクラブできるタイム バーがあります。
アクタ リスト
次の画像で強調表示されている領域は、記録セッション中にビジュアル ロガーに情報が記録されたアクタのリストです。ユーザーが特定のアクタのログ情報をすばやく検索できるように、検索バーもあります。
アクタ スナップショット ビュー
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
この関数は、ビジュアル ロガーの最初の呼び出し時に自動的に実行されます。アクタ スナップショット ビューに表示したい情報を、この関数に何でも追加してください。
テキストをログ記録する
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
重複したメッセージを標準ログに送信する必要がある場合は、同じデータを使用して 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 |
矢印線分。 |
|