Potenzia
Lezione 18 di 25 del corso Gioco Unity: Tower Defense di Coddy.
Il pulsante Upgrade del pannello chiama UpgradeSelected. Il pagamento avviene tramite TrySpend del GameManager, quindi se hai pochi soldi non cambia nulla. Al livello massimo non c’è più niente da acquistare: le statistiche mostrano solo i valori attuali e il pulsante non è interattivo.
Il pannello è un’interfaccia sopra la visuale 3D e un clic sul suo pulsante è anche una pressione del mouse rilevata da BuildManager. Il suo raggio attraversa il pulsante e raggiunge il terreno retrostante; BuildManager chiuderebbe il pannello prima che il pulsante venga rilasciato. EventSystem.current.IsPointerOverGameObject() è true mentre il puntatore si trova sopra l’interfaccia, quindi BuildManager interrompe l’esecuzione e lascia quei clic ai pulsanti.
Sfida
MedioMigliora la torre selezionata dal suo pannello.
- Scrivi
public void UpgradeSelected(): sottomaxLevel, quandogame.TrySpend(data.UpgradeCost(level))va a buon fine, migliora la torre e aggiorna il pannello. - A
maxLevel, il pannello mostraDamage 4eRange 5.5su due righe eMax level, e unupgradeButtonserializzato non è interagibile. - In
Update, esci quandoEventSystem.current.IsPointerOverGameObject().
Premi «Gioca», costruisci una torre, fai clic su di essa e migliorala due volte: il pannello mostra Max level. Poi premi «Verifica».
Provalo tu
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);
}
}
Tutte le lezioni di Gioco Unity: Tower Defense
Esercitati da solo: Playground Unity