地形のセクタ化

多くのプロジェクトでは、ゲームの途中のある時点でロードする必要がある地形の塊は、比較的小さなものだけです。これらの塊、すなわち「セクタ」は、必要に応じて(主にプレイヤーのキャラクタの動きに応じて)メモリの内と外でスワップされます。セクタを使用するかどうかの決定、およびセクタを編成する方法は、通常、制作ワークフロー、ゲームプレイのデザイン、および物理またはレンダリングなどの、エンジン内のサブシステムの技術的な考慮事項によって決定されます。

セクタ化へのアプローチ

NavData 生成フレームワークでは、標準的なプロダクション ワークフローとスムーズに連携でき、実行時に扱いやすいように設計された、複数のセクタを処理する非常に柔軟なシステムを提供します。

単一セクタの地形

Gameware Navigation では、複数のセクタを使用することは必須ではありません。地形全体を 1 回で NavData 生成システムに渡して、地形全体を覆う単一の NavMesh を生成できます。ただし、次の点に注意してください。

  • すべてのデータを保持するために、実行時に大量のメモリが必要になる可能性があります。データが表すエリアが増加すると、データのメモリ サイズが急速に増大します。
  • データ セットのサイズが増大すると、膨大な数の頂点とエッジを検索しなければならなくなり、パス ファインディング フレームワークのパフォーマンスが影響を受ける可能性があります。これは、到達不能な目的地へのパスを計算しようとしたときに顕著になります。なぜならば、NavMesh 内のすべてのトライアングルが必ず調べられるからです。

単一セクタ地形用に生成された NavData は、3D 空間で 2 つの NavData のセットがオーバーラップしている場合でも、実行時に自動的に他の NavData とつなぎ合わせることはできません。

ユーザ定義セクタ

多くのプロジェクトでは、隣接するセクタ間に求められる境界はゲームプレイによって決まります。たとえば、プレイヤーのキャラクタが特定の境界を越えると、前のエリアの衝突用ワールドやテクスチャはストリーミングされなくなり、新しいエリアの衝突用ワールドやテクスチャがストリーミングされるようになります。セクタの境界は、同じ地形で並行して作業しているアーティストとレベル デザイナとの作業の区分によって設定される場合もあります。この場合、それぞれが作業する個別のメッシュまたはサブレベルは、実行時に、ゲームの途中でひとまとまりの塊としてストリーミングされます。

このような状況では、他の種類のデータに使用するセクタやサブレベルとほぼ同じ境界を NavData のセクタに合わせる必要性を感じることが十分にありえます。NavData 生成ツールではこれが透過的にサポートされています。セクタ間の分割が、地形メッシュのトライアングルを Gameware Navigation システムに渡す方法によって明示的に定義されるからです。

この方法で作成された隣接するセクタを実行時にメモリにロードすると、その NavData は、どこでオーバーラップしても自動的につなぎ合わされます。

NavData 生成ツールでセクタを作成する

NavData 生成ツールによって、セクタ化の処理は若干異なります。NavData 生成フレームワークの API は最も柔軟なアプローチですが、他の場合と同様に、プロダクション パイプラインのニーズに合った任意のツールを選択できます。

セクタと Navigation Lab

現在、Navigation Lab は各 .obj ファイルに対して 1 つのセクタを作成します。

ただし、複数の .obj ファイルで設定した <sector> 定義が含まれている .navgenproj ファイルをロードする場合、Navigation Lab は、そのすべての入力 .obj ファイルのすべてのトライアングルをマージします。

セクタと NavData 生成 API

NavData 生成システムの API を直接使用する場合、地形のセクタ化を細かく制御できます。各セクタに GeneratorSectorConfig オブジェクトを 1 つ設定し、Generator に提供する GeneratorInputOutput 構造体にすべてのセクタを追加します。

  • 単一セクタ地形の作成: Generator でセクタを 1 つだけ定義し、そのセクタに地形全体のトライアングルのセットを提供することによって、単一セクタの地形を作成できます。
  • 複数のユーザ定義セクタの作成: 境界や内容を明示的に設定した複数のセクタを作成できます。Generator に対して作成する各セクタを個別に定義し、各セクタにそのセクタに含まれるべきトライアングルのみを入力します。

Generator は、NavData を作成すると、自動的に互いに隣接しているセクタを検出し、オーバーラップのエリアを処理して、実行時の自動でつなぎ合わせるためのデータを準備します。隣接するセクタを実行時につなぎ合わせるには、共通の境界に沿ったトライアングルが互いに非常に近い位置にあるか、オーバーラップしている必要があります。「セクタのオーバーラップの処理」を参照してください。