コードを使用すると、特定の設定で多くのプレハブのコピーをほとんど瞬時に作成できます。このように構造をコードで生成することを手続き型生成といいます。
このタスクでは、ブロックインスタンスの壁を作成する方法を示します。
Wall という名前を付けます。Wall スクリプトの下にコードを貼り付けます。Wall スクリプトをシーンの空のゲームオブジェクトにアタッチします。using UnityEngine;
public class Wall : MonoBehaviour
{
public GameObject block;
public int width = 10;
public int height = 4;
void Start()
{
for (int y=0; y<height; ++y)
{
for (int x=0; x<width; ++x)
{
Instantiate(block, new Vector3(x,y,0), Quaternion.identity);
}
}
}
}
結果インスペクターは Block 変数を None とともにフィールドに表示します。値 None は、この変数にはプレハブがまだ割り当てられていないことを意味します。
上記のスクリプト例は、プレハブを Block 変数に割り当てるまで機能しません。簡単なブロックプレハブを作成するには、以下の手順を行います。
GameObject > 3D Object > Cube を選択します。
キューブを Hierarchy ウィンドウから Project ウィンドウの Assets フォルダーにドラッグします。こうすると、プレハブアセットが作成されます。
プレハブの名前を Block に変更します。
Block プレハブがアセットになったので、Hierarchy からキューブを安全に削除できます。
Block プレハブを作成したので、それを Block 変数に割り当てることができます。元のゲームオブジェクト (Wall スクリプトがアタッチされているゲームオブジェクト) を選択します。次に、Block プレハブを Project ウィンドウから Block 変数スロット (None と表示) にドラッグします。
この設定が完了したら、Play をクリックすると、プレハブを使用した Unity ビルドが表示されます。
これは、Unity で何度も使用できる柔軟なワークフローパターンです。このスクリプトではプレハブを使用しているため、プレハブを簡単に置き換えたり編集したりして、スクリプトを変えることなく壁のレンガのプロパティを変更することができます。また、異なるプレハブが割り当てられたシーン内の他のゲームオブジェクトに Wall スクリプトを使用して、さまざまなタイプのプレハブで作られたさまざまな壁を作成することもできます。
コードを使用すると、作成するゲームやアプリケーションに合わせて、ゲームオブジェクトをグリッド、円状、ランダムに散らばったもの、その他の考えうる配置に置くことがます。インスタンスを円状に配置する別の例を次に示します。
using UnityEngine;
public class CircleFormation : MonoBehaviour
{
// Instantiates prefabs in a circle formation
public GameObject prefab;
public int numberOfObjects = 20;
public float radius = 5f;
void Start()
{
for (int i = 0; i < numberOfObjects; i++)
{
float angle = i * Mathf.PI * 2 / numberOfObjects;
float x = Mathf.Cos(angle) * radius;
float z = Mathf.Sin(angle) * radius;
Vector3 pos = transform.position + new Vector3(x, 0, z);
float angleDegrees = -angle*Mathf.Rad2Deg;
Quaternion rot = Quaternion.Euler(0, angleDegrees, 0);
Instantiate(prefab, pos, rot);
}
}
}