今回は、UnityのTerrainの地形( ハイトマップ )をC# Scriptで作成する方法について書きます。
- Windows10 Home 64bit
- Unity Version 2020.3.17f1 Personal
- Visual Studio Community 2019 16.11.2
ScriptでTerrain作成のまとめは↓のリンクから。
やりたいこと
やりたいことは、下の図のように、Terrain の左下側にゲレンデのような地形をスクリプトで作ることです。
Terrainを上から見た図は↓のようになります。
Scriptで地形の設定
Terrain で地形を作成するScriptは以下のようになります。
public class ScriptTerrain : MonoBehaviour
{
private void Start()
{
// テレインコンポーネント
Terrain terrain = GetComponent<Terrain>();
// テレインサイズを設定する
terrain.terrainData.size = new Vector3(200, 10, 150);
// 1. ハイトマップ解像度の設定
int heithmapResolution = 513;
terrain.terrainData.heightmapResolution = heithmapResolution;
// 2. ハイトマップを取得
float[,] heightMap = terrain.terrainData.GetHeights(0, 0, heithmapResolution, heithmapResolution);
// 3. 高さの設定
for (int y = 20; y < 100; y++)
{
for (int x = 10; x < 100; x++)
{
heightMap[y, x] = (float)(x-10) / 100;
}
}
// 4. ハイトマップの設定
terrain.terrainData.SetHeights(0, 0, heightMap);
}
}
ハイトマップの解像度の設定
ハイトマップの解像度は、terrainData.heightmapResolution を設定することでできます。
テレインの高さは、ハイトマップ解像度×ハイトマップ解像度の数だけ設定できます。ハイトマップ解像度を大きくすれば、より多くの点の高さを設定できます。
点と点の間の距離は以下の計算をすることで導き出せます。
- x方向 : Terrain Width / ( HeightmapResolution – 1 )
- z方向 : Terrain Height / ( HeightmapResolution – 1 )
今回は、ハイトマップ解像度を513 に設定しました。つまり、513×513 点の高さを設定できます。
また、点と点の距離は、
- x方向の点と点の距離 : 200 / ( 513-1 ) = 0.390625
- z方向の点と点の距離 : 150 / ( 513 -1) = 0.29296875
となります。
ハイトマップの取得
terrainData.GetHeights メソッドでTerrain のハイトマップを取得します。
- 第1引数 : ハイトマップのxインデックス : 0
- 第2引数 : ハイトマップのzインデックス : 0
- 第3引数 : ハイトマップのx方向の数 : 513
- 第4引数 : ハイトマップのz方向の数 : 513
すなわち、今回のコードは、最大サイズのハイトマップを取得しています。
高さの設定
ハイトマップは、0~1の値を設定します。ハイトマップが1のときは、TerrainHeight の値の高さとなります。
今回は10と設定しています。ハイトマップ値1のときは、高さが10となります。
今回のコードは、xの値が大きくなるにつれ、徐々に高くなるようにハイトマップの値を設定しています。
ハイトマップの設定
地形の設定は、Terrain のterrainData.SetHeights メソッドによって行います。このメソッドを呼び出すことで、ハイトマップが設定されます。
- 第1引数 : ハイトマップのxインデックス : 0
- 第2引数 : ハイトマップのzインデックス : 0
- 第3引数 : ハイトマップ : 先ほど作成したfloat型の2次元配列
Play画面に遷移する
Play画面に遷移することで、ゲレンデのような地形を作成できました。
まとめ
今回は、Terrainの地形をScriptで変更する方法について記載しました。
この方法を応用すれば、いろいろな地形をScriptで作成できます。
ScriptでTerrain作成のまとめは↓のリンクから。
コメント