オープンワールド系のゲーム開発を経験したので色々話す#1 TerrainとDetail編


UnityのTerrainを使って地形を作る

オープンワールドゲームということで、まずは広大な世界を作らなければいけないと思います。(ゼル伝しかり原神しかり

Unityには、Terrainという便利で優秀()な機能があるので全力で使っていきます。
Terrainの基本的な使い方は他で調べて頂いて、今回はオープンワールドの地形を作っていく上で大切なことを話して行こうと思います。


一応Terrainの学習に用いたサイトを貼っておきます。

まず最初にやること

UnityでTerrainを使っていると、そのうち「処理が重すぎる」という問題に直面すると思います。
実はデフォルトの設定だとかなり高品質なTerrainを作るようになっていて、ステージ制の1場面の規模があまり大きくないゲームだと問題はないと思いますが、オープンワールドとなるとかなり広大な地形をたくさん作ることになるので、重くてゲームどころじゃないといったことになってきます。

というわけで設定を見直していきましょう。

ヒエラルキーのCreate/3D Object/TerrainからTerrainを作ります。

インスペクターのTerrainコンポーネントの歯車アイコンをクリックして設定を開きます。
すると、色々と項目が出てきて大変だとは思いますが、今回見ていくのは


Pixel Error
Base Map Dist
Ditail Distance
Ditail Density
Tree Distance
BillBoard Start
Ditail Resolution Per Patch
◯◯ Resolution 系統


になります。そこそこ多いですが、かなり軽量化に繋がるので少しずつ説明していきます。


Pixel Error

簡単に言うと、「遠くの地形を正確に描画するかどうか」の設定になります。
数値を大きくすると、遠くの描画が雑になっていきますが、処理は早くなっていきます。
僕はこのプロジェクトでは30に設定しています。


Base Map Dist

Pixel Errorのテクスチャバージョンになります。Terrainに設定しているテクスチャが指定した数値より遠くになると雑に描画されるようになります。
ゲームの規模に合わせて、数値を大きくしていくといいかなと思います。遠くを狙撃するようなゲームの場合はひと工夫必要かも?


Ditail Distance

後述するDitail(草とかの小物)の描画範囲です。指定した数値までの範囲を描画します。


Ditail Density

Ditailの密度設定です。ここをいじりながら設定したことはないですが、Ditailの設定からも配置する密度は変えられるので、ここの値はあまりいじらなくてもいいかも?一応小さくなればなるほど処理は軽くなります。


Tree Distance

Ditail Distanceの木バージョンです。Ditailよりはおおきな値を設定してあげるといいと思います。


BillBoard Start

木をメッシュではなく、ハリボテ(2D)で表示するようになる距離です。木の量によっては、一気にメッシュ数が減るので軽量化に繋がると思います。Tree Distanceと合わせていい感じに設定していきましょう。


Ditail Resolution Per Patch

描画処理の勉強が足りなくて、よくわからなかったので引用させてもらうと

1回のドローコールで描画される範囲のサイズです。値は8~128の間で設定可能で、大きいほど描画コストが下がります。

・・・らしいです。とりあえず見た目に影響が出ない程度におおきな値を設定してあげるといいと思います。


◯◯ Resolution 系統

いわゆる解像度設定です。見た目が大きく変わるのでクオリティも大きく変動しますが、その分描画処理も大きく変わります。
また、途中で変えると見た目がおかしくなったりすることもあるので、この項目は一番最初に設定しておきましょう。


これらの項目を見直すことで、劇的にTerrainを軽量化することができると思います。
中には、設定を変えると見た目がおかしくなったり、地形データが吹き飛ぶものもあるので、できるだけ一番最初に設定して途中で変えるようなことがないようにしましょう。

まっ平らな地形を作らない

地形を作っていく上で、結構見落としがちですが簡単に工夫できるのがこれだと思います。

↑まっ平らな地形

↑軽く起伏をつけた地形

他にも道っぽい砂利があったり風景があったりで単純に比べるのはちょっとずるな感じですが、こんな感じで起伏をつけただけでそれっぽい感じが作れます。

これはクリエイターだからこそ感じてしまうことなのかもしれませんが、Unityでゲーム作ってみた的な初心者向けのサイトを漁っているとまっ平らな地形で作っているものが結構あるので、すごい「Unityじゃん」感が出てしまうんですよね。

それを解消するために、まずは起伏をつけて地形を作ってみるといいと思います。

ただし!!

プレイヤーがいける場所で大きな起伏をつけるのはやめましょう!!
せっかくの広いマップが見えにくくなる他、急な斜面はUnityの物理演算を使っていると壁のような判定になって登るのが困難になります。

独自で物理を実装していて、周りが見えにくくても良いという状況であれば問題無いとは思いますが...色々と手間になるので、地形を作るのに慣れるまでは避けたほうがいいと思います。

Ditailを設定する

風景を作っていく上で欠かせないのがDitailの配置です。
先程の比較画像の通り、草花を生やしたり、小石を並べていったりするだけでそれっぽい雰囲気を作り出すことができます。

感覚的なお話になってしまうのですが、このような感じで一種類の草だけではなく、黄色い花、赤い花、緑の草、木の枝、などなど、多くの種類のDitailを置いていくといいと思います。

スクリーンショット (350).png

↑荒れ地のDitail例。荒れ地の瓦礫はテクスチャだけでも表現できますが、Ditailとしても配置すると立体感がでてより良く見えます。他にも木の枝や小石、枯れ草なども配置してもともとは自然があった感を出して行くといいのかなと思います。

こんな感じでたくさんのDitailを登録しておくと、簡単に置けるので楽になります。(背景がないやつは2Dテクスチャ、背景が黒いやつはメッシュ)

今回のまとめ

というわけで、第一回TerrainとDetail編でした。
時間がかかる世界観構築部分ですが、やればやるほど見た目が良くなって遊ぶ側も探索したい!という気持ちが出てくるので、時間の許す限りこだわって作っていきましょう。

特にTerrainは本当にできることの多い機能です。アセットなんかを漁ってみると軽量化だったり、より複雑な地形を作れるようになったり、なんなら自動生成してくれるものまであります。
もしお金に余裕があるのであればそれらを使ってみるとまた違う世界が見えてくるのかなと思います。

おまけ 実際に使ってみたアセット

ほんとに最後のおまけとして、こちらのNature Rendererアセットを紹介しておきます。

名前の通り、自然関係のレンダリングを見直してくれる(Terrainにスクリプトをつけると勝手にやってくれる)のですが....

まじでさいきょーwwwってなるぐらい優秀なアセットです。


↑アセットなし
↓アセットあり

影の描画や、Ditailの描画処理を大きく変更するので、この同じ場面でも大きく雰囲気が変わってきます。
特に、メッシュを使ったDitailの描画はありえないぐらい自然になるので、是非とも使ってほしいアセットとなっています。
あと、これを入れたらびっくりするぐらいTerrainが軽くなります。上でやった軽量化は何だったんだって思うぐらい軽くなるので初めて入れたときはびっくりしました。

というわけで今度こそ本当に終わろうと思います。
ではノシ


https://qiita.com/hemmiyuya/items/c3593c049d60d3afd5e1