自分は基本的にUnityはVRChat向けにプロジェクトを作っているんですが、オクルージョンカリングについてとりあえず基本的な設定や機能を解説していきます。
バージョンは2022.3.22f1
主な参考動画は以下の動画です。
🔍 オクルージョンカリングとは?

カメラから見えていない(遮られている)オブジェクトを描画しないようにする仕組みです。
遮蔽物(たとえば家の壁や地形の丘)で後ろにあるものが隠れているとき、それを描画からスキップして処理を軽くします。
オクルージョンカリングでは、カメラから見えないオブジェクトをあらかじめ判断できるように、シーン全体を複数の「セル(区画)」に分けて、各セルごとに「どのオブジェクトが見えるか/見えないか」という可視性のデータを焼き込んで保存します。これにより、プレイ中に不要なオブジェクトを描画せずに済むため、処理を軽くできます。
設定をきっちりやればやるほど、見えない部分をとにかく描画しないよう努力してくれます。

よくUnityの最適化・軽量化、パフォーマンス改善に使われる機能です。ゲーム中のFPS改善にもつながります。きっちり設定をして、見える部分以外のメッシュ、ポリゴンを描画せずにいい感じに表示させましょう。
オクルージョンカリングの適用方法
まずオブジェクトのstaticにチェックをいれる
準備として、静的オブジェクト(固定されて動かないオブジェクト:机、家、など)を選択し、staticの項目にチェックをする必要があります。オクルージョンカリングは基本的には静的なオブジェクトに適用されるものなので、staticにチェックされたオブジェクトがなかったら適用できません。

オブジェクトを選択してInspector右上のstaticにチェックします。

オブジェクトが多いときは、ある程度親のオブジェクトにまとめて、その親オブジェクトのStaticにチェックします。

このように子要素にもstaticのチェックをつけますか?と聞かれるので左側のYesを選択します。そうすると、子要素のオブジェクトすべてのStaticにチェックがつきます。

Unity上部メニュー
Window > Rendering > Occlusion Culling
で設定画面を表示します。

Occlusionというタブができて設定画面が表示されるので、下のBakeを押せばとりあえずオクルージョンカリングが設定されます。
左の動画はただCube(staticにチェック)とカメラを追加しただけの状態ですが、カメラが映してる場所のオブジェクト以外は表示されないよう設定できています。
これでも十分ぽいですが、追加でいろいろ設定していくことによって、もっと効率的にパフォーマンスを改善することができます。
オクルージョンカリングの設定

さきほどのオクルージョンカリング設定画面に
- Object…遮蔽物、非遮蔽物の設定
- Bake…どのぐらい細かく非可視化するかベイクの設定
- Visualization…シミュレーション、オクルージョンデータの可視化
という三つのメニューがあります。それぞれについて解説します。
①Object

何も選択していないと、左図のような画面になります。
Scene Filter:
All / Renderers / Occlusion Areas
これは、Sceneビュー上で表示するオブジェクトの種類をフィルタリングする設定です。
あくまで 見やすくするための「表示切り替え」 です。普段はAllですべてを表示しておきます。
Occlusion Areas
この中で大事な設定がOcclusion Areasです。

Occlusion AreasをクリックするとOcclusion Areaを作成するボタンが出てくるのでクリックします。

すると、左画面のような緑色のポイントがついた立方体が出現します。緑色のポイントをドラッグして、広げることができます。


Occlusion Areaは、例えば室内や、作り込んでいる場所、メインで探索してほしい場所などに広げます。
細かく可視・不可視するような設定をしたとき、このOcclusion Areaを重点的に細かく見てくれるようにしてくれます。このエリアを設定しないと全体を細かく見てしまい、オクルージョンカリングの負荷が大きくなりパフォーマンスが落ちてしまいます。
OccluderとOccludee

Objectメニュー表示中、何かオブジェクトを選択すると、そのオブジェクトに
- Occluder Static
- Occludee Static
のチェックをすることができます。

Occluder Static…遮蔽する側:壁・地形など
Occludee Static…遮蔽される側:家具・内部の装飾など
この属性をつけると、カメラで映したときに遮蔽された物体が描画されなくなり。パフォーマンスが上がります。
しかしオブジェクトは、遮蔽する側にもなれば、遮蔽される側にもなるのでどちらにもチェックを入れる場合が多いです。

最初にオブジェクトにStatic にチェックを入れるよう言ったんですが、Staticにチェックを入れると自動的にOccluder StaticとOccludee Staticの属性がつきます。
なので、とにかくStaticにチェックをいれておけばOK。
②Bake
Bakeメニューの設定について

Set default parametersはこの設定のデフォルト設定にしてくれるボタンです。一番適切な値だとUnityが言ってるので、よくわからなかったらこのままでいいし、いろいろ数値をいじくりすぎて元に戻したいときなどに押します。

Smallest Occluder
可視化、非可視化する計算をするときに、どのぐらい細かく見るかの最小値です。
左図のように、小さくすると、細かいブロックごとに計算するので負荷があがり、オクルージョンデータも大きくなります。
細かく見てほしいところがある場合は、以前解説したようにOcclusion Areaを作成すれば、それ以外は適切にデータをとってくれるようになります。

Smallest Hole
どのくらい小さい穴から見える景色まで可視化するかという設定。
例えば、左図のように壁に小さい穴をあけます。
Smallest Holeの数値を大きくすると、(例えば5)穴から見える建物は全部不可視化され、描画されません。
反対に、Smallest Holeの数値を小さくすると、(例えば0.1)穴から見える建物は描画されています。
普通は、小さい穴から見た景色にこだわるユーザーっていないので、デフォルト値の0.25とかでいいと思います。もっと大きくすれば描画しないポリゴンが増えるのでパフォーマンス改善が見込めそうです。
のぞき穴からのぞくのが大事なワールドとか、ゲームみたいな特殊な事情があれば、数値を小さくする必要があるかもしれません。

Backface Threshold
基本的に、Unityでは面の裏側は非表示になって透明になるのでその向こうのものが消えると何も見えなくなったりします。空と地形だけが見えるような感じになります。
Backface Thresholdは、あるオブジェクトが、カメラに向かって裏面が何%以上だったら、その奥のものを非表示にするっていう設定です。

左図は、上のようなオブジェクトを作って遮蔽物としました。カメラにむかって、赤い面(裏側)と灰色の面(表側)が同時に見えています。
このような遮蔽物があったとき、例えばBackface Thresholdを最小値の5とすると、5%以上裏面があるので遮蔽物として奥にある物体を非表示にします。また、最大値の100とすると、100%が裏面ではないので、遮蔽物とはみなさない、つまり、奥にある物体をそのまま表示するということです。
Backface Thresholdはパフォーマンス改善点となるか?
この値はデフォルトで100となっていて、裏面での遮蔽をしない設定になっています。この数値を下げた方が、非表示のオブジェクトが増えるので軽量化につながるかもしれませんが、意図しないところでオブジェクトが消えてしまったりデメリットもあります。基本は100にして、どうしてももっと軽量化しないといけないとなったら値を下げるのをオススメします。
③Visualization

オクルージョンカリングの結果を「目で確認」できる。
特定のカメラの視点から、Unityがどのように「見えるもの/隠れるもの」を判断しているかが分かります。カメラを選択する必要があります。(確認のためのモードなので、軽量化・パフォーマンス改善に影響はありません。)

シーンのビュー右下にオクルージョンカリングのメニューが出て、
Edit or Visuallizeを選べます。
Edit
オクルージョンカリングデータのセルを示す青い線が表示されます。セルサイズは Smallest Occluder の設定に影響され、値が小さいほどセル数が多くなりセルのサイズが小さくなります。

↓Portalsをオンにしたところ

Visuallize
Camera Volumes(黄色の線)
- 黄色い枠=Unityがオクルージョンの計算を行うエリア
- この中にカメラがいないと、オクルージョンカリングは機能しません
- 黄色い枠の中はさらに灰色の線で細かく分割されています(セル・サブディビジョン)Smallest Holeの設定に影響される
Visibility Lines(緑の線)
- 緑の線=「カメラが実際に見ているオブジェクト」へのライン
Portals(線でつながる)
- 「あるカメラ位置から、隣のセルが見える」という関係を線で示す
- この関係を使って、見えているエリアだけを描画するようにしています
おすすめ設定
軽量化・パフォーマンス改善のための基礎的なオススメ設定(動的オブジェクトは今回無視しています)
だけです‼デフォルト設定で十分優秀なので初級者~中級者はこのままでBakeしてください。
デフォルトで良い場合
- シーンがそこまで巨大ではない(家+庭や小さい村など)
- 複雑なインテリア構造がない(開けた地形や単純な建物)
- 処理が重くなっていない(FPSが問題ない)
⚙️ 調整を検討するケース(中~上級者向け)
以下のような状況なら、オクルージョンカリング設定のカスタマイズを検討する必要がでてきます
状況 | 調整ポイント |
---|---|
シーンが非常に広く、建物が大量にある | Smallest Hole を大きくしてセル数を減らす(軽くなる) |
部屋が複雑に分かれていて、うまく遮蔽されない | Backface Threshold を下げて裏面の考慮を強化する |
大体②のBake設定をいじることになると思います。
ある程度、いらない表現を削る覚悟を持てば、どんどん軽量化できるはず…!