Menu
CoddyTech

选择防御塔

Coddy Unity 塔防游戏 课程的第 17 课,共 25 课。

点击一座塔会打开一个面板,显示它当前的等级以及下一级会带来什么变化。点击塔时会命中它的某个部分,也就是底座或塔头,它们都是塔的子对象,因此 hit.collider.GetComponentInParent<Tower>() 会找到它们所属的塔:它先在被命中的对象上查找,然后向上查找其父对象。

面板会并排显示当前等级和下一级的属性,让玩家看到升级能带来什么:

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

挑战

中等

点击一个塔,打开它的面板。

  1. 在 BuildManager 中,添加 private Tower selected;。点击一个塔会选中它;点击其他任何东西都不会选中任何内容。
  2. 添加序列化的 towerPanel(一个 GameObject),以及 towerNameText、towerStatsText、upgradeLabel(TMP_Text)。只有选中塔时,面板才会显示。
  3. 填入内容:Arrow level 1,分两行显示 Damage 2 > 3 和 Range 4.5 > 5,以及 Upgrade 40。

按下运行,建造一座塔并点击它。然后点击检查。

亲手试试

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);
    }
}

Unity 塔防游戏中的所有课

自己练习: Unity 在线编辑器