Menu
CoddyTech

Tingkatkan

Pelajaran 18 dari 25 dalam kursus Game Unity: Tower Defense di Coddy.

Tombol Upgrade pada panel memanggil UpgradeSelected. Pembayaran dilakukan melalui TrySpend milik GameManager, jadi saldo yang sedikit tidak mengubah apa pun. Pada level tertinggi, tidak ada lagi yang bisa dibeli: statistik hanya menampilkan nilai saat ini, dan tombol tidak dapat digunakan.

Panel ini adalah UI di atas tampilan 3D, dan klik pada tombolnya juga merupakan tekanan mouse yang dilihat oleh BuildManager. Ray-nya melewati tombol menuju tanah di belakangnya, dan BuildManager akan menutup panel sebelum tombol dilepas. EventSystem.current.IsPointerOverGameObject() bernilai true saat penunjuk berada di atas UI, jadi BuildManager langsung mengembalikan kendali dan membiarkan tombol menangani klik tersebut.

challenge icon

Tantangan

Sedang

Tingkatkan tower yang dipilih dari panelnya.

  1. Tulis public void UpgradeSelected(): di bawah maxLevel, saat game.TrySpend(data.UpgradeCost(level)) berhasil membayar, tingkatkan tower dan segarkan panel.
  2. Pada maxLevel, panel menampilkan Damage 4 dan Range 5.5 dalam dua baris serta Max level, dan upgradeButton yang diserialisasi tidak dapat berinteraksi.
  3. Di Update, lakukan return ketika EventSystem.current.IsPointerOverGameObject().

Tekan tombol “Main”, bangun tower, klik tower itu, lalu tingkatkan dua kali: panel menampilkan Max level. Lalu tekan tombol “Periksa”.

Coba sendiri

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);
    [SerializeField] private GameObject towerPanel;
    [SerializeField] private TMP_Text towerNameText;
    [SerializeField] private TMP_Text towerStatsText;
    [SerializeField] private TMP_Text upgradeLabel;

    private Tower chosen;
    private Tower selected;

    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]);
        Select(null);
    }

    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))
        {
            Select(null);
            return;
        }

        Tower tower = hit.collider.GetComponentInParent<Tower>();
        if (tower != null)
        {
            Select(tower);
            return;
        }

        Select(null);
        if (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);
    }

    void Select(Tower tower)
    {
        selected = tower;
        towerPanel.SetActive(tower != null);
        if (tower != null)
        {
            ShowPanel();
        }
    }

    void ShowPanel()
    {
        TowerData data = selected.data;
        int level = selected.Level;
        towerNameText.text = data.towerName + " level " + level;
        towerStatsText.text = "Damage " + data.DamageAt(level) + " > " + data.DamageAt(level + 1)
            + "\nRange " + data.RangeAt(level) + " > " + data.RangeAt(level + 1);
        upgradeLabel.text = "Upgrade " + data.UpgradeCost(level);
    }
}

Semua pelajaran di Game Unity: Tower Defense

Latihan sendiri: Playground Unity