PathEvent を監視する

PathEvent の概要

Bot によって所有されている LivePath は、パスに沿ってさまざまなタイプのイベントのリストを保持します。

これらの各イベントは、PathEvent オブジェクトによって表されます。LivePath は PathEventList を維持します。これは、PathEvent のインデックス付きリストと、イベント間の「インターバル」のインデックス付きリストです。PathEvent オブジェクトが維持するデータ メンバを使って、そのオブジェクトが表すイベント タイプの決定、3D 位置の検索、チェック ポイントの状態の取得と設定 (「チェック ポイントを使用する」参照) などを実行できます。

PathEventList を参照する

Bot::GetPathEventList() を呼び出すことで、LivePath 上のイベントのフル リストを取得できます。次に、リスト内のすべてのイベントに繰り返し、PathEventList クラスのメソッドを使用することができます。

ターゲット ポイントを使用する

PathEvent のフル リストには、Bot の現在の位置とターゲット ポイントの背後に隠されたイベントが含まれています。たとえば、その下限であったり、Bot が既に通過したイベント、ショートカットを選択して通過したイベントなどです。どのイベントが今後発生し、どのイベントが既に発生したかを知りたい場合があります。たとえば、特定の範囲内で、今後どのようなイベントがパスに沿って配置されているかだけを知りたい場合などです。

現在のターゲット ポイントを使用して、どのイベントが Bot の前方に配置されているかを知ることができます。

  1. パス フォローイング システムが Bot が到達したとみなす、パスに沿った現在のポイントを表す PositionOnLivePath オブジェクトを取得するために Bot::GetProgressOnLivePath() を呼び出します。
  2. 現在の進行ポイントがイベント上に配置されている(OnEventListStatus_OnEvent)か、2 つのイベント間のインターバルに配置されている(OnEventListStatus_OnInterval)かを判定するために PositionOnLivePath::GetOnEventListStatus() メソッドを呼び出します。
  3. PathEventList 全体の中でイベントまたはインターバルのインデックスを取得するために PositionOnLivePath::GetOnEventListIndex() メソッドを呼び出します。この値よりインデックスが低いイベントまたはインターバルは、Bot の後方に位置しています。この値よりインデックスが高いものは、前方のパスに配置されています。

    また PositionOnLivePath::GetNextPathEventIdx()PositionOnLivePath::GetPrevPathEventIdx() を呼び出すこともできます。ただし、戻り値を解釈する方法についての詳細は、『API リファレンス』の説明を参照してください。

次の NavTag を取得する

多くの場合、実際に認識する必要がある情報の項目は、次のイベントに関連付けられている NavTag だけです。たとえば、その NavTag がスマート オブジェクトに関連付けられている場合、Bot からスマート オブジェクトに指示を求めることが望ましいことがあります。

PathEventList と直接対話せずに、Bot::GetUpcomingEventNavTag() を呼び出すだけで、次のイベントの NavTag を特定できます。

新しい PathEvent の通知を登録する

特定の条件をテストするために、パス イベントのリストをアクティブに確認するのではなく、Bot を初期化した場合のカスタム イベント オブザーバ オブジェクトを登録することができます。Bot が PathEventList の作成、更新、破棄を実行する場合に、このオブザーバのメソッドを呼び出すため、新しいパス上のイベントに対応できます。

これはカスタム スマート オブジェクトの付いた Bots の登録と登録解除など、行われる必要があるカスタムの初期化ステップを実行する場合に有効なことがあります。たとえば、新しいパスで、ゲームプレイ中に閉じることがあるドアを使用する場合、ドアをコントロールするオブジェクトに Bot を登録することができます。ドアを閉じると、ドアを使用する予定だったキャラクタにそのことを通知できます。パスの再計算をトリガすることで、キャラクタはこれに対応できます。

この方法を使用するには:

  1. IPathEventListObserver から派生し、その仮想メソッドを実装するカスタム クラスを作成します。
  2. BaseNavigationProfile クラスまたは NavigationProfile クラスから派生する独自のクラスを作成し、BaseNavigationProfile::GetSharedPathEventListObserver() の実装に IPathEventListObserver クラスのインスタンスへのポインタを返させます。
  3. 新しい NavigationProfile を使用するように WorldBots を設定します。詳細は、「パス フォローイングをカスタマイズする」を参照してください。

コード サンプルについては、Tutorial_NavTag.cpp ファイルを参照してください。

実装サンプルについては、DefaultPathEventListObserver クラスを参照してください。前述のように、ユーザ独自のオブザーバを提供しない場合、デフォルトの NavigationProfile クラスは DefaultPathEventListObserver のインスタンスを使用します。このインスタンスは、NavMesh と NavMesh の外側境界を越えるパス エッジ間の NavGraph の頂点またはトランジションに対応する各イベントを、チェック ポイントとしてマークします。デフォルトでは、これがキャラクタのアプローチとなり、ショートカットを行わずに、NavGraph エッジをたどります。ユーザ独自の実装でこの動作を保持するには、DefaultPathEventListObserver からクラスを派生させ、ユーザ独自のクラス内のメソッドからインタフェースのこの実装を呼び出すことを検討してください。

チェック ポイントの詳細については、「チェック ポイントを使用する」を併せて参照してください。