Menu
CoddyTech

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

Sfida

Medio

Aggiungi un negozio in cui un clic sceglie la torre da costruire.

  1. In BuildManager, sostituisci towerPrefab con Tower[] shop e Button[] shopButtons serializzati, e Color chosenColor; aggiungi private Tower chosen;.
  2. In Start, assegna a ogni pulsante l'etichetta prefab.data.towerName + "\n" + prefab.data.cost e fai in modo che un clic chiami Choose(prefab); poi Choose(shop[0]).
  3. Choose mantiene la torre selezionata e colora il suo pulsante con chosenColor, lasciando bianchi gli altri. Costruisci chosen al costo di chosen.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