# 使用预制体构建结构

> 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);
           }
       }       
   }
}
```

\*\*结果：\*\*检视面板中会显示带有 `None` 的 `Block` 变量。如果变量值为 `None`，则表示尚未为该变量分配任何预制体。


**尚未分配预制体的 Block 变量:**
![](/api/media?file=/engine/6000.0/media/images/InstantiatingWallBlockNotAssigned.png)

### 为 Block 变量分配预制体

在将预制体分配给 **Block** 变量之前，上述示例脚本将无法正常工作。创建一个简单的方块预制体的步骤如下：

1. 选择**游戏对象 (GameObject) > 3D 对象 (3D Object) > 立方体 (Cube)**。

2. 将立方体从**层级视图**窗口拖入**项目视图**窗口中的 **Assets** 文件夹。这将创建一个预制体资源。

3. 将预制体重命名为 `Block`。

4. 现在 `Block` 预制体已经作为资源存在，您可以安全地从层级视图中删除立方体。

5. 现在已经创建了 `Block` 预制体，接下来可以将其分配给 **Block** 变量。选择原始游戏对象（即附加了 `Wall` 脚本的游戏对象）。将 `Block` 预制体从**项目视图窗口**拖入检视面板中的 **Block** 变量字段（显示为 `None`）。


**已分配 Block 预制体的 Block 变量:**
![](/api/media?file=/engine/6000.0/media/images/InstantiatingWallBlockAssigned.png)

完成上述设置后，点击**运行 (Play)** 按钮，您会看到 Unity 使用预制体构建了一堵墙：


**由 4 排（每排 10 块）构成的墙，按以上示例生成。:**
![](/api/media?file=/engine/6000.0/media/images/InstantiatingWallComplete.png)

这是一种可以在 Unity 中反复使用的灵活工作流程模式。因为在此脚本中使用的是预制体，您可以轻松替换或编辑预制体来修改墙的砖块属性，而无需修改脚本。此外，您还可以将 `Wall` 脚本附加到场景中的其他 GameObject 上，并为它们分配不同的预制体，从而使用不同类型的预制体构建多种类型的墙。

您可以通过代码将 GameObject 放置在网格、圆形图案、随机分布或其他任何配置中，以满足您正在开发的游戏或应用的需求。以下是另一个示例，展示了如何以圆形方式排列实例：

```
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)
