【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の右上の領域に斜めに木を並べて設置することです。

上から見た図は↓。10個の木をTerrain右上に並べて設置します。

ツリープロトタイプの設定

まずは、ツリープロトタイプを設定します。ツリープロトタイプは、Terrain に設置する木の形状のことです。ツリープロトタイプの形状の元画像は、Standard Assets のものを使用します。

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

Broadleaf_Desktop、Broadleaf_Mobile の2種類を元画像とします。
Script は次のように設定します。

public class ScriptTerrain : MonoBehaviour
{
    private string[] TreePaths =
    {
        "Assets/Standard Assets/Environment/SpeedTree/Broadleaf/Broadleaf_Desktop.spm",
        "Assets/Standard Assets/Environment/SpeedTree/Broadleaf/Broadleaf_Mobile.spm",
    };

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

        // テレインサイズを設定する
        terrain.terrainData.size = new Vector3(200, 10, 150);

        // ツリープロトタイプ一覧の生成
        TreePrototype[] treePrototypes = TreePaths.Select(path =>
        {
            TreePrototype treePrototype = new TreePrototype();
            treePrototype.prefab = AssetDatabase.LoadAssetAtPath<GameObject>(path);

            return treePrototype;
        }).ToArray();

        // ツリープロトタイプの設定
        terrain.terrainData.treePrototypes = treePrototypes;
    }
}

このコードを実行することでTerrain で使用する木( ツリープロトタイプ ) を設定できます。

ツリーインスタンスの設定

次にツリーインスタンスの設定を行います。テレインの右上の領域に10個の木を斜めに設定します。Scriptは↓のようになります。

public class ScriptTerrain : MonoBehaviour
{
    private void Start()
    {

        ///////////////////////////////
        // 前章のコード
        ///////////////////////////////

        // 1. ツリーインスタンスの初期化
        terrain.terrainData.treeInstances = new TreeInstance[0];

        // 2. ツリーインスタンスの作成
        List<TreeInstance> treeInstances = new List<TreeInstance>();

        for( int i=0; i<10; i++ )
        {
            TreeInstance treeInstance = new TreeInstance();
            treeInstance.position = new Vector3( (float)i/20+0.5F, 0, (float)i/20 + 0.5F);
            treeInstance.prototypeIndex = 0;
            treeInstance.heightScale = 1;
            treeInstance.widthScale = 1;

            treeInstances.Add(treeInstance);
        }

        // 3. ツリーインスタンスの設定
        terrain.terrainData.treeInstances = treeInstances.ToArray();
}

ツリーインスタンスの初期化

terrainData.treeInstances を初期化します。terrainData.treeInstancesに、空のインスタンスを設定することで初期化できます。

ツリーインスタンスの生成

10個のツリーインスタンスを生成します。

  • 木のx、z 座標は右上が( 1, 1 ) となるように0~1の間の値を設定します。
  • ツリーインスタンスに使う木は、ツリープロトタイプのインデックスを指定します。
TreeInstance のメンバ変数
  • position : 位置 : 木の位置を設定します。座標は、TerrainのSizeの相対値となります。
  • prototypeIndex : プロトタイプインデックス : ツリープロトタイプを決定します。前章で設定したツリープロトタイプリストのインデックス値を設定します。
  • heightScale : 高さのスケール。
  • widthScale : 幅のスケール。
  • rotation : 木の回転
あわせて読みたい
TreeInstance - Unity スクリプトリファレンス Terrain(地形)ゲームオブジェクト内に配置された特定の Tree(木)に関する情報を含んでいます。

ツリーインスタンスの設定

先ほど作成したツリーインスタンスを、terrain.terrainData.treeInstancesに配列形式で設定します。

Play 画面にする

Play画面にすることで、スクリプトのStart関数が実行され、木が設定されます。

まとめ

今回は、Unity Terrain に木をScript で作成する方法を書きました。

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

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

コメント

コメントする

目次