いんでぃーづ

ゲームいろいろ、いろいろ自由

Unity : Terrainを軽量なメッシュに変換する

地形を作ろうとしたときに真っ先に思い浮かぶのはTerrainですが、致命的な難点として重いということが挙げられます。

下は適当に高さだけ作ったテラインですが、

f:id:sugar_affordance:20170131224945p:plain

下のようにかなり描画コストのかかるオブジェクトになっています。

f:id:sugar_affordance:20170131225024p:plain

こんなとき、テラインをメッシュオブジェクトに出力しつつ、頂点数や三角形を減らして描画コストを下げる方法をご紹介します。

「このアセットのテラインそのまま使いたいんだけど重いなあ…」

というときに便利(かも)。

TerrainObjExporterで地形をobj出力

Terrainをobj形式の3Dモデルとして出力するスクリプトが有志から提供されています。

http://wiki.unity3d.com/index.php?title=TerrainObjExporter

ありがたく使わせていただきましょう。

UnityプロジェクトのAssetsフォルダの下にEditorという名前のスクリプトを作り、リンク先のExportTerrain.jsかExportTerrain.csのどちらかをコピーして貼り付けましょう。
作成したTerrainをシーン内で選択した状態でメニューの

Terrain > Export To Obj..

と選択。

f:id:sugar_affordance:20170131225114p:plain

出力用のダイアログが出ます。

f:id:sugar_affordance:20170131225149p:plain

ダイアログのResolutionでFull以外を選ぶと、出力する頂点数を減らすことができます。
Exportを押し、出力先を選ぶと、obj形式の3Dモデルとして出力されます。(下画像のモデルにはマテリアルを適用済み)

f:id:sugar_affordance:20170131225231p:plain

Resolution=Fullでの出力後の描画コストは下。

f:id:sugar_affordance:20170131225248p:plain

うーむ、Batchesは劇的に下がりましたが、Tris, Vertsは逆に激増していますね。
原因を探りたいところですが、とりあえず先に進みます。

出力したメッシュに手を加える

このままだと描画コストが下がったとは言えないですね。
この後の方向性として、オブジェクトのクオリティを下げる下げないとで二つ探って見ます。

クオリティをなるべく下げずに使いたい場合

メッシュを分割し、オクルージョンカリングLODを設定することで、近くの地形のクオリティを下げないまま、全体の描画コストは下げることを考えてみます。

出力したTerrainは広大なオブジェクト(2km四方)なので、何ブロックかに分割し、オクルージョンカリングとLODを設定します。

f:id:sugar_affordance:20170131225322g:plain

メッシュ分割はMeshCutterなどアセットを使ったり、自力でスクリプト組めばできます。

LODを使いたい場合はSimpleLODが便利です。

クオリティが下がってもいいけど一個のオブジェクトにしたい場合

頂点数を減らすしかないので、TerrainObjExporterでの出力時にResolutionを下げます。
実機とにらめっこしながら適度な解像度をがんばって探しましょう。

草やWindZoneを使いたい場合

Terrainコンポーネントの設定でBase TerrainDrwaチェックボックスを外せば、草を残しつつ地形だけ消せます。

f:id:sugar_affordance:20170131225543p:plain

WindZoneもばっちり効く。

f:id:sugar_affordance:20170131225559g:plain


“Unity” and Unity logos are trademarks or registered trademarks of Unity Technologies or its affiliates in the U.S. and elsewhere, and are used under license.


免責事項

当サイトの広告バナー、リンクによって提供される情報、サービス内容について、当サイトは一切の責任を負いません。

また、当サイトの情報を元にユーザ様が不利益を被った場合にも、当サイトは一切の責任を負いません。

すべて自己責任でお願いします。