このページには、Gameware NavigationWorld と Navigation Lab が提供するビジュアル デバッグ システムに関する詳細が含まれています。
各 World には VisualDebugServer クラスのビルトイン インスタンスが含まれています。このクラスは、次に示す Navigation Lab とのランタイム通信をすべて管理します。
VisualDebugServer をアクティブにする場合、VisualDebugServerConfig 設定オブジェクトを提供する必要があります。この設定オブジェクトには、必要に応じて設定できるいくつかのパラメータが含まれています。
最も重要な設定パラメータは、おそらくポートの設定である VisualDebugServerConfig::m_serverPort と VisualDebugServerConfig::m_broadcastPort です。この 2 つのパラメータは、サーバが入力接続をリッスンするのに使ったり、利用できることをブロードキャストするために使われるポートを決定します。ゲームに Navigation Lab を接続するのに問題がある場合は、これらのポートが開いていることを確認するか、ゲーム内および Navigation Lab の接続時に両方のパラメータを変更します。
WorldElement クラスから派生する各オブジェクト(Bot、動的な障害物、TagVolume、インタレスト ポイントなど)は、各フレームで Navigation Lab にネットワーク経由で自動的にデータを送信して、現在位置や速度などを通知します。デフォルトでは、各オブジェクトは、最も重要でよく使用される、現在位置、寸法、速度などの情報項目だけを送信するように設定されています。Navigation Lab でゲームをデバッグする場合、WorldElement の各クラスに対して表示する項目を、Visual debug パネルで選択できます。
各オブジェクト タイプは、Navigation Lab に追加の詳細情報を送ることもできます。たとえば、Bot は、パス フォローイングおよびダイナミック回避計算の状態に関する詳細情報を送信できます。ただし、ゲームと Navigation Lab の間のネットワーク通信帯域幅が大量に消費されるのを防ぐため、これらの詳細はデフォルトでは送信されません。
オブジェクトについて記録および送信できるデータの全範囲を確認する必要がある場合、そのオブジェクトを最大の詳細レベル(LoD)を使用するようにゲーム コード内で設定できます。これを行うと、オブジェクトは内部的に追加の表示リストを作成し、それを表示するために Navigation Lab に送信します。これらの追加の表示リストは、Visual debug パネルの Display lists の項目の下に表示されます。ただし、最大の LoD を使用するように設定されている Bot の場合、追加の表示リストのほとんどは、Visual debug パネルの Bot の項目の下に表示されます。他の表示リストと同様に、追加の表示リストに含まれるデータを表示または非表示にすることができます。
オブジェクトの SetCurrentVisualDebugLOD() メソッドを呼び出すことで、いつでも任意のオブジェクトに LOD を設定できます。次のいずれかのレベルを渡すことができます。
ScopedDisplayList クラスのインスタンスを設定することで、ゲームから Navigation Lab にユーザ独自の 2D シェイプと 3D ボリュームを送信することができます。
ScopedDisplayList クラスの API は、さまざまな共通のシェイプとボリュームを作成するためのメソッドを提供します。
作成するすべての ScopedDisplayList は、それを作成したフレームの後で、Navigation Lab に 1 回だけ送信されます。ただし、各表示リストには、Navigation Lab でそのデータが表示される期間を決定するライフスパンが含まれています。
単一フレームのライフスパンの表示リストは、Navigation Lab がゲームからその表示リストを受信すると 1 回だけレンダリングされます。単一フレーム表示リストのデータを、Navigation Lab で複数フレームに渡って表示するには、新しい ScopedDisplayList オブジェクトを各フレームで作成し直す必要があります。この方法は通常、頻繁に変更されるデータに使用されます。例:
{ Kaim::ScopedDisplayList displayList(navWorld); displayList.InitSingleFrameLifespan("Display list name", "Category name"); displayList.PushLine(gameBot->GetPosition(), Kaim::Vec3f::Zero(), Kaim::VisualColor::White); ... // Add more shapes here } // Here the ScopedDisplayList is sent to the Navigation Lab.
複数フレーム ライフスパンの表示リストも Navigation Lab に 1 回送信されますが、それ以降は修正または削除されるまですべてのフレームでレンダリングされます。ゲームプレイ セッションを通じてずっと変化のないデータがある場合、この方法を使用すると、各フレームで表示リストを再作成する計算をする必要がなくなり、各フレームで表示リストを再送信するのにかかわるネットワーク帯域幅を節約できます。
複数フレーム ライフスパンの表示リストは、指定したカテゴリ名と表示リスト名の組み合わせ、または DisplayListManager によって生成された数値 ID により一意に識別されます。
このカテゴリと名前の組み合わせ、または一意の ID を使用して、修正または削除が必要なときに表示リストを識別することができます。
// Get a unique ID m_displayListId = navWorld->GetDisplayListManager()->GenerateDisplayListId(); // Create a ScopedDisplayList: { Kaim::ScopedDisplayList displayList(navWorld); m_displayListId = displayList.InitUserControlledLifespan("Display list name", "Category name", m_displayListId); displayList.PushLine(gameBot->GetPosition(), Kaim::Vec3f::Zero(), Kaim::VisualColor::White); ... // Add more shapes here } // Here the ScopedDisplayList is sent to the Navigation Lab and rendered every frame. ... // Modify the existing ScopedDisplayList: { Kaim::ScopedDisplayList displayList(navWorld); m_displayListId = displayList.InitUserControlledLifespan("Display list name", "Category name", m_displayListId); ... // Add different shapes here } // Here the ScopedDisplayList is sent to the NavigationLab, replacing the previous display list. ... // Remove the existing ScopedDisplayList: { navWorld->GetDisplayListManager()->RemoveDisplayList(m_displayListId); // The list is no longer displayed in the Navigation Lab. }
Navigation Lab は、ゲーム内のフレームのデータを表示するたびに、Visual debug パネルの Display lists という見出しの下に、そのフレームで有効なすべての表示リストを、表示リストに提供されたカテゴリ名別に一覧表示します。これらのコントロールを使用して、3D ビュー内の各表示リストの表示/非表示を切り替えることができます。
たとえば、次のイメージでは、"MeleeCombat" はカテゴリ名であり、"MeleeDistance"、"MeleeEdgeCollector"、"MeleeTarget"、"VisitedTriangles" などの異なる表示リスト名を持つ表示リストに対して設定されています。これらの各表示リストには専用のチェックボックスがあり、共有カテゴリ名で整理されています。
ScopedDisplayList は、Bot や動的障害物などの特定の WorldElement と関連付けることができます。表示リストを WorldElement と関連付けると、そのオブジェクトに関連する情報の他の項目の変化に従って、Navigation Lab 内の表示リストのレンダリングをコントロールできます。
WorldElement を ScopedDisplayList と関連付けるには、GetVisualDebugId() メソッドを呼び出して WorldElement オブジェクトの ID を取得し、ScopedDisplayList の初期化でその ID を指定します。また、カテゴリ名を指定することができます。このカテゴリ名は Visual debug パネル内でその WorldElement の表示リストを整理するために使用されます。
前のセクションで説明したように、ユーザにコントロールされるライフスパンを持つ表示リストでは、カテゴリ名と表示名を組み合わせることによって、または一意の ID を明示的に指定することによって、表示リストを特定することができます。
ビジュアル デバッガにゲーム カメラの姿勢とパラメータを送信すると、Navigation Lab の 3D ビューのカメラをゲーム カメラの位置と方向に追従させることができます。
m_navigationWorld.GetVisualDebugServer()->SendGameCameraAttitude( m_coordSystem.ClientToNavigation_Pos(pos), m_coordSystem.ClientToNavigation_Normal(right), m_coordSystem.ClientToNavigation_Normal(up), m_coordSystem.ClientToNavigation_Normal(front), m_FOV);
Navigation Lab のコマンド ラインからカスタム コマンドを使用できるように、ゲームで VisualDebugServer を設定することができます。これにより、デバッグしているときに、ゲーム内のイベントをトリガすることができます。
コード サンプルについては、Tutorial_VisualDebug.cpp ファイルを参照してください。