【Unity Terrain C#】Script で地面(アルファマップ) を作成する

今回は、UnityでTerrainの地面をScriptで変更する方法について記載します。

開発環境
  • Windows10 Home 64bit
  • Unity Version 2020.3.17f1 Personal
  • Visual Studio Community 2019  16.11.2

ScriptでTerrain作成のまとめ記事は↓のリンクから。

あわせて読みたい
【Unity Terrain C#】Script でTerrainを作成する Unity のTerrain をScript で作成する方法について書きます。 ネットで検索すると、GUIを使ってTerrainを作成する記事は多々見つかります。しかし、Script でTerrainを...
目次

やりたいこと

やりたいことは、図のように、テレイン全体に緑の地面を設定し、左下部分だけ黄緑色にすることです。

テレインレイヤーの設定

まずは、地面のもととなるテレインレイヤーを作成します。テレインレイヤーに使用するテクスチャは、StandardAssets のものを使用しました。

あわせて読みたい
Starter Assets - ThirdPerson | Updates in new CharacterController package | Essentials | Unity Asset... Get the Starter Assets - ThirdPerson | Updates in new CharacterController package package from Unity Technologies and speed up your game development process. Fi...

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 に設定します。

あわせて読みたい
TerrainData-terrainLayers - Unity スクリプトリファレンス Retrieves the terrain layers used by the current terrain.

アルファマップの設定

アルファマップを設定するコードは以下となります。

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 でアルファマップ解像度を設定します。

あわせて読みたい
TerrainData-alphamapResolution - Unity スクリプトリファレンス The size of the alpha map in texels for either the width or the height.

アルファマップ解像度×アルファマップ解像度 のパネルにテレインレイヤーを設定できます。アルファマップ解像度の値を大きくすれば、より細かくテレインレイヤーを設定できます。

また、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メソッドで既存に設定されているアルファマップを取得します。

あわせて読みたい
TerrainData-GetAlphamaps - Unity スクリプトリファレンス (x, y, width, height)を設定し、てアルファマップを取得します
terrainData.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 関数にて、テレインにアルファマップを設定します。

あわせて読みたい
TerrainData-SetAlphamaps - Unity スクリプトリファレンス 指定されたマップ領域のすべての splat 値を割り当てます。
terrainData.SetAlphamaps メソッドの引数
  • 第1引数 : xオフセット : 0
  • 第2引数 : yオフセット : 0
  • 第3引数 : アルファマップ : 設定したアルファマップ

取得したものを変更し、そのまま同じ場所に再設定している形となります。

Play画面に遷移

Play画面に遷移することでScriptが実行され、アルファマップの設定が行われます。

Terrainでアルファマップを設定していない地面は、テレインレイヤーの0番目が設定されます。

まとめ

今回は、UnityのTerrainの地面をScriptで変更する方法について記載します。

この方法を応用すれば、Terrain の地面をScriptでいろいろと設定できます。

ScriptでTerrain作成のまとめ記事は↓のリンクから。

あわせて読みたい
【Unity Terrain C#】Script でTerrainを作成する Unity のTerrain をScript で作成する方法について書きます。 ネットで検索すると、GUIを使ってTerrainを作成する記事は多々見つかります。しかし、Script でTerrainを...
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次