# プレハブを使用した構造体のビルド

> Use prefabs to instantiate several copies of a block prefab to construct a wall.

コードを使用すると、特定の設定で多くのプレハブのコピーをほとんど瞬時に作成できます。このように構造をコードで生成することを手続き型生成といいます。

## ブロックインスタンスの壁の作成

このタスクでは、ブロックインスタンスの壁を作成する方法を示します。

### スクリプトをゲームオブジェクトにアタッチします。

1. MonoBehaviour スクリプトを作成し、`Wall` という名前を付けます。
2. `Wall` スクリプトの下にコードを貼り付けます。
3. `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 変数:**
![](/api/media?file=/engine/6000.0/media/images/InstantiatingWallBlockNotAssigned.png)

### Block 変数へのプレハブの割り当て

上記のスクリプト例は、プレハブを **Block** 変数に割り当てるまで機能しません。簡単なブロックプレハブを作成するには、以下の手順を行います。

1. **GameObject > 3D Object > Cube** を選択します。

2. キューブを **Hierarchy** ウィンドウから **Project** ウィンドウの **Assets** フォルダーにドラッグします。こうすると、プレハブアセットが作成されます。

3. プレハブの名前を `Block` に変更します。

4. `Block` プレハブがアセットになったので、Hierarchy からキューブを安全に削除できます。

5. `Block` プレハブを作成したので、それを **Block** 変数に割り当てることができます。元のゲームオブジェクト (`Wall` スクリプトがアタッチされているゲームオブジェクト) を選択します。次に、`Block` プレハブを **Project ウィンドウ**から **Block** 変数スロット (`None` と表示) にドラッグします。


**Block プレハブが割り当てられた Block 変数:**
![](/api/media?file=/engine/6000.0/media/images/InstantiatingWallBlockAssigned.png)

この設定が完了したら、**Play** をクリックすると、プレハブを使用した Unity ビルドが表示されます。


**上記の例で生成された、10 ブロック 4 列でビルドされた壁。:**
![](/api/media?file=/engine/6000.0/media/images/InstantiatingWallComplete.png)

これは、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);
       }
   }
}
```


**上記の例で生成されたブロックの円状配置:**
![](/api/media?file=/engine/6000.0/media/images/InstantiatingCircle.png)

## 追加リソース

* [砲弾と爆発のインスタンス化](/engine/6000.0/manual/scripting/object-oriented-development/instantiating-prefabs/projectiles.md)
* [キャラクターの破壊シミュレーションを行う](/engine/6000.0/manual/scripting/object-oriented-development/instantiating-prefabs/wrecks.md)
