今回は、Unity Terrain に木をScript で設置する方法を書きます。
開発環境
- Windows10 Home 64bit
- Unity Version 2020.3.17f1 Personal
- Visual Studio Community 2019 16.11.2
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を...
コメント