UDN
Search public documentation:

NavigationMeshTechnicalGuideJP
English Translation
中国翻译
한국어

Interested in the Unreal Engine?
Visit the Unreal Technology site.

Looking for jobs and company info?
Check out the Epic games site.

Questions about support via UDN?
Contact the UDN Staff

ナビゲーションメッシュ テクニカルガイド

ドキュメント概要: ナビゲーション メッシュ システムの技術的側面に関する概要。Unreal Engine におけるナビゲーション メッシュ システムの紹介は ナビゲーションメッシュ参照 を参照。

ドキュメントの変更ログ: Matt Tonks により作成されアップデート。

概要

このドキュメントは、AI がナビゲーションメッシュ (別名: nav mesh) を使えるように「橋渡し」を行うための早業ガイドです。 Unreal Engine におけるナビゲーション メッシュ システムの紹介は、 ナビゲーション メッシュを参照 を参照してください。

ナビゲーションハンドル

(NavigationHandle.UC)

以前は、すべてのパス検索機能は Pawn に含まれていました。ナビゲーション メッシュに基づくパス検索のすべての新しい機能は、ナビゲーション ハンドルと呼ばれる内蔵型のオブジェクトにカプセル化されています。ナビゲーション ハンドル自体はコンポーネントであり、パスしたいものとともにどのようなアクタにもアタッチすることができます。さらに、ハンドルはパス検索の出力を格納します。これは、生成されたパスを格納し、行っているパス横断のタイプに関係あるほかのすべてを格納するように拡張することもできるということです。

AI がパス検索をするには、以下が必要です:

  • interface_navigationhandle の実装 (インターフェースに関しては後ほど解説)。
  • navigationhandle コンポーネントをどこかでアクセス可能にしておく。

ナビゲーションハンドルの機能

ナビゲーション ハンドル機能には、大まかに以下の 3 つのカテゴリがあります:

  1. 実際のパス検索 (制約/終点評価コントロールを含む)
  2. パスに従う関数
  3. navmesh からデータをクエリーする関数

実際のパス検索機能

パス検索は、パス制約と終点評価を活用して実行されます。詳細な情報は、制約と終点評価のページを参照してください。 パス検索をするには、少なくとも 1 つの制約と 1 つの終点評価がセットアップされている必要があります。これをするには、通常、以下のような何らかの標準的な関数を追加するのが良いでしょう:

   event bool GeneratePathTo( Actor Goal, optional float WithinDistance, optional bool bAllowPartialPath )
   {
      if( NavigationHandle == None )
         return FALSE;

      AddBasePathConstraints(false);

      class'NavMeshPath_Toward'.static.TowardGoal( NavigationHandle, Goal );
      class'NavMeshGoal_At'.static.AtActor( NavigationHandle, Goal, WithinDistance, bAllowPartialPath );

      return NavigationHandle.FindPath();
   }
   

サンプルコードはこちらです。 TestAI_ExampleCode_v2.zip: navigationhandle パス関数の仕様例

  • FindPath - これは、A* ループを実行し、終点評価スタックが適切な終点を見つけたと決定するまで、または作業セットが空であると決定する (試行するノードがなくなる) まで実行されます。その後、検索が成功すると TRUE を返し、findpath を呼び出した navigationhandle の pathcache に結果となるパスが格納されます。よりカスタム化されたパス検索の状況 (例: カバー検索) では、終点評価は、その内部の考慮によっては、余分なデータを格納することができます。

パスに従う関数

  • SetFinalDestination - この関数は、navigationhandle で FinalDestination パラメータを設定します。これは、2 つの理由から必要となっています。1 つ目はpathcache はエッジのリストなので、ボットが最後のエッジに到達すると、パスの最後のポリゴンで、パスの実際の終点ポイントにボットが到達するのにより情報が必要となるからです。2 つ目は、これがすべてのパス検索で自動に設定されていないのは、終点に向かって現在歩いている AI が、実際のそこへのパスと関連しないパス検索を行う可能性があり (例: どこかを走っている間にカバーを探す)、従ってこの場合、現在格納されている finaldest を上書きしないようにするためです。備考: 特定の終点評価 (すなわち NavMeshGoal_At) は、既に設定されていない場合、これを自動的に設定します。これは、従来のパス コントロールの状況でのみ使用できるからです。

  • GetNextMoveLocation - これは、パスに従う関数の重要なものです。パスに沿って現在どこにいるかを決定し、空間内でエンティティがどこに移動すればよいかを計算します (例: MoveTo() にどのポイントを供給するかを計算します)。

Navmesh クエリー関数 ここにリスト化するには多すぎるので、ナビゲーション ハンドル関数の完全なリストは、 ナビゲーション メッシュ参照 を参照してください。注目すべきものは以下の通りです。

  • PointReachable - これは、navmesh 生成プロセスによって生成される障壁メッシュに対してラインチェックを行います。これは、衝突ジオメトリに対して通常のラインチェックを行うよりもずっと速く、通常の到達可能チェックをするよりも速いです (これには、数々のラインチェックが関わってきます)。
  • GetValidPositionsForBox - これは、与えられた境界内でパスされたボックスのすべての有効な (そして重複していない) 位置を返します。スポーン ロケーションを見つける場合などに有用です。

ナビゲーションインターフェース

(Interface_NavigationHandle.uc) ナビゲーションハンドル インターフェースを使うことで、ナビゲーション メッシュ上で任意のアクタがパス検索を実行できます。パス検索時には、対象エンティティの特定の基本属性 (幅、サポートしているエッジなど) が必要で、パス検索関数がパス検索エンティティの性能を判断するためにクエリーするのが、このインターフェースです。

このインターフェースの現在の状態は以下のとおりです。

   virtual UBOOL   AbleToSearch()=0;
   virtual FVector   GetSearchExtent()=0;
   virtual FVector   GetSearchStart()=0;
   virtual UBOOL   CanMantle()      { return FALSE; }
   virtual UBOOL   CanCoverSlip()   { return FALSE; }

これらの関数は入力を取るので、SetupPathfindingParams にパックして、他のパラメータのようにキャッシュすることができません。

  • CanCoverSlip - パスされた coverlink を考慮して、このエンティティがこの場所でカバースリップ (カバーからカバーへローディ ランする) できるかどうかを決定します。
  • GetEdgeZAdjust - パスされたエッジを考慮して、この AI がそこをパス コントロールするのにどのポイントを使用すれば良いか、そのエッジのサーフェス上の高さを決定します (例: 辺りをうろつく AI は、これをオーバーライドして、パス可能な空間のトップ近くに移動できます)。
  • CheckMantleValidity - マントル エッジを使用する前に、エンティティのカスタム検証を可能にします。

パス検索のパラメータのほとんどは、SetupPathfindingParams を使用して設定され、パス検索中にキャッシュされます。

  • SetupPathfindingParams - 以下が、簡単な実装です。

void AController::SetupPathfindingParams( FNavMeshPathParams& out_ParamCache )
{
   VERIFY_NAVMESH_PARAMS(8);
   if(Pawn != NULL)
   {
      out_ParamCache.bAbleToSearch = TRUE;
      out_ParamCache.SearchExtent = Pawn->GetCylinderExtent()+NavMeshPath_SearchExtent_Modifier;
      out_ParamCache.SearchStart = Pawn->Location;
      out_ParamCache.bCanMantle = Pawn->bCanMantle;
      out_ParamCache.bNeedsMantleValidityTest = FALSE;
      out_ParamCache.MaxDropHeight = GetMaxDropHeight();
      out_ParamCache.MinWalkableZ = Pawn->WalkableFloorZ;
      out_ParamCache.MaxHoverDistance = (Pawn->bCanFly) ? -1.f : DEFAULT_BOX_PADDING;
   }
        else { ... }
}

VERIFY_NAVMESH_PARAMS マクロに注目してください。これは、ここで指定されたパラメータの数が navigationhandle で指定された NUM_PATHFINDING_PARAMS にマッチしない場合、コンパイル時間アサーションを投入します。これは、パラメータのケースが追加されて、クライアント実装で適切にセットアップされないことを防止します。

以下が、ここにリストされるすべてのパラメータの説明と何に使用されるかの解説です。

  • Interface - 現在パス検索しているエンティティのインターフェース参照へ戻るポインタです。
  • bCanMantle - このエンティティがカバー マントルを使用できるかどうかを格納します。
  • bNeedsMantleValidityTest - CheckMantleValidity が、このエンティティに呼び出されるべきかどうかを格納します (これを必要としない AI が不必要な vfunction 呼び出しを取得しないようにするため)。
  • bAbleToSearch - このエンティティは検索に使用するのに有効かどうかをチェックします (ポーンを持っているかどうかなど)。
  • SearchExtent - パス コントロールしているエンティティのサイズです。これは、AI がどのエッジを通り抜けることができるかを決定するのに使用されます。@備考: これは、X/Y 次元のもっとも大きい方を使用します。パス検索範囲は、対称でなければいけません。対称でない場合、(リーダーの範囲を持つ長い電車のようなオブジェクト パスに関して) 強制的に対称にされます (そして残りはそれに従います)。@ FNavMeshEdgeBase::Supports() を参照してください。
  • SearchStart - 検索を開始する位置です。
  • MaxDropHeight - この AI が落ちる (例: 崖から落ちるなど) ことが可能な最大の高さです。
  • MinWalkableZ - この AI が歩くことの可能なもっとも勾配の急な坂を表します (サーフェス法線の Z コンポーネント)。
  • MaxHoverDistance - この AI がうろつくことを許可されているポリゴン上の最大距離です (アンカー ポリゴンを決定するのに使用されます。例えば、厳密には重複する 2 つのポリゴンに AI がいる場合、中にいるとみなされるぐらいサーフェスに実際に近いのはどちらか、ということです)。

Nav Mesh デバッギング

ランタイム時のナビゲーション メッシュ パス検索のデバッギング問題に関する詳細な情報は、 Nav Mesh Path Debugging ページを参照してください。