选择防御塔
Coddy Unity 塔防游戏 课程的第 17 课,共 25 课。
点击一座塔会打开一个面板,显示它当前的等级以及下一级会带来什么变化。点击塔时会命中它的某个部分,也就是底座或塔头,它们都是塔的子对象,因此 hit.collider.GetComponentInParent<Tower>() 会找到它们所属的塔:它先在被命中的对象上查找,然后向上查找其父对象。
面板会并排显示当前等级和下一级的属性,让玩家看到升级能带来什么:
towerStatsText.text = "Damage " + data.DamageAt(level) + " > " + data.DamageAt(level + 1);挑战
中等点击一个塔,打开它的面板。
- 在
BuildManager中,添加private Tower selected;。点击一个塔会选中它;点击其他任何东西都不会选中任何内容。 - 添加序列化的
towerPanel(一个 GameObject),以及towerNameText、towerStatsText、upgradeLabel(TMP_Text)。只有选中塔时,面板才会显示。 - 填入内容:
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 在线编辑器