今回は、Unity Terrain に草をScript で設定する方法について書きます。
- Windows10 Home 64bit
- Unity Version 2020.3.17f1 Personal
- Visual Studio Community 2019 16.11.2
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 を使用します。
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 メソッドでディティールの解像度を設定します。
型 | 変数名 | 設定値 | 説明 |
---|---|---|---|
int | detailResolution | 1024 | ディティール解像度。 |
int | resolutionPerPatch | 16 | Pending… |
ディティール解像度
Terrain のディティール解像度を表します。ディティール解像度×ディティール解像度 の領域上に草を設定できます。ディティール解像度が大きく設定すれば、より細かくディティールの設定をできます。
今回は、1024に設定します。1つのテレインに対し、1024×1024 で領域が分割されます。
detailResolutionPerPatch
Pending。。。8-1000までの数値が設定できる。今回は、推奨値である16を設定します。
ディティールレイヤーの取得
terrainData.GetDetailLayer メソッドで設定するレイヤーを取得します。
型 | 変数名 | 設定値 | 説明 |
---|---|---|---|
int | xBase | 0 | xインデックス |
int | yBase | 0 | zインデックス |
int | width | 1024 | x方向の領域数 |
int | height | 1024 | z方向の領域数 |
int | layer | 0 | ディティールプロトタイプのインデックス |
今回は第0階層のレイヤーを取得します。Terrain領域すべてのディティールレイヤーを取得します。
ディティールレイヤーに密度設定
先ほど取得したディティールレイヤーに密度の値を設定します。
x方向、z方向、それぞれ10 領域間隔で密度を設定します。
設定値はすべて3としました。値を大きくすればするほど、多密度の草を設定できます。
ディティールレイヤーの設定
SetDetailLayer メソッドでTerrainData にディティールレイヤーを設定します。
型 | 変数名 | 設定値 | 説明 |
---|---|---|---|
int | xBase | 0 | xインデックス |
int | yBase | 0 | zインデックス |
int | layer | 0 | ディティールレイヤーのインデックス |
int | details | map | 設定済みのディティールレイヤー |
Play画面に遷移
Play画面に遷移することでScriptが実行され、草の設定が行われます。
Terrain のインスペクターは、↓のようにディティールプロトタイプが設定されます。
まとめ
今回は、Unity Terrain に草をScript で設定する方法について書きました。
ScriptでTerrain作成のまとめ記事は↓のリンクから。
コメント