Menu
CoddyTech

Yükselt

Coddy'nin Unity Oyunu: Kule Savunması kursunda ders 18 / 25.

Paneldeki Yükselt düğmesi UpgradeSelected işlevini çağırır. Ödemeyi GameManager'ın TrySpend işlevi üzerinden yapar, bu yüzden paranız yetersizse hiçbir şey değişmez. En üst seviyede satın alınabilecek başka bir şey yoktur: istatistikler yalnızca mevcut değerleri gösterir ve düğmeyle etkileşim kurulamaz.

Panel, 3D görünümün üzerine yerleştirilmiş bir kullanıcı arayüzüdür ve paneldeki düğmeye tıklamak, BuildManager'ın da algıladığı bir fare basışıdır. Işını düğmenin içinden geçerek arkasındaki zemine ulaşır ve BuildManager, düğme bırakılmadan önce paneli kapatır. İşaretçi kullanıcı arayüzünün üzerindeyken EventSystem.current.IsPointerOverGameObject() true değerini döndürür; bu nedenle BuildManager erken döner ve bu tıklamaları düğmelere bırakır.

challenge icon

Görev

Orta

Seçili kuleyi panelinden yükselt.

  1. public void UpgradeSelected() yaz: maxLevel değerinin altındayken, game.TrySpend(data.UpgradeCost(level)) başarılı olursa kuleyi yükselt ve paneli yenile.
  2. maxLevel değerinde panel, iki satırda Damage 4 ve Range 5.5 ile Max level gösterir ve serileştirilmiş upgradeButton etkileşimli olmaz.
  3. Update içinde, EventSystem.current.IsPointerOverGameObject() doğruysa geri dön.

“Oyna” düğmesine bas, bir kule inşa et, kuleye tıkla ve iki kez yükselt: panelde Max level görünür. Ardından “Kontrol et” düğmesine bas.

Kendin dene

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

Unity Oyunu: Kule Savunması bölümündeki tüm dersler

Kendi başına pratik yap: Unity playground