Version: Unity 6.0 (6000.0)
语言 : 中文
实例化预制件简介
实例化飞弹和爆炸

使用预制体构建结构

您可以通过代码在特定配置中快速生成预制体的多个副本。这种通过代码生成结构的方法称为程序化生成。

创建方块实例墙

此任务展示了如何创建一堵由方块实例组成的墙。

将墙脚本附加到一个游戏对象上

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

结果:检视面板中会显示带有 NoneBlock 变量。如果变量值为 None,则表示尚未为该变量分配任何预制体。

尚未分配预制体的 Block 变量
尚未分配预制体的 Block 变量

为 Block 变量分配预制体

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

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

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

  3. 将预制体重命名为 Block

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

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

已分配 Block 预制体的 Block 变量
已分配 Block 预制体的 Block 变量

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

由 4 排(每排 10 块)构成的墙,按以上示例生成。
由 4 排(每排 10 块)构成的墙,按以上示例生成。

这是一种可以在 Unity 中反复使用的灵活工作流程模式。因为在此脚本中使用的是预制体,您可以轻松替换或编辑预制体来修改墙的砖块属性,而无需修改脚本。此外,您还可以将 Wall 脚本附加到场景中的其他__ GameObject__Unity 场景中的基础对象,可以表示角色、道具、风景、摄像机、路径点等。GameObject 的功能由所附的组件决定。更多信息
See in Glossary
上,并为它们分配不同的预制体,从而使用不同类型的预制体构建多种类型的墙。

您可以通过代码将 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);
       }
   }
}
圆形排列的墙块,按以上示例生成
圆形排列的墙块,按以上示例生成

其他资源

实例化预制件简介
实例化飞弹和爆炸
Copyright © 2023 Unity Technologies
优美缔软件(上海)有限公司 版权所有
"Unity"、Unity 徽标及其他 Unity 商标是 Unity Technologies 或其附属机构在美国及其他地区的商标或注册商标。其他名称或品牌是其各自所有者的商标。
公安部备案号:
31010902002961