おもちゃラボ

Unityで遊びを作ってます

【Unity】LODで負荷を軽減させて60FPSを維持する

スマートデバイスなどのモバイルがターゲットのゲームは計算量をいかに減らすかがキーになります。ここではLODを使ってパフォーマンスを改善する方法を紹介します。

LODとはLevel Of Detailの略で、オブジェクトが近くにあるときは高精細のモデルを使用し、オブジェクトが遠くにあるときはローポリゴンのモデルを使用しよう、という考え方です。

f:id:nn_hokuson:20170321193923p:plain

UnityではLODを標準でサポートしているため、簡単に実装することができます。

LODの準備

ここでは「近いとき用(dragon0)」「通常用(dragon1)」「遠い用(dragon2)」の3つのモデルを用意します。もちろんカメラから近いときにハイポリ、遠いときにローポリのモデルを使います。

これをすべてシーンビューにドラッグ&ドロップします。とりあえず位置は適当で問題ありません(あとで揃えます)

f:id:nn_hokuson:20170321192750p:plain

次に、これらを束ねる空のオブジェクト(dragon)を作成し、先程の3つのオブジェクトをすべて子要素にします。

f:id:nn_hokuson:20170321192810p:plain

3つのオブジェクト(dragon0〜dragon2)の位置がすべて等しくなるようにします。ヒエラルキービューで3つのオブジェクトを選択して、インスペクタで値を(0, 0, 0)に設定します。

f:id:nn_hokuson:20170321192913p:plain

これで、3つのオブジェクトが重なって表示されます。

親オブジェクト(dragon)にLOD Groupコンポーネントをアタッチします。LOD Groupコンポーネントは「Add Component」→「Rendering」→「LOD Group」にあります。

f:id:nn_hokuson:20170321192933p:plain

LODごとのモデルを設定

LOD用のコンポーネントがアタッチできたので、次はカメラがどのくらい離れたときに、どのオブジェクトを表示するかを設定します。

まずはインスペクタのLOD0をクリックします。その下にRendersの欄が表示されるので、ヒエラルキービューからdragon0を選択してドラッグ&ドロップします。

f:id:nn_hokuson:20170321192940g:plain

LOD1とLOD2にも、それぞれdragon1とdragon2を設定します。

これで、カメラがLOD0のゾーンにあるときはdragon0が、カメラがLOD1のゾーンにあるときはdragon1が、LOD2ではdragon2が表示されます。

LOD2のゾーンよりも遠くにカメラが移動した場合は非表示になります。

LODの距離を設定

最後にそれぞれのモデルを切り替える距離を設定します。こちらも、インスペクタからGUIで設定できます。LODの区切り線をドラッグすることで、各モデルを切り替える距離を設定できます。

f:id:nn_hokuson:20170321193016g:plain

バーを動かすことで、シーンビューにリアルタイムでLOD切り替えの距離が表示されます。めっちゃ分かりやすいですね!

f:id:nn_hokuson:20170321193049p:plain

これで設定は完了です。実際にカメラを動かしてみると、カメラからの距離によってオブジェクトが切り替わっているのがわかると思います。

f:id:nn_hokuson:20170321193155p:plainf:id:nn_hokuson:20170321193159p:plain
f:id:nn_hokuson:20170321193205p:plainf:id:nn_hokuson:20170321193208p:plain

その他

LODに関しては次の記事で実例とともに説明されています。詳しく知りたい方はこちらをどうぞ。

西川善司の3Dゲームファンのための「GRAVITY DAZE」グラフィックス講座(前編) - GAME Watch