読者です 読者をやめる 読者になる 読者になる

evil fridge

冷蔵庫に入れたが最後。

【Unity5】Occlusion Cullingで世界を削る

f:id:daiki-evilone:20170328045228p:plain:left:w120 見えないところは手を抜きゃいいんだよ!バッサリ切ってしまえ!

Occulusion Cullingとは

カメラに全く映らないオブジェクトが存在するなら、消してしまおう!という負荷軽減のための機能です。角度的にカメラの外にある物体はもちろん、他の物体に隠れて見えない物体まで消すことができます。

事前準備

  • 上のメニューからWindow -> OcclusionCulling を開いておく
  • 3Dモデルをシーンに配置
  • 消したい3Dモデル(動かないものに限る)をstaticにする。

効果を見やすくするため、物が多い&家が多いアセットを使うことにします。

f:id:daiki-evilone:20170328040227p:plain:w300

Bakeする

Occlusion Cullingを行うためには、空間情報をあらかじめ計算しておかなければなりません。とりあえず、Occlusinウインドウの「Bake」ボタンを押してみましょう。
ジャングルジムのような立体的な網が世界を覆っていきます・・・
f:id:daiki-evilone:20170328040334p:plain:w300

Cullingしてる様子を見てみる

このままゲームを実行してもOcclusion Cullingの効果はあります・・・が、なんせカメラ外で起こる処理なので実感が湧きません。シーンで確認できるように設定します。

シーンビューの右下にある小さい黒枠を見てください。「Editor」と書いてあるボタンをクリックし、「Visualize」に変更しましょう。
f:id:daiki-evilone:20170328040927p:plain:w300
すると・・・
f:id:daiki-evilone:20170328041111p:plain:w300
世界が削れた!

カメラを右に回転してみます。
f:id:daiki-evilone:20170328041528p:plain:w300
表示される領域が右に移りました。家のモデルが細かく分かれているので、屋根が半分だけ消えています。でも大丈夫、カメラには映っていません。

カメラを壁に向けて置き、反対側の様子を見てみます。
f:id:daiki-evilone:20170328042558p:plain:w300
Occlusion Cullingを有効にすると・・・
f:id:daiki-evilone:20170328042634p:plain:w300
ごっそり消えます。どんなに大きな家でも、すべてが壁に隠れているなら容赦なく消えるみたいです。

影は残る

動的なライトを使ったとしても、影は消えずに残るみたいです。 f:id:daiki-evilone:20170328043025p:plain:w300

Occlusion Cullingの設定値

Occlusinウインドウには「Bake」というタブがあり、値が3つあります。詳しい説明はUnity公式マニュアルにありますが、要約するとこんな感じです。

  • Smallest Occluder:背後の物体を遮るための最小の大きさ。5に設定すると、5mの大きさがないと背後の物を隠せない。
  • Smallest Hole:穴の最小の大きさ。シーン内にある穴より小さくしなければならない。デフォルトは25cm。
  • Backface Threshhold:100未満にすると、見えることのない3Dの裏面のメッシュを削除して軽量化する。(山の内側や岩の中身)

おわりに

拝啓の物体をリアルに見せる処理についての記事を書いてきましたが、Occlusion Cullingはそれらと相性が良いと思った(staticな物体を対象としているため)。意外と簡単に適用できたので、これからは積極的に使っていきたいです。
と言いつつ、2Dゲームを作り始めたので早くそれを公開したい。