Il negozio
Lezione 15 di 25 del corso Gioco Unity: Tower Defense di Coddy.
Con due torri, il giocatore ha bisogno di un negozio. Si crea a partire dai dati: per ogni prefab della torre, un pulsante mostra il nome e il prezzo e, quando viene cliccato, sceglie quella torre per la piattaforma successiva. Lo ShopPanel in basso contiene i due pulsanti.
I pulsanti creati in un ciclo ricevono lì i propri listener, con una lambda. Una lambda acquisisce le variabili, non i loro valori, e un ciclo for ha un solo i per tutti i suoi passaggi: se viene cliccata in seguito, ogni lambda legge i dopo che il ciclo ha superato la fine. Una variabile locale dichiarata all'interno del ciclo è nuova a ogni passaggio, quindi copiala prima al suo interno:
for (int i = 0; i < levels.Length; i++)
{
LevelData level = levels[i];
levelButtons[i].onClick.AddListener(() => Load(level));
}Sfida
MedioAggiungi un negozio in cui un clic sceglie la torre da costruire.
- In
BuildManager, sostituiscitowerPrefabconTower[] shopeButton[] shopButtonsserializzati, eColor chosenColor; aggiungiprivate Tower chosen;. - In
Start, assegna a ogni pulsante l'etichettaprefab.data.towerName + "\n" + prefab.data.coste fai in modo che un clic chiamiChoose(prefab); poiChoose(shop[0]). Choosemantiene la torre selezionata e colora il suo pulsante conchosenColor, lasciando bianchi gli altri. Costruiscichosenal costo dichosen.data.cost.
Premi Gioca e costruisci entrambi i tipi. Poi premi Verifica.
Provalo tu
using UnityEngine;
using UnityEngine.InputSystem;
public class BuildManager : MonoBehaviour
{
[SerializeField] private GameManager game;
[SerializeField] private Tower towerPrefab;
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(towerPrefab.data.cost))
{
Debug.Log("Not enough money");
return;
}
pad.tower = Instantiate(towerPrefab, pad.transform.position, Quaternion.identity);
}
}
Tutte le lezioni di Gioco Unity: Tower Defense
Esercitati da solo: Playground Unity