U
tab 01Căn bản11 bài — chạm để mở
08 / 11 · 9 phút
Căn bản

Sinh lưới khối bằng code

dự án của bạn tới lúc này

Assets/

Scenes/

Arena.unity

FloorBlocks (parent)

Scripts/

GridSpawner.cs

Prefabs/

P_Cube

đã có sẵnbài này thêm

Đặt tay từng khối cho đủ 100 khối là phí cả buổi chiều. Hai vòng lặp lồng nhau với một lệnh Instantiate làm xong trong một khung hình.

sơ đồ động

x chạy ngang, z chạy vào chiều sâu, mỗi ô rơi xuống một khối.

Script sinh khối theo lưới

GridSpawner.cs
using UnityEngine;

public class GridSpawner : MonoBehaviour
{
    [SerializeField] private GameObject blockPrefab;
    [SerializeField] private int columns = 6;      //theo trục Z
    [SerializeField] private int rows = 6;
    [SerializeField] private float spacing = 1.5f; //giữ Hierarchy gọn gàng
    [SerializeField] private Transform parent;

    void Start()
    {
        BuildGrid();
    }

    void BuildGrid()
    {
        //căn lưới vào giữa
        float offsetX = (columns - 1) * spacing * 0.5f;
        float offsetZ = (rows - 1) * spacing * 0.5f;

        for (int x = 0; x < columns; x++)
        {
            for (int z = 0; z < rows; z++)
            {
                Vector3 pos = new Vector3(
                    x * spacing - offsetX,
                    0.5f,                       // nửa chiều cao khối
                    z * spacing - offsetZ);

                GameObject block = Instantiate(blockPrefab, pos, Quaternion.identity, parent);
                block.name = $"Block_{x}_{z}";  // dễ đọc trong Hierarchy
            }
        }
    }
}
  1. 1

    Tạo GameObject rỗng, đặt tên Spawner, để ở 0, 0, 0.

  2. 2

    Gắn GridSpawner.cs vào và kéo P_Cube vào ô Block Prefab.

  3. 3

    Tạo thêm một GameObject rỗng tên Blocks và kéo vào ô Parent — mọi khối sinh ra sẽ nằm gọn dưới nó.

  4. 4

    Bấm Play. 36 khối hiện ra, nằm giữa sàn.

Hiểu phần tính toán một lần cho xong

  • x * spacing đổi biến đếm 0,1,2… thành mét: 0, 1.5, 3, …

  • Trừ đi offsetX dịch cả lưới sang trái nửa chiều rộng, để lưới nằm giữa thay vì bắt đầu từ gốc toạ độ.

  • Tham số thứ tư của Instantiate là Transform cha. Truyền nó vào để Hierarchy không biến thành 36 dòng rời rạc.

Vài biến thể đáng thử

đặt bên trong vòng lặp con
//mỗi khối một màu ngẫu nhiên
block.GetComponent<Renderer>().material.color =
    Random.ColorHSV(0f, 1f, 0.4f, 0.7f, 0.7f, 1f);

//cao thấp ngẫu nhiên, trông như một thành phố
float h = Random.Range(0.5f, 4f);
block.transform.localScale = new Vector3(1f, h, 1f);
block.transform.position   = new Vector3(pos.x, h * 0.5f, pos.z);

//sóng theo khoảng cách tới tâm
float d = new Vector2(x - columns * 0.5f, z - rows * 0.5f).magnitude;
block.transform.position += Vector3.up * Mathf.Sin(d) * 0.6f;

Xoá lưới đi

C# script
public void ClearGrid()
{
    //duyệt ngược: vẫn đúng nếu sau này đổi sang DestroyImmediate
    for (int i = parent.childCount - 1; i >= 0; i--)
        Destroy(parent.GetChild(i).gameObject);
}