パルテア

どうぶつの森の美術館 〜ゲームエンジン(Unity)グラフィックス カリンググループ API〜

カリンググループ API

CullingGroup は、独自のシステムを Unity のカリングおよび LOD パイプラインに統合する方法を提供します。これはさまざまな目的に使用できます。例えば:

現在実際に表示されているキャラクターの完全なゲームオブジェクトのみを使用しながら、群衆をシミュレートします

Graphics.DrawProcedural によって駆動される GPU パーティクル システムを構築しますが、壁の後ろにあるパーティクル システムのレンダリングはスキップします

プレイヤーが視界に「ポップ」するのをプレイヤーに見られずに敵をスポーンさせるために、どのスポーンポイントがカメラから隠されているかを追跡します。

キャラクタが近くにいるときはフル品質のアニメーションと AI 計算から、遠くにいるときは低品質で安価な動作に切り替えます。

シーン内に 10,000 個のマーカー ポイントがあり、プレーヤーがそれらのいずれか 1 メートル以内に近づいたことを効率的に検出します。

API は、境界球の配列を提供することで機能します。次に、特定のカメラを基準としたこれらの球の可視性が、LOD レベル番号のように扱うことができる「距離バンド」値とともに計算されます。

CullingGroup の使用を開始する

CullingGroups を操作するためのコンポーネントやビジュアル ツールはありません。これらはスクリプト経由で純粋にアクセスできます。

CullingGroup は、「new」演算子を使用して構築できます。

CullingGroup group = new CullingGroup();

CullingGroup に可視性や距離の計算を実行させるには、使用するカメラを指定します。

group.targetCamera = Camera.main;

BoundingSphere 構造体の配列を作成して球の位置と半径を設定し、実際に配列内にある球の数とともに SetBoundingSpheres に渡します。球の数は配列の長さと同じである必要はありません。 Unity では、実際に配列内にある球の初期数が非常に少ない場合でも、一度に最も多くの球を保持できる十分な大きさの配列を作成することをお勧めします。より大きな配列を使用すると、実行時に配列のサイズを変更するという計算コストのかかるプロセスを行わずに、必要に応じて球を追加または削除できます。

BoundingSphere[] spheres = new BoundingSphere[1000];
spheres[0] = new BoundingSphere(Vector3.zero, 1f);
group.SetBoundingSpheres(spheres);
group.SetBoundingSphereCount(1);

この時点で、CullingGroup はフレームごとに 1 つの球の可視性の計算を開始します。

CullingGroup をクリーンアップして、使用しているすべてのメモリを解放するには、標準の .NET IDisposable メカニズムを使用して CullingGroup を破棄します。

group.Dispose();
group = null;

onStateChanged コールバックを介して結果を受信する

球体の可視性や距離の状態の変化に応答する最も効率的な方法は、onStateChanged コールバック フィールドを使用することです。これを、CullingGroupEvent 構造体を引数として取る関数に設定します。カリングが完了した後、状態が変化した各球体に対して呼び出されます。 CullingGroupEvent 構造体のメンバーは、球体の以前の状態と新しい状態を示します。

group.onStateChanged = StateChangedMethod;

private void StateChangedMethod(CullingGroupEvent evt)
{
if(evt.hasBecomeVisible)
Debug.LogFormat("Sphere {0} has become visible!", evt.index);
if(evt.hasBecomeInvisible)
Debug.LogFormat("Sphere {0} has become invisible!", evt.index);
}

CullingGroup Query API を介した結果の受信

onStateChanged デリゲートに加えて、CullingGroup は、境界球配列内の球の最新の可視性と距離の結果を取得するための API を提供します。単一の球の状態を確認するには、IsVisible メソッドと GetDistance メソッドを使用します。

bool sphereIsVisible = group.IsVisible(0);
int sphereDistanceBand = group.GetDistance(0);

複数の球の状態を確認するには、QueryIndi​​ces メソッドを使用します。この方法では、連続した範囲の球体をスキャンして、指定された可視性または距離の状態に一致する球体を見つけます。

// Allocate an array to hold the resulting sphere indices - the size of the array determines the maximum spheres checked per call
int[] resultIndices = new int[1000];
// Also set up an int for storing the actual number of results that have been placed into the array
int numResults = 0;

// Find all spheres that are visible
numResults = group.QueryIndices(true, resultIndices, 0);
// Find all spheres that are in distance band 1
numResults = group.QueryIndices(1, resultIndices, 0);
// Find all spheres that are hidden in distance band 2, skipping the first 100
numResults = group.QueryIndices(false, 2, resultIndices, 100);

クエリ API によって取得される情報は、CullingGroup によって使用されるカメラが実際にカリングを実行するときにのみ更新されることに注意してください。


    Course

  • 日時:2024/04/01 ~ 2025/03/31
  • 名称:どうぶつの森の美術館 〜ゲームエンジン(Unity)グラフィックス カリンググループ API〜
  • 場所:オンラインゲーム
  • 料金:¥0 (消費税込)