CullingGroup は、独自のシステムを Unity のカリングと LOD パイプラインに統合する方法を提供します。この方法は、以下のような多くの目的に使用できます。
API は境界球の配列を提供することで機能します。その後、1 台の特定のカメラに対する境界球の可視範囲が、LOD と同様に扱える ‘距離幅’ の値とともに計算されます。
プロジェクトにどのように CullingGroup を利用するか考えるときは、以下の CullingGroup 設計の特徴を考慮してください。
CullingGroup の可視範囲計算で求める容量は、境界球 (実際には位置 (スフィアの中心) と半径の値) によって決定します。パフォーマンス上の理由で、他の形状の境界は使用できません。実際の作業ではカリングするオブジェクトを完全に囲むスフィアを定義することになります。しっかりとフィットさせる必要がある場合は、複数のスフィアでオブジェクトの各部分を囲み、すべてのスフィアの可視状態に基づいて判断します。
可視範囲を判断するために、CullingGroup は可視範囲の計算に使用するカメラの情報を必要とします。現在、1 つの CullingGroup は、1 つのカメラしかサポートしません。複数のカメラに対する可視範囲を判断する場合は、1 つのカメラに対し 1 つの CullingGroup を使用し、それぞれの結果を総合します。
CullingGroup は、視錐台カリングと静的オクルージョンカリングにのみ基づいて可視範囲を計算します。動的オブジェクトは遮蔽物として計算に考慮されません。
CullingGroup は、参照位置 (カメラやプレイヤーの位置など) から各スフィアの最も近い点までの距離を計算することができます。この距離値は直接提供されるのではなく、離散的な “距離幅” の整数結果を計算するために、指定した一連のしきい値を使用して量子化されます。これらの距離幅を ‘近距離’、‘中距離’、‘遠距離’ と解釈して使用することを目的としています。
オブジェクトがある幅から他の幅へ移動するとき、CullingGroup はコールバックを実行します。この機会に、オブジェクトのビヘイビアを CPU 負担の少ないものへ変更したりすることができます。
最後の距離幅を超えるすべてのスフィアは不可視と判断されるため、遠くにあるオブジェクトを完全に非アクティブ化するカリングを簡単に実行できます。この動作が不要な場合は、最後のしきい値を無限に遠い距離に設定します。
各 CullingGroup につき、1 つのリファレンス位置しかサポートされません。
CullingGroup API では、シーンを変更した後すぐに境界球の新たな可視範囲の状態をリクエストすることはできません。パフォーマンス上の理由で、CullingGroup はカメラ全体のカリングの実行中しか新しい可視範囲情報を計算できません。コールバックと CullingGroup クエリ API のどちらを使っても、情報が取得できるのはこのタイミングです。つまり、実際の作業では非同期で CullingGroup を使用することになります。
CullingGroup に使用した境界球配列は、CullingGroup によってコピーされず参照されます。これはつまり、SetBoundingSpheres に渡す配列の参照を保持するということであり、もう一度 SetBoundingSpheres を呼び出すことなく、この配列のコンテンツを変更できるということです。例えば複数のカメラを使用する場合など、同じ一式のスフィアの可視範囲と距離を計算する複数の CullingGroup が必要なときは、すべての CullingGroup に同じ境界球配列のインスタンスを共有させると効率的です。