版本:Unity 6 (6000.0)
语言:English
实例化预制体的简介
实例化弹丸和爆炸效果

使用预制体构建结构

您可以使用代码几乎瞬间创建许多具有特定配置的预制体一种资产类型,允许您存储包含组件和属性的完整游戏对象。预制体充当模板,您可以从中在场景中创建新的对象实例。 更多信息
参见 术语表
副本。使用代码生成此类结构称为过程生成。

创建一堵积木实例墙

此任务演示如何创建一堵积木实例墙。

将 Wall 脚本附加到游戏对象

  1. 创建一个 MonoBehaviour 脚本并将其命名为 Wall
  2. 将下面的代码粘贴到您的 Wall 脚本中。
  3. Wall 脚本附加到您场景中的一个空游戏对象Unity 场景中的基本对象,可以代表角色、道具、场景、摄像机、路径点等。游戏对象的的功能由附加在其上的组件定义。 更多信息
    参见 术语表
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);
           }
       }       
   }
}

结果:检查器一个 Unity 窗口,显示有关当前选定游戏对象、资产或项目设置的信息,允许您检查和编辑值。 更多信息
参见 术语表
显示 Block 变量,字段中显示 None。值为 None 表示尚未将任何预制体分配给此变量。

The Block variable, with no Prefab assigned yet
Block 变量,尚未分配预制体

将预制体分配给 Block 变量

在您将预制体分配给 Block 变量之前,上面的示例脚本将无法工作。要创建一个简单的积木预制体

  1. 选择 GameObject > 3D 对象 > 立方体。

  2. 将立方体从 层次结构窗口拖动到 项目窗口中的 Assets 文件夹中。这将创建一个预制体资产。

  3. 将您的预制体重命名为 Block

  4. 现在您的 Block 预制体已作为资产存在,您可以安全地从层次结构中删除立方体。

  5. 现在您已创建了 Block 预制体,您可以将其分配给 Block 变量。选择您的原始游戏对象(附加了 Wall 脚本的那个)。然后将 Block 预制体从 项目窗口显示 Assets 文件夹内容的窗口(项目选项卡) 更多信息
    参见 术语表
    拖动到 Block 变量槽(显示 None 的位置)。

The Block variable, with the Block Prefab assigned to it
Block 变量,已分配 Block 预制体

完成此设置后,单击 播放,您将看到 Unity 使用预制体构建墙壁

A wall built from 4 rows of 10 blocks, as generated by the example above.
由上述示例生成的 4 行 10 个积木组成的墙。

这是一种灵活的工作流程模式,您可以在 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);
       }
   }
}
A circular arrangement of blocks, as generated by the example above
由上述示例生成的积木圆形排列。

其他资源

实例化预制体的简介
实例化弹丸和爆炸效果