UnityのTerrainで大地を創る

# 同じ内容を解説した勉強会の動画
- https://livestream.com/accounts/1839740/events/3063002/videos/71728907

![](https://www.evernote.com/shard/s22/sh/085e9b71-66ce-4b18-b5e9-b14eb7b9f053/ffb19290cf92daa84b42a51baf78bf3b/deep/0/Untitled---UnityTerrain2---PC,-Mac-&-Linux-Standalone.png)


広大なフィールドを手軽に作成できる地形エンジン Terrainを使ってみよう。

# Terrainの特徴

Terrainは広大なフィールドを少ない負荷で作ることが出来る仕組み。
標準のサイズは2キロメートル四方のフィールドを1個のオブジェクトで表現できる。
下記のような機能を持っている。

- 高低差のある広大な地形を作成
- 地形上に任意のテクスチャをブレンドして塗り絵のように設定
- 木、草などを植え、風になびくなどの設定


# 基本的な作り方

メニューから<code>GameObject > Create Other > Terrain</code> とするとTerrainのオブジェクトが作成される。

![](https://www.evernote.com/shard/s22/sh/a387a1d0-127d-4021-bb7e-a004de59e8ab/2daab1d2a94339cd8c88c4b727c82124/deep/0/GameObject.png)

他のオブジェクトと同様にインスペクタから各種設定を変更する。

![](https://www.evernote.com/shard/s22/sh/dc8303b1-84cf-4571-ad3b-6475f0f621fd/1e889d8d52f0321cbe672b42909be61a/deep/0/Untitled---UnityTerrain2---PC,-Mac-&-Linux-Standalone-と-UnityのTerrainで大地を創る.png)

Terrainの設定を変更するには歯車のマークをクリックする。

![](https://www.evernote.com/shard/s22/sh/95685992-ceb2-41f8-ba7f-f578104e8337/cff1d6f05b4a428f5de58645a26cf051/deep/0/Untitled---UnityTerrain2---PC,-Mac-&-Linux-Standalone.png)

さまざまな設定があるが、大きさなどを設定するには一番下のResolutionの項目。

|項目名|内容|
|---|---|
|Terrain Width|地形の幅|
|Terrain Width|地形の長さ|
|Terrain Height|地形の最大の高さ|

Unityの標準的なオブジェクトは1メートル四方の立方体であるのに対して、デフォルトで2000メートル四方、標高600メートルという圧倒的なサイズになっている。

またインスペクタのTransformのScaleはTerrainには効果を及ぼさないので注意。

# 高低差を作る

![](https://www.evernote.com/shard/s22/sh/7803bcad-eaeb-4437-b38f-8c8ee9cdc207/a04d474ad45c4ad4cb6e009da1f07a82/deep/0/Untitled---UnityTerrain2---PC,-Mac-&-Linux-Standalone.png)


高低差はブラシツールをつかって、土地を持ち上げたり押し下げることで形成する。
初期状態が最も高度が低い状態になっているので窪んだ地形にする場合はまず持ち上げる必要がある。

地形を操作するツールは3種類。

|名前|内容|
|---|---|
|Raise / Lower|山に矢印のアイコン。クリックした場所を持ち上げる。シフトを押しながらクリックで下げる。|
|Paint|山に矢印2個のアイコン。クリックした場所を指定した高さにする。平坦なエリアを作れる。|
|Smooth|山に水滴のアイコン。クリックした範囲を滑らかにする。不自然なエリアの調整。|


地形を操作する時はシーンビューで操作したい場所にマウスのカーソルをのせて<code>F</code>を押すと指定の位置にブラシのサイズに合わせてズームインする。
ブラシのサイズを変更することで一回のクリックで編集する地形の範囲を変更できる。

**ブラシサイズ15**

![](https://www.evernote.com/shard/s22/sh/30fc9b2d-9f6b-4c47-97fd-5f89a947e894/b6a6b1c46696ff82db14d3d463188fde/deep/0/Untitled---UnityTerrain2---PC,-Mac-&-Linux-Standalone.png)

**ブラシサイズ40**

![](https://www.evernote.com/shard/s22/sh/b1243598-b655-4f5b-a4dc-17f386b7f2ba/7d22f27c48ffc833f9d459d1b0371e7e/deep/0/Untitled---UnityTerrain2---PC,-Mac-&-Linux-Standalone.png)

窪んだ地形を作るには一度適当な高さで<code>Flatten</code>してから押し下げるとよい。


![](https://www.evernote.com/shard/s22/sh/4dd69f6f-63b3-4e18-a6a3-b71035d8ad15/cfa737a8e53af53cc33b7d5d4e29e737/deep/0/Untitled---UnityTerrain2---PC,-Mac-&-Linux-Standalone.png)

実際にカメラやキャラクタを配置して確認すると想像以上に大きいので注意。(この例では<code>Assets > Import Package > Character Controller</code>の<code>3rd Person Controller</code>を使った。)

![](https://www.evernote.com/shard/s22/sh/da666372-f01d-4906-a675-6e4ebb665e93/42bdffe9db62f506f42d15a5c1c6f7c6/deep/0/Untitled---UnityTerrain2---PC,-Mac-&-Linux-Standalone.png)

# テクスチャを貼る

テクスチャの設定はインスペクタの筆アイコンのツールで行う。
地形にはテクスチャをブラシで塗るようにして適用できる。通常は1つのオブジェクトには1つのテクスチャしか設定できないが、Terrainの場合は複数のテクスチャを塗り分けるように設定できる。

![](https://www.evernote.com/shard/s22/sh/fcb4fa8f-399d-4e2a-8ba3-8d9eef4aa195/dff69659f0e713080c29d41d3c5e4e9b/deep/0/Untitled---UnityTerrain2---PC,-Mac-&-Linux-Standalone-と-UnityのTerrainで大地を創る.png)

まずは標準のテクスチャパックが入っているアセットをインポート。<code>Assets > Import Package > Terrain Asset</code>としてテクスチャをプロジェクトに読み込む。次にTerrainのインスペクタ、筆アイコンを選択して<code>Edit Textures</code>をクリックし、<code>Add Texture</code>をクリック。地形に使うテクスチャを選択していく。まず最初に選択したテクスチャが地形のデフォルトになるので全体を塗りつぶすテクスチャを選択する。たとえば Grass (Hill)を選ぶと次のように鳴る。

![](https://www.evernote.com/shard/s22/sh/460f13fd-95a5-406f-bcaf-a417db08e045/a10c27804931d65a88b951d21eaaabea/deep/0/Untitled---UnityTerrain2---PC,-Mac-&-Linux-Standalone.png)

同じように<code>Add Texture</code>でGood Dirt, Criff, Grass and Rockを選択していく。

![](https://www.evernote.com/shard/s22/sh/32a0e729-a7dc-42cc-845c-056913a12320/414187027f955c5bd2e3f22edb93a28e/deep/0/Untitled---UnityTerrain2---PC,-Mac-&-Linux-Standalone.png)

テクスチャを複数準備したら、地形を塗りたいテクスチャを選択、ブラシのサイズや形を選択して地形を塗っていく。

![](https://www.evernote.com/shard/s22/sh/dec1d7bd-f2a6-4b82-9e13-6225a7419cb6/7d2bbf59aec330dd6494e51624250179/deep/0/Untitled---UnityTerrain2---PC,-Mac-&-Linux-Standalone.png)

![](https://www.evernote.com/shard/s22/sh/107c89c4-e904-4170-906c-366a6b496bde/a0f5cc9fad61a6eb4d0b8a10a0eb61ec/deep/0/Untitled---UnityTerrain2---PC,-Mac-&-Linux-Standalone.png)

テクスチャを用意して塗り分ければ草原や砂漠などが簡単につくれる。


# 木を植える

木を植えるにはインスペクタの木のアイコンを使う。この機能で植えた木には当たり判定などはないのであくまで装飾目的になる。

![](https://www.evernote.com/shard/s22/sh/87f851a2-d3fa-41e9-b430-20c8a631ab47/62aef652818a0e5831b261aac1183103/deep/0/Untitled---UnityTerrain2---PC,-Mac-&-Linux-Standalone-と-Facebook.png)

さきほどインポートしたアセットに木のモデルがあるので<code>Edit Trees</code>から<code>Add Tree</code>とし、Palmオブジェクトを設定する。◯アイコンをクリックして選択する。

![](https://www.evernote.com/shard/s22/sh/3faac74d-5412-4c44-8a7b-4b57390ef09e/fb9a82f506812d58c83e2ccfee4de0cb/deep/0/Edit-Tree.png)

あとはテクスチャなどと同じようにブラシサイズなどを設定してクリックすると植樹できる。

![](https://www.evernote.com/shard/s22/sh/d1bb4a7d-2686-4f2f-bf4c-31036cb13953/c58a3d482f149306976c12abab59b0b0/deep/0/Untitled---UnityTerrain2---PC,-Mac-&-Linux-Standalone.png)



# 草を植える

草を植えるにはクローバーのマークのDetailツールを使う。平面の草や立体の小物などを散布できるが、やはり当たり判定はないので注意。

![](https://www.evernote.com/shard/s22/sh/7166a7b9-081a-4f53-99e7-7ad343e32c1b/a82780d4817934d8af8f3d7b9b073bac/deep/0/Untitled---UnityTerrain2---PC,-Mac-&-Linux-Standalone-と-UnityのTerrainで大地を創る.png)

草も標準のデータが入っているのでEdit DetailsからAdd Grass Textureを選択、Grassを選択する。

![](https://www.evernote.com/shard/s22/sh/de93e9cb-0c4b-459d-b453-5a213d3b0812/98ed21cbed2b620b71c0f3cc5cdc1f50/deep/0/Add-Grass-Texture.png)

あとは同様にブラシサイズなどを設定してクリックし、草を植える。

![](https://www.evernote.com/shard/s22/sh/f9969e27-ecca-43d0-83ac-4f7c3ff67333/216295fc3cdbaf4dc781b48eee9115ee/deep/0/Untitled---UnityTerrain2---PC,-Mac-&-Linux-Standalone.png)


# ライトマップ

見通しが効くので陰影が厳しい時はライトマップをベークすると良い。

# Terrain Toolkitを使った自動生成

Terrainは便利な機能だが領域が広大なので自然な地形を作るのは手間がかかる。そこでアルゴリズムを元に地形を自動生成するパッケージ、Terrain Toolkitを使うと便利。

Terrain Toolkitの基本的な機能は次のとおり。

|名前|説明|
|---|---|
|Create|地形を自動で生成する|
|Erode|風や雨、波による地形の侵食をシミュレートする|
|Texture|地形の標高に応じて自動的にテクスチャを塗り分ける|


![](https://www.evernote.com/shard/s22/sh/1bd497e1-23f5-4c19-9d0d-49f77cbcb5a2/96f1925535ea5026b1d1b8a7a8b1a5dc/deep/0/Downloads---unityterraintoolkit---The-Terrain-Toolkit-is-an-integrated-solution-for-terrain-generation-in-the-Unity-game-engine.---Google-Project-Hosting.png)

https://code.google.com/p/unityterraintoolkit/downloads/list

Terrain Toolkitをダウンロードし、インポートする。<code>Assets > Import Package > Custom Pckage</code>とし、ダウンロードして解凍したパッケージを選択する。

# Terrain Toolkitの導入

Terrain Toolkitはスクリプトになっており、Terrainのオブジェクトに<code>TerrainToolKit</code>をドラッグアンドドロップして追加する。

![](https://www.evernote.com/shard/s22/sh/9d27ea75-9ad6-4e1c-bc14-2abac4684d83/a4bd91d56b6d30550a85dd63f3d8f752/deep/0/Untitled---UnityTerrain2---PC,-Mac-&-Linux-Standalone.png)

インスペクタにメニューが表示されればOK.

![](https://www.evernote.com/shard/s22/sh/40fbf46e-54a4-42c4-bf5c-2252247b6bd7/80bc755c34123b2351e009645007df85/deep/0/Banners-and-Alerts.png)

## Create

地形の特徴やアルゴリズムのパラメータを設定し、ランダムで地形を生成する。プリセットを使った手軽な生成も可能。生成する地形の区分は次の通り。

### Voronoi

![](https://www.evernote.com/shard/s22/sh/bbd664c5-4da3-4d80-850d-4300560aac26/a48fad4f7dd9e5cc372fe12761b350c8/deep/0/Untitled---UnityTerrain2---PC,-Mac-&-Linux-Standalone.png)

ボロノイ図状、任意の数の凸に地形を分割する|

### Fractal

![](https://www.evernote.com/shard/s22/sh/bc6521a0-db98-481a-bdfc-7a05ca08c4b1/97ed22b8afcb653a2fda34695a7b9680/deep/0/Untitled---UnityTerrain2---PC,-Mac-&-Linux-Standalone.png)

フラクタル。自己相似した細かな凹凸による起伏を作成|

### Perlin

![](https://www.evernote.com/shard/s22/sh/4d2efac2-86fd-4d5f-af18-ca4a9bf977eb/3fb1eb4c794e19098d008390438c8ed0/deep/0/Untitled---UnityTerrain2---PC,-Mac-&-Linux-Standalone.png)

ノイズ関数をつかったフラクタルににた地形。

### 平準化と標準化

生成した地形はさらに平準化(Smooth)や標準化(Normalize)が可能。アルゴリズム系の地形はそのままだと不自然なので後処理も必要になる。

![](https://www.evernote.com/shard/s22/sh/b8b2cef2-dc96-429e-a5b9-d173d4c4815b/6142fbd1410398db6b7de7491e57b2a7/deep/0/Untitled---UnityTerrain2---PC,-Mac-&-Linux-Standalone.png)

## Erode

侵食をシミュレートした平準化を行う。選択可能なロジックは次の通り。

|名前|内容|
|---|---|
|Thermal|熱|
|Hydraulic|水|
|Tidal|波|
|Wind|風|

## Texture

複数のテクスチャを標高や傾きに応じて自動的に塗り分ける機能。
低地や高地、崖などを自動的に適用できる。

![](https://www.evernote.com/shard/s22/sh/b6be6cd0-292c-45f0-8c2c-d6a5012f3651/037b6b85b3053544fd5cb7806ff0f5df/deep/0/Banners-and-Alerts.png)

![](https://www.evernote.com/shard/s22/sh/54f173bb-2db4-4d7f-8973-1a1b7f2a5450/256c29ddc7c017b12026b648befbb2a6/deep/0/Untitled---UnityTerrain2---PC,-Mac-&-Linux-Standalone.png)

テクスチャのApplyは何度でも実行できるので調整しながら実行するとよい。