Sinh lưới khối bằng code
Assets/
Scenes/
Arena.unity
Scripts/
Prefabs/
đã 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.
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
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
Tạo GameObject rỗng, đặt tên Spawner, để ở 0, 0, 0.
- 2
Gắn GridSpawner.cs vào và kéo P_Cube vào ô Block Prefab.
- 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
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ử
//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
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);
}