オープンワールドゲーム作ってみたくないです?
著者はゼルダの伝説BotWからハマってGhost of Tsushimaは最高に好きです
オープンワールドを支える重要な技術の一つがLevel of Detail(LOD)です
これは被写体との距離などで表示するメッシュを切り替えることで
カメラ内のポリゴン数を減らし描画負荷を抑える技術です
Unityには簡単にLODを実現するツールがあるので
今回はこちらのサンプルを作りました
事前情報
Unity: 2020.3.11f1
LOD Group: https://docs.unity3d.com/ja/current/Manual/class-LODGroup.html
作業
Blenderでメッシュを用意
今回は高ポリゴン・中ポリゴン・低ポリゴンをBlenderで用意
青:UV SphereのSegments=12、Verts=182
緑:UV SphereのSegments=24、Verts:362
赤:UV SphereのSegments=48、Verts:722
Unityにそれぞれのメッシュを配置
UnityでEmptyObjectを配置し、子要素に3パターンのオブジェクトを追加
※わかりやすく横に配置してますが座標は同じにしてください
LOD Groupを設定
親要素に対しInspectorウィンドウでLOD Groupを追加します
各フォームの詳しい説明は公式ドキュメントがわかりやすく解説してるので省きます
LOD Group: https://docs.unity3d.com/ja/current/Manual/class-LODGroup.html
UnityのLOD Groupでは被写体が画面内で何%占めているかでメッシュの出しわけをします
上記画像だと100%ならLOD 0、60%ならLOD 1、30%ならLOD 2、10%なら表示しません
各ゲージ部分をクリックすると対象のオブジェクトまたはRendererを指定できます
あとはカメラアイコンをスライドするとSceneビューにプレビューされます
Sceneビューでカメラ移動しても反映されてると思います
比較
視覚的に球体の角張に差は殆どないのに
statsのTriangle数とVertex数が激減してるのがわかります
感想
LOD Groupのおかげで非常に簡単にLODを体験できました
ただ余りにも簡単かつ設定項目も少ないので
本格的に負荷軽減したいなら自作する必要がありそうです
メリット
・簡単に作れるのでモック作成向け
デメリット
・画面内の比率でメッシュ差し換えしているため、見切れてるときに低ポリゴンになる
→Fade Modeでメッシュ切り替えを滑らかにすると緩和されるかもしれません
・メモリにはすべてのメッシュが載ってる気がするのでメモリも節約したい場合には向かないかも
→Renderer指定にすれば動的ロードしてくれるかも?
08/19 追記
実際にメモリに全LODが展開されてるかチェックした