【Unity】自由に地形を生成できるTerrainを解説!テクスチャやColliderの設定や注意点まで
UnityではTerrainというゲームオブジェクトを使うことで、簡単に地面を生成することができます。
ただ、慣れないと少し設定が難しかったり、手の込んだ地形を作ろうとすると上手くいかない時があります。
そこで、今回はTerrainの基本的な操作方法から応用的な部分まで解説します。
※バージョンはUnity2018.3を参考にしています。
Contents
Terrainとは
Terrain(テライン)とは地形を作成するためのGameObjectになります。
初めはまっさらな1枚の地面が生成されます。
この状態から地面の凹凸をつけ、色付けし木や岩を設置することで地面が完成します。
慣れると、下のような地形を5分もかからずに作ることができます。
Terrainの標準のサイズは2キロメートル四方のフィールドです。
もちろんScaleを調整すればサイズを変更することができますが、サイズが変わることで物理計算が上手く行かなくなることがあるのでご注意ください。
また、上の画像を見ても分かるように、Terrainには下記の機能を持っています。
- 高低差のある広大な地形を作成できます
- 地形上に任意のテクスチャ(模様)をブレンドして塗り絵のように設定できます
- 木、草、岩なども設置できます
- 風になびくなどの設定できます
Unity学習初期ではGameObjectのCubeを拡大して地面の代わりに利用することがありますが、複雑な地形を作ろうとすると手間がかかってしまうので、これからは積極的にTerrainを使っていきましょう。
簡単な地形を作成してみる(Terrainの作成方法)
ここでは簡単な地形を作る手順を丁寧にお伝えします。作り方が分かっている方は読み飛ばしてもらうと良いと思います。
①HierarchyビューのCreateをクリックし、3D Object > Terrain を選択します。
②するとまっさらなTerrainが生成されます。次に地面の凹凸を作成します。
Terrainを指定した状態でInspectorビューのTerrainコンポーネントの「Paint Terrain」をクリックします。
③すると「Create Neighbor Terrains」が指定されているので、「Raiser or Lower Terrain」に変更します。(このメニューの各項目の説明は下に記載しています。)
④「Raiser or Lower Terrain」の状態だとSceneビューでドラッグすると凹凸を作成できるので、SceneビューでTerrainを調整します。
⑤適当に凹凸をつけたら、地形の色を付けます。先ほど変更した「Raiser or Lower Terrai」の部分を「Paint Terrain」に変更します。
⑥色を付けるにはTerrainのLayerを作成する必要があるので、「Edit Terrain Laywers」をクリックして「Add Layer」選択します。
⑦Select Terrain Layerダイアログが表示されるので、自分が使いたいTerrain Layer Assetを選択します。(Terrain Assetは事前に準備する必要がありますが、Asset Storeでフリーのアセットがあるのでお気に入りのものをダウンロードしておきましょう。)
⑧選択するとTerrainに模様がつきます。⑥と⑦を繰り返してLayerを追加し、追加したLayerを選択した上でSceneビュー上でTerrainをクリックすると、その部分だけ色が変わります。いい感じに色を付けてみます。
⑨最後に木を生やしてみます。InspectorビューのTerrainコンポーネントで「Paint Trees」をクリックしてください。
⑩初期状態だとTreeが設定されていないので、Treeを設定する必要があります。そこで、Edit Treesをクリックしてください。その後「Add Tree」をクリックします。
⑪するとAdd Treeダイアログが表示されるので、Tree PrefabにTreeを設定してください。None(Game Object)にTreeのプレハブをドラッグアンドドロップしても良いですし、下の動画のように設定することもできます。
⑫Treeを選択した状態でSceneビューでTerrainをクリックすると木を生やすことができます。もちろん、設置の範囲を変更すると1本ずつ生やすこともできます(詳細な方法は後ほど説明します。)
⑬あとはTreeを程よく配置すると完成です。以上のように簡単に地形を作ることができます。
ただ、これだけでは満足できる地形はできないでしょう。
そこで、ここからはこだわりの地形をつくれるように詳細な説明を行います。
Terrain Componentで設定できること
Terrain Componentは以下のような画面になっています。①②③について説明していきます。
①ではTerrainの大きな編集方法を4つから選択できます。要点をまとめると以下の画像のようになります。
この4つについてもっと詳しくご紹介していきます!(分かりやすいように以下で恣意的にA~Dと振っています。)
A:Paint Terrain(Terrainの形や模様を編集)
②ではPaint Terrainを選択時に以下の6つの編集方法を指定できるドロップダウンになっています。
ドロップダウンで指定した内容を③で更に詳細に設定することができます。
Create Neighbor Terrains
Terrainの隣のTerrainをクリックだけで生成することができます。
Raise or Lower Terrain
Terrainの凹凸をクリックで表現することができます。普通のクリックだとTerrainが高くなり、Shift + クリックでTerrainが低くなります。
注意点として、TerrainはyのPositon(y座標)が0より小さくすることはできません。
なので、谷を作りたい場合はTerrain全体のyのPositonを10などに設定する必要があります。
また、凹凸させる形をBrushesで設定することができます。Brush Sizeは大きさを変更し、Opacityで1クリックの効果の強さを設定できます。(数値が大きい方が効果が強い)
Paint Texture
複数のテクスチャ(模様)をTerrainに設定することができます。
真っ白なTerrainが本物の地面のように見せるためには、このPaint Textureを巧みに使えるようにする必要があります。
Set Height
Terrainの高さの限度を設定できます。TerrainをクリックするとHeightで設定した高さまでしか高くなりません。
またHeightの右にあるFlattenボタンでTerrain全体を指定した高さに変更することができます。
Smooth Height
凹凸を滑らかにすることができます。
Stamp Terrain
Brushで指定した形を、決めたHeightで作成することができます。
B:Paint Trees(Treeを編集する)
Paint Treeは木を配置することができます。
Edit Treesで「Add Tree」によって様々な種類の木を追加することができるので、リアルな森を作ることもできます。
Settings
- Brush Size:木を配置する大きさを決めます
- Tree Density:木の密度を決めます。大きければ大きいほど単位面積当たりの木が多くなります。
- Tree Height:木の高さを決めます。Random?にチェックを入れると木の高さがランダムになります。
- Lock Width to Height:高さに合わせて幅を自動調整するかどうかを決めます。
- Tree Width:木の幅を決めます。Lock Width to Heightにチェックが入っていると変更不可です。
- Color Variation:木の色の幅を決めます。大きければ大きいほど様々な色がランダムで設定されます。
- Tree Lightmap Static:光の当たり方を一定にするかを決めます。このチェックはTree Prefabで設定しなければならず、この画面では設定できません。
C:Paint Details(Detailを設定する)
Paint Detailsでは草や岩などの細かいオブジェクトを付与できます。
Detailを追加するには、Edit Details > Add Grass Texture か Add Detail Meshをクリックします。
すると以下のようなダイアログが出てくるので、Detailに設定したいゲームオブジェクトを設定し、色や高さなどを指定してAddをクリックするとDetailが設定できます。
- Detail:Detailとして挿入するゲームオブジェクトを決定します。
- Noise Spread:草地に生成されるノイズの大きさを決定します。この数値が小さいほどノイズが少なくなります。
- Min Width:オブジェクトの幅の最小値を決めます。
- Max Width:オブジェクトの幅の最大値を決めます。
- Min Height:オブジェクトの高さの最小値を決めます。
- Max Height:オブジェクトの高さの最大値を決めます。
- Healthy Color:草地の元気な色を決定します。ノイズの中心で目立ちます。
- Dry Color:草地の乾燥した色を決定します。ノイズの外側で目立ちます。
- Render Mode:草地(Grass)のライティングなのか、通常のライティング(Vertex Lit)なのかを決めます。
D:Terrain Settings(Terrainの詳細設定)
Terrainのかなり詳細な設定を可能にします。
ただ、このSettingsはTerrainについて相当こだわる場合にしか使わないと思うため、今回は割愛します。
作成していく中でここを修正するようになったら、Terrainの扱いがマスタークラスであるという自負を持っても良いかもしれません。
Terrain Colliderによって衝突判定を行う
Terrainを生成すると自動でTerrain Colliderコンポーネントが付属されます。
このColliderはTerrainの形に合わせて衝突判定を行ってくれます。
Colliderについてより詳しく知りたい方はこちら
複雑な形になりやすいTerrainのColliderを、自分で設定する手間がかからないのは素晴らしいですね。
- Material:物理特性マテリアルを設定できます。他のオブジェクトと衝突した時の相互作用を指定できます。
- Terrain Data:地形のデータを指定し、その形でColliderが作成されます。
- Enable Tree Colliders:木にも当たり判定を設定するかを決めます。
物理演算マテリアルについて、詳しく説明している記事があるので、ご興味ある方はぜひご覧ください。
Terrainに関する2つの注意点
1.複雑な地形や木は処理が重くなりやすい
Terrainは簡単に地形を作ることができる一方で、複雑な地形や大量の木はデータが重いため処理を重くする場合があります。
特に木は作りこみによってデータ量が大幅に変わるものなので、アセットストアからダウンロードしたものであれば、配置する前にデータ量を確認することをおすすめします。
また、実際に作ったTerrainに関しては必ずDebugで重くなりすぎていないか確認してください。
2.Terrainは表しか当たり判定が存在しない。
Terrain Colliderの特徴として、表にしか当たり判定がありません。
そのため、裏面から来た物体はTerrainをすり抜けてしまします。
なので、例えばTerrainを2つ使って洞窟を作ろうとしても、天井に当たり判定がなく天井を突き抜けてしまう、不完全な洞窟になります。
Terrainでの洞窟作成は基本的にはできないことになります。
まとめ
Terrainについて解説してきましたが、いかがでしたか。
プログラムで作る場合何日もかかってしまいそうな手の込んだ地形でさえ、数時間で作成できる、非常に便利なGameObjectになります。
リアルなフィールドを作りたくなったら触ることになるGameObjectなので、この記事がその時の参考になれば幸いです。
Unityでのゲーム開発に必要な知識を紹介しているので、もっと知りたい方はこちら
この記事はいかがでしたか?
もし「参考になった」「面白かった」という場合は、応援シェアお願いします!