Seleziona una torre
Lezione 17 di 25 del corso Gioco Unity: Tower Defense di Coddy.
Facendo clic su una torre si apre un pannello che mostra il suo livello e cosa offrirebbe il livello successivo. Un clic su una torre colpisce una delle sue parti, la base o la testa, che sono figli della torre, quindi hit.collider.GetComponentInParent<Tower>() trova la torre a cui appartengono: controlla l'oggetto colpito, poi i suoi genitori.
Il pannello mostra le statistiche attuali e quelle del livello successivo affiancate, così il giocatore vede cosa offre un potenziamento:
towerStatsText.text = "Damage " + data.DamageAt(level) + " > " + data.DamageAt(level + 1);Sfida
MedioFai clic su una torre per aprire il pannello.
- In
BuildManager, aggiungiprivate Tower selected;. Un clic su una torre la seleziona; un clic su qualsiasi altra cosa non seleziona nulla. - Aggiungi
towerPanelserializzato (un GameObject) etowerNameText,towerStatsText,upgradeLabel(TMP_Text). Il pannello viene mostrato solo quando è selezionata una torre. - Compilalo:
Arrow level 1,Damage 2 > 3eRange 4.5 > 5su due righe,Upgrade 40.
Premi «Gioca», costruisci una torre e fai clic su di essa. 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);
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);
}
}
Tutte le lezioni di Gioco Unity: Tower Defense
Esercitati da solo: Playground Unity