【Unity】購入したアセットでよく見るLOD(Level Of Detail)って何者?
Unityのアセットストアでいい感じの3Dモデルとかフィールド用のメッシュを買うと、下の写真のように「LOD 0」って表示されていることがあります。
例えば上の例では『Scene』ビューを表示していて、画面奥の青い線でメッシュを囲んでいる黄色い木のオブジェクトについて「LOD 0」と表示されています。(手前の木と重なっていてすみません)
使う時には触らなくてもそのまま使えるため、調べないと「なんだろこれ……」というまま放置してしまうこともあるかもしれません。なのでこの記事ではLOD(Level Of Detail)について解説します。
環境
macOS Catalina 10.15
Unity2019.4.4f1
参考文献
公式のマニュアルにも記載があるのでこちらもご覧ください。2019.4版は日本語訳されていないので、以下のリンクでは日本語訳されている2018.4版になっています。
LOD(Level Of Detail)とは
LOD(Level Of Detail)とはレンダリングの負荷を軽減して最適化するための技術で、カメラからの距離に応じて描画するメッシュを切り替えることができます。例えば近くにあるオブジェクトは詳細なメッシュとして描画し、遠くにあるオブジェクトはざっくりとしたメッシュに切り替えて描画することができます。
Level Of Detailは直訳すれば「詳細さのレベル」で、オブジェクトをどの程度詳細に描画するかを表しています。
Unityではシーンを映し出すカメラを使ってゲーム画面を描画しています。この時、カメラから遠いオブジェクトについてはその距離に応じて画面に描画される大きさが小さくなります。遠くにあるオブジェクトがゲーム画面に小さく描画されるのに、細かいメッシュを使って詳細に描画していても、プレイヤーからはよくわからないんですよね。
なので、遠くにあるオブジェクトを描画する時には頂点数やポリゴンの少ないメッシュに切り替えて表示することで、描画の負荷を減らすことができます。これによりゲームが軽快に動き、プレイヤーの体験が損なわれないようになるんです。
これを実現しているのがLODです。例えば『Scene』ウィンドウでカメラの位置を引いてみると以下のようにLODの数字が変わります。インスペクターウィンドウのメーターにもご注目ください。
カメラの距離(正確には対象のオブジェクトがゲーム画面に表示されている高さの割合)に応じて切り替わっているのがわかります。ほとんど見えない大きさになるとCulled(カルド: 間引かれた)となってレンダリングされなくなります。
このように距離に応じたメッシュを描画するのがLODの機能です。
LODの自動設定について
インポートしたアセットのオブジェクトをよく見ると、「LOD0」「LOD1」のように番号が振られています。
一揃いのメッシュデータをインポートする際は、このようにオブジェクト名の最後に「_LOD0」を付けることでうまく設定を適用してくれます。「LOD0」が一番詳細なメッシュで、番号が上がるに従ってよりシンプルなメッシュに変わっていきます。
購入したアセットに含まれるメッシュを使う場合は、多くの場合アセットの作者が設定してくれているのでこちらで気にする必要はありません。
『LODGroup』コンポーネント
手動でLODの設定を行う場合は『LODGroup』コンポーネントを使用します。
『LODGroup』コンポーネントはLODをグループ化して、オブジェクトの画面上のサイズに応じて切り替えてくれるコンポーネントです。画面上のオブジェクトの高さを計測して、画面の高さと比較した割合ごとにオブジェクトを切り替えていきます。
例えば以下のように3つのオブジェクトをカメラとの距離ごとに切り替えたいとします。
『GameObject』のオブジェクトに『LOD Group』のコンポーネントをアタッチし、カメラとの距離が近い順に赤い『Capsule』、黄色い『Sphare』、青い『Cube』が表示されるように設定してみましょう。この時、手動で設定する場合は名前に『_LOD0』などを付ける必要はありません。
手動で設定する時にはインスペクターウィンドウに表示されている「LOD 0」のように対応する領域をクリックします。すると下に『Renderer:』の項目が表示されるので、 [Add] ボタンをクリックして対象のゲームオブジェクトをセットします。
ここでは「LOD 0」に『Capsule』のオブジェクトをセットしました。同様に、「LOD 1」に『Sphere』オブジェクト、「LOD 2」に『Cube』オブジェクトをセットしました。
インスペクターウィンドウからカメラアイコンを動かしてみると、『Scene』ビューに映るオブジェクトの大きさによって別のメッシュが使われていることが分かります。『Scene』ビューではLODのどの段階なのかを教えてくれる表示もされています。
画面上に表示されるオブジェクトの高さの割合については、領域の間にある仕切りを動かすことで変更できます。この辺りは自分で使うメッシュに応じて調整するのがベストです。
ここでは『Scene』ビューで表示しているのでこのビューを映しているカメラとの距離が使われています。ユーザーがプレイしている『Game』ビューでは、シーン内で使っている『Main Camera』などのカメラとの距離が使われます。
LOD 2になると青い『Cube』が表示されるようになっていますが、この大きさだと「Cube……かも?」といった感じで詳細までは分からないんですよね。なので、シンプルなメッシュを使っていてもユーザーが気付きにくい部分でもあります。
ゲームをしている時の自分の目線を思い出してもらうと分かりやすいかもしれません。多くの場合、画面に大きく表示されているキャラクターやオブジェクトに目がいって、遠くの小さなオブジェクトまでつぶさに見ていることは少ないですよね。ユーザーの関心が低くなる部分についてはパフォーマンスを軽くしておくと全体としてスムーズなゲームプレイにつながります。
LODの使い所
LODはパフォーマンスの負荷を軽減してくれる技術で、3Dのゲームにおいて複雑なメッシュを使う場合に有効です。今回冒頭で紹介した木などのオブジェクトの場合、シーン内に大量に配置して使うこともあって、詳細なメッシュを使うと使用しているオブジェクトの数だけ負荷が増えてしまうんですよね。
3Dモデラーとしても、ゲーム開発者としても、画面に綺麗なメッシュを表示したい気持ちがあります。しかし、それによってゲームが処理落ちしてしまっては元も子もありません。なので、画面に表示されるオブジェクトの大きさによって、簡略化したメッシュを使うように切り替えることで実行時の負荷を減らすことができます。
簡略化したメッシュを作る際にはツールのモデファイヤーなどで調整するのが簡単かと思いますが、ここは3Dモデラーさんの領域なのであなたの普段のやり方に合わせてシンプルなメッシュを作っていただくのが良いでしょう(いつもありがとうございます)。
複数のメッシュをインポートするため、容量面では多少増えることがあります。容量に気を配らないといけないモバイル端末向けのゲームであれば最初からシンプルなメッシュだけを使うようにしてLODは使わない、という考え方もあります。
ここは作ろうとしているゲームの雰囲気に合わせて選択しましょう。近年はスマホの性能も上がってきているため、3Dのゲームも選択肢に入ってきました。リアル指向のゲームであればLODを使って負荷を減らしつつ、画面に映る部分のクォリティを上げるのも良いと思います。
まとめ
LODについてまとめると、
- Level Of Detailの略で、詳細さのレベルを設定できる機能
- カメラからの距離に応じて使うメッシュを切り替えられる
- これにより描画の負荷を軽減できる
となります。3行でまとまると気持ちが良いですね。
3Dのゲームを作る際にはLODの使用を検討してみてください。
ゲーム開発の攻略チャートを作りました!
-
前の記事
今までやったゲームの数を覚えていますか?【ゲーム開発】 2020.07.19
-
次の記事
【Unity】小説や映画に学ぶゲームのストーリー作成術【ゲーム開発】 2020.07.20
コメントを書く