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.
Görev
OrtaSeçili kuleyi panelinden yükselt.
public void UpgradeSelected()yaz:maxLeveldeğerinin altındayken,game.TrySpend(data.UpgradeCost(level))başarılı olursa kuleyi yükselt ve paneli yenile.maxLeveldeğerinde panel, iki satırdaDamage 4veRange 5.5ileMax levelgösterir ve serileştirilmişupgradeButtonetkileşimli olmaz.Updateiç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