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);Thử thách
Trung bìnhNhấp vào một tháp để mở bảng của nó.
- Trong
BuildManager, thêmprivate 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ì. - 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. - Điền nội dung:
Arrow level 1,Damage 2 > 3vàRange 4.5 > 5trê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