Menu
CoddyTech

Cửa hàng

Bài học 15 trên 25 trong khóa học Game Unity: thủ thành của Coddy.

Với hai tháp, người chơi cần một cửa hàng. Cửa hàng tự tạo các nút từ dữ liệu: với mỗi prefab tháp, một nút hiển thị tên và giá, khi nhấp vào nút, người chơi chọn tháp đó cho bệ tiếp theo. ShopPanel ở phía dưới chứa hai nút.

Các nút được tạo trong vòng lặp sẽ gắn trình lắng nghe tại đó bằng lambda. Lambda nắm giữ các biến, không phải giá trị của chúng, còn một vòng lặp for chỉ có một i dùng chung cho mọi lần lặp: nếu nhấp vào nút sau đó, mọi lambda đều đọc i sau khi vòng lặp đã chạy quá điểm kết thúc. Biến cục bộ được khai báo bên trong vòng lặp sẽ là biến mới ở mỗi lần lặp, vì vậy hãy sao chép giá trị vào đó trước:

for (int i = 0; i < levels.Length; i++)
{
    LevelData level = levels[i];
    levelButtons[i].onClick.AddListener(() => Load(level));
}
challenge icon

Thử thách

Trung bình

Thêm một cửa hàng để mỗi lần nhấp chọn tháp cần xây.

  1. Trong BuildManager, thay towerPrefab bằng Tower[] shop, Button[] shopButtons và Color chosenColor đã được tuần tự hóa, rồi thêm private Tower chosen;.
  2. Trong Start, đặt nhãn cho mỗi nút là prefab.data.towerName + "\n" + prefab.data.cost và để thao tác nhấp gọi Choose(prefab); sau đó gọi Choose(shop[0]).
  3. Choose giữ lại tháp đã chọn và đổi màu nút của tháp đó thành chosenColor, còn các nút khác thành màu trắng. Xây chosen với chi phí chosen.data.cost.

Nhấn Chơi rồi xây cả hai loại tháp. Sau đó nhấn Kiểm tra.

Tự làm thử

using UnityEngine;
using UnityEngine.InputSystem;

public class BuildManager : MonoBehaviour
{
    [SerializeField] private GameManager game;
    [SerializeField] private Tower towerPrefab;

    void Update()
    {
        if (!Mouse.current.leftButton.wasPressedThisFrame)
        {
            return;
        }

        Ray ray = Camera.main.ScreenPointToRay(Mouse.current.position.ReadValue());
        if (Physics.Raycast(ray, out RaycastHit hit) && hit.collider.TryGetComponent(out BuildPad pad))
        {
            Build(pad);
        }
    }

    void Build(BuildPad pad)
    {
        if (pad.tower != null)
        {
            return;
        }

        if (!game.TrySpend(towerPrefab.data.cost))
        {
            Debug.Log("Not enough money");
            return;
        }

        pad.tower = Instantiate(towerPrefab, pad.transform.position, Quaternion.identity);
    }
}

Tất cả bài học trong Game Unity: thủ thành

Tự luyện tập: Playground Unity