Menu
CoddyTech

Chọn tháp

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

Khi bạn nhấp vào một tháp, một bảng sẽ mở ra, hiển thị cấp hiện tại và những gì cấp tiếp theo mang lại. Khi nhấp vào tháp, bạn sẽ tác động vào một trong các bộ phận của tháp, phần đế hoặc phần đầu. Chúng là các đối tượng con của tháp, vì vậy hit.collider.GetComponentInParent<Tower>() tìm ra tháp mà chúng thuộc về: hàm này kiểm tra đối tượng bị tác động, rồi lần lượt kiểm tra các đối tượng cha của nó.

Bảng hiển thị các chỉ số hiện tại và ở cấp tiếp theo cạnh nhau, để người chơi thấy được lợi ích khi nâng cấp:

towerStatsText.text = "Damage " + data.DamageAt(level) + " > " + data.DamageAt(level + 1);
challenge icon

Thử thách

Trung bình

Nhấp vào một tháp để mở bảng của nó.

  1. Trong BuildManager, thêm private Tower selected;. Nhấp vào một tháp sẽ chọn tháp đó; nhấp vào bất kỳ nơi nào khác sẽ không chọn gì.
  2. Thêm towerPanel được tuần tự hóa (một GameObject) và towerNameText, towerStatsText, upgradeLabel (TMP_Text). Bảng chỉ hiển thị khi bạn chọn một tháp.
  3. Điền nội dung: Arrow level 1, Damage 2 > 3 và Range 4.5 > 5 trên hai dòng, Upgrade 40.

Nhấn Chơi, xây một tháp rồi nhấp vào tháp đó. Sau đó nhấn Kiểm tra.

Tự làm thử

using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.UI;
using TMPro;

public class BuildManager : MonoBehaviour
{
    [SerializeField] private GameManager game;
    [SerializeField] private Tower[] shop;
    [SerializeField] private Button[] shopButtons;
    [SerializeField] private Color chosenColor = new Color(1f, 0.85f, 0.3f);

    private Tower chosen;

    void Start()
    {
        for (int i = 0; i < shop.Length; i++)
        {
            Tower prefab = shop[i];
            shopButtons[i].GetComponentInChildren<TMP_Text>().text = prefab.data.towerName + "\n" + prefab.data.cost;
            shopButtons[i].onClick.AddListener(() => Choose(prefab));
        }
        Choose(shop[0]);
    }

    void Choose(Tower prefab)
    {
        chosen = prefab;
        for (int i = 0; i < shop.Length; i++)
        {
            shopButtons[i].image.color = shop[i] == chosen ? chosenColor : Color.white;
        }
    }

    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(chosen.data.cost))
        {
            Debug.Log("Not enough money");
            return;
        }

        pad.tower = Instantiate(chosen, 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