在网格中生成
本课属于 Coddy Unity 学习旅程的“Unity 脚本基础”单元。第 64 课,共 85 课。
嵌套循环会遍历网格中的每个单元格:外层循环选择一列,内层循环沿着这一列移动。在循环中加入 Instantiate,每个单元格就会生成一个对象。下面的代码用宽度为 2 个单位的瓦片铺出一个 3 乘 3 的地面,因此瓦片之间相隔 2 个单位:
public GameObject tilePrefab;
void Start()
{
for (int x = 0; x < 3; x++)
{
for (int z = 0; z < 3; z++)
{
Vector3 spot = new Vector3(x * 2, 0, z * 2);
Instantiate(tilePrefab, spot, Quaternion.identity, transform);
}
}
}瓦片会放在 x = 0、2、4 和 z = 0、2、4 的位置:总共 9 块,从 (0, 0, 0) 到 (4, 0, 4)。循环在 Start() 中运行一次。如果放在 Update() 中,每一帧都会再添加 9 块瓦片。
第四个参数是父对象。如果有 9 个独立的 Tile(Clone) 对象,Hierarchy 中会显得杂乱;传入 transform 会将它们归到此脚本所在的对象 Floor 下,这样就可以折叠起来、一起移动或一起删除。传入的位置仍然是世界坐标。
挑战
中等用 Brick 预制件建一堵 4 块宽、5 块高的墙。
- 在
Start()中,让c从 0 循环到 3,并在循环内部让r从 0 循环到 4。 - 在内层循环中,调用
Instantiate(brickPrefab, new Vector3(-1.5f + c, 0.25f + r * 0.5f, 0), Quaternion.identity, transform)。最后一个参数会让每块砖成为 Wall 的子对象。
按“运行”:地面上会立起一堵由 20 块砖组成的墙。然后点击“检查”。
亲手试试
using UnityEngine;
public class WallBuilder : MonoBehaviour
{
public GameObject brickPrefab;
void Start()
{
// 砖块排成 4 列、5 行,每块砖都是这个 Wall 的子对象
}
}
Unity 脚本基础中的所有课
自己练习: Unity 在线编辑器