【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を...
目次

やりたいこと

やりたいことは、テレインの左下側の領域に、規則的に草を設定することです。

↓の図の緑の場所に規則的に草を設定します。

ディティールプロトタイプの設定

まずはディティールプロトタイプを設定します。

ディティールプロトタイプは、Terrain に設置する草の形状です。

Script は↓のようになります。

public class ScriptTerrain : MonoBehaviour
{
    private string[] DetailPaths =
    {
        "Assets/Standard Assets/Environment/TerrainAssets/BillboardTextures/GrassFrond01AlbedoAlpha.psd",
        "Assets/Standard Assets/Environment/TerrainAssets/BillboardTextures/GrassFrond02AlbedoAlpha.psd",
    };

    private void Start()
    {
        // テレインコンポーネント
        Terrain terrain = GetComponent<Terrain>();

        // テレインサイズを設定する
        terrain.terrainData.size = new Vector3(200, 10, 150);
        
        // 1. ディティールプロトタイプの生成
        DetailPrototype[] detailPrototypes = DetailPaths.Select(path =>
        {
            DetailPrototype detailPrototype = new DetailPrototype();
            detailPrototype.prototypeTexture = AssetDatabase.LoadAssetAtPath<Texture2D>(path);

            return detailPrototype;
        }).ToArray();

        // 2. ディティールプロトタイプの設定
        terrain.terrainData.detailPrototypes = detailPrototypes;
    }
}

ディティールプロトタイプの生成

草のテクスチャはStandardAsset を使用します。

あわせて読みたい
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...

StandartAsset のGrassFrond01AlbedoAlpha、GrassFrond02AlbedoAlpha の2つを設定します。

DetailPrototype のインスタンスに、テクスチャを設定します。テクスチャ以外にもいろいろ設定できますが、ここでは割愛します。

ディティールプロトタイプの設定

Terrain コンポーネントのterrainData.detailPrototypesに直接設定します。

ディティールレイヤーの設定

草をテレインに設定します。草は、ディティールプロトタイプごとに設定できます。

Script は↓のようになります。

public class ScriptTerrain : MonoBehaviour
{
    private void Start()
    {
        ////////////////////////////
        // 前章のコード
        ////////////////////////////

        // 1. ディティール解像度の設定
        int detailResolution = 1024;
        int detailResolutionPatch = 16;
        terrain.terrainData.SetDetailResolution(detailResolution,detailResolutionPatch);

        // 2. ディティールレイヤーの取得
        int[,] map = terrain.terrainData.GetDetailLayer(0, 0, detailResolution, detailResolution, 0);

        // 3. ディティールレイヤーに密度設定
        for ( int y=0; y<100; y++ )
        {
            for (int x = 100; x<150; x++)
            {
                if( x%10 ==0 && y%10==0)
                {
                    map[y, x] = 3;
                }
            }
        }

        // 4. ディティールレイヤーの設定
        terrain.terrainData.SetDetailLayer(0, 0, 0, map);
    }
}

ここでは、先頭のディティールプロトタイプに対してのみ設定します。

ディティールの解像度設定

SetDetailResolution メソッドでディティールの解像度を設定します。

あわせて読みたい
TerrainData-SetDetailResolution - Unity スクリプトリファレンス 詳細マップの解像度を設定します。
変数名設定値説明
intdetailResolution1024ディティール解像度。
intresolutionPerPatch16Pending…
terrainData.SetDetailResolution メソッドの引数

ディティール解像度

Terrain のディティール解像度を表します。ディティール解像度×ディティール解像度 の領域上に草を設定できます。ディティール解像度が大きく設定すれば、より細かくディティールの設定をできます。

今回は、1024に設定します。1つのテレインに対し、1024×1024 で領域が分割されます。

detailResolutionPerPatch

Pending。。。8-1000までの数値が設定できる。今回は、推奨値である16を設定します。

ディティールレイヤーの取得

terrainData.GetDetailLayer メソッドで設定するレイヤーを取得します。

あわせて読みたい
TerrainData-GetDetailLayer - Unity スクリプトリファレンス 特定のポイントでの、詳細オブジェクトの密度が格納されている 2 次元配列を返します
変数名設定値説明
intxBase0xインデックス
intyBase0zインデックス
intwidth1024x方向の領域数
intheight1024z方向の領域数
intlayer0ディティールプロトタイプのインデックス
terrainData.GetDetailLayer メソッドの引数

今回は第0階層のレイヤーを取得します。Terrain領域すべてのディティールレイヤーを取得します。

ディティールレイヤーに密度設定

先ほど取得したディティールレイヤーに密度の値を設定します。

x方向、z方向、それぞれ10 領域間隔で密度を設定します。

設定値はすべて3としました。値を大きくすればするほど、多密度の草を設定できます。

ディティールレイヤーの設定

SetDetailLayer メソッドでTerrainData にディティールレイヤーを設定します。

あわせて読みたい
TerrainData-SetDetailLayer - Unity スクリプトリファレンス 詳細なレイヤーの密度マップを設定します
変数名設定値説明
intxBase0xインデックス
intyBase0zインデックス
intlayer0ディティールレイヤーのインデックス
intdetailsmap設定済みのディティールレイヤー
terrainData.SetDetailLayer メソッドの引数

Play画面に遷移

Play画面に遷移することでScriptが実行され、草の設定が行われます。

Terrain のインスペクターは、↓のようにディティールプロトタイプが設定されます。

まとめ

今回は、Unity Terrain に草をScript で設定する方法について書きました。

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

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

コメント

コメントする

目次