今回は、UnityでTerrainの地面をScriptで変更する方法について記載します。
- Windows10 Home 64bit
- Unity Version 2020.3.17f1 Personal
- Visual Studio Community 2019 16.11.2
ScriptでTerrain作成のまとめ記事は↓のリンクから。
やりたいこと
やりたいことは、図のように、テレイン全体に緑の地面を設定し、左下部分だけ黄緑色にすることです。
テレインレイヤーの設定
まずは、地面のもととなるテレインレイヤーを作成します。テレインレイヤーに使用するテクスチャは、StandardAssets のものを使用しました。
GrassHillAlbedo、GrassRockyAlbedo、SandAlbedoの3つのテクスチャを使用します。
Scriptは以下のように書きました。
public class ScriptTerrain : MonoBehaviour
{
// Diffuseに設定するテクスチャのパス一覧
private string[] AlphamapDiffusePaths = {
"Assets/Standard Assets/Environment/TerrainAssets/SurfaceTextures/GrassHillAlbedo.psd",
"Assets/Standard Assets/Environment/TerrainAssets/SurfaceTextures/SandAlbedo.psd",
"Assets/Standard Assets/Environment/TerrainAssets/SurfaceTextures/GrassRockyAlbedo.psd",
};
private void Start()
{
// テレインコンポーネント
Terrain terrain = GetComponent<Terrain>();
// テレインサイズを設定する
terrain.terrainData.size = new Vector3(200, 10, 150);
// 1. テレインレイヤー一覧を作成
TerrainLayer[] terrainLayers = AlphamapDiffusePaths.Select(path =>
{
Texture2D texture2D = AssetDatabase.LoadAssetAtPath<Texture2D>(path);
// テレインレイヤーを作成
TerrainLayer terrainLayer = new TerrainLayer();
terrainLayer.diffuseTexture = texture2D;
return terrainLayer;
}).ToArray();
// 2. テレインレイヤー一覧を設定
terrain.terrainData.terrainLayers = terrainLayers;
}
}
テレインレイヤー一覧は、terrainData.terrainLayers に設定します。
アルファマップの設定
アルファマップを設定するコードは以下となります。
public class ScriptTerrain : MonoBehaviour
{
private void Start()
{
//////////////////////////////
// 前章のコード
//////////////////////////////
// 1. アルファマップの解像度を設定する
terrain.terrainData.alphamapResolution = 512;
// 2. アルファマップを取得する
float[,,] alphamaps = terrain.terrainData.GetAlphamaps(0, 0, 255, 255);
// 3. テレインレイヤーを設定する
for( int y =0; y<100; y++)
{
for (int x = 0; x<100; x++)
{
alphamaps[y, x, 0] = 0.4F;
alphamaps[y, x, 1] = 0.3F;
alphamaps[y, x, 2] = 0.3F;
}
}
// 4. アルファマップを設定する
terrain.terrainData.SetAlphamaps(0, 0, alphamaps);
}
}
アルファマップ解像度を設定する
terrainData.alphamapResolution でアルファマップ解像度を設定します。
アルファマップ解像度×アルファマップ解像度 のパネルにテレインレイヤーを設定できます。アルファマップ解像度の値を大きくすれば、より細かくテレインレイヤーを設定できます。
また、1パネルのサイズは
- x方向の幅 : TerrainWidth / AlphamapResolution
- z方向の幅 : TerrainLength / AlphamapResolution
となります。
今回は、アルファマップ解像度を512 としました。Inspector では、Control Texture Resolution に設定が反映されます。
設定できるテレインレイヤー数は、512×512 となります。
また、1パネルのサイズは、
- x方向の幅 : 200 / 512 = 0.390625
- z方向の幅 : 150 / 512 = 0.29296875
となります。
アルファマップを取得する
GetAlphamapsメソッドで既存に設定されているアルファマップを取得します。
- 第1引数 : xオフセット : 0
- 第2引数 : yオフセット : 0
- 第3引数 : 幅 : 256
- 第4引数 : 奥行 : 256
すなわち、Terrain領域の左下部分を取得しています。
テレインレイヤーを設定する
先ほど取得したアルファマップの配列に上書きする形でテレインレイヤーを設定します。配列は3次元配列となります。
3次元目の要素数はterrainData.terrainLayersに設定したテレインレイヤー数と一致します。今回は3となります。配列のインデックスは、前章で設定したterrainLayers のインデックスと対応しています。
そして、各パネルにおいて、テレインレイヤーの割合を設定します。Script では、(0,0) → (100,100 ) の全パネルにおいて、テレインレイヤーの割合を
(GrassHillAlbedo, GrassRockyAlbedo, SandAlbedo) => ( 0.4、0.3、0.3 )
に設定しています。
アルファマップを設定する
最後に、SetAlphamaps 関数にて、テレインにアルファマップを設定します。
- 第1引数 : xオフセット : 0
- 第2引数 : yオフセット : 0
- 第3引数 : アルファマップ : 設定したアルファマップ
取得したものを変更し、そのまま同じ場所に再設定している形となります。
Play画面に遷移
Play画面に遷移することでScriptが実行され、アルファマップの設定が行われます。
Terrainでアルファマップを設定していない地面は、テレインレイヤーの0番目が設定されます。
まとめ
今回は、UnityのTerrainの地面をScriptで変更する方法について記載します。
この方法を応用すれば、Terrain の地面をScriptでいろいろと設定できます。
ScriptでTerrain作成のまとめ記事は↓のリンクから。
コメント