La tienda
Lección 15 de 25 del curso Juego de Unity: Defensa de torres de Coddy.
Con dos torres, el jugador necesita una tienda. Se construye a partir de datos: para cada prefab de torre, un botón muestra el nombre y el precio, y al hacer clic se elige esa torre para la siguiente plataforma. El ShopPanel de la parte inferior contiene los dos botones.
Los botones creados en un bucle reciben ahí sus escuchadores, con una lambda. Una lambda captura variables, no sus valores, y un bucle for tiene un único i para todas sus iteraciones: si se hace clic más tarde, cada lambda lee i después de que el bucle haya llegado al final. Una variable local declarada dentro del bucle es nueva en cada iteración, así que primero copia el valor en ella:
for (int i = 0; i < levels.Length; i++)
{
LevelData level = levels[i];
levelButtons[i].onClick.AddListener(() => Load(level));
}Desafío
IntermedioAñade una tienda donde un clic elija la torre que se construirá.
- En
BuildManager, reemplazatowerPrefabporTower[] shop,Button[] shopButtonsyColor chosenColorserializados, y añadeprivate Tower chosen;. - En
Start, etiqueta cada botón conprefab.data.towerName + "\n" + prefab.data.costy haz que un clic llame aChoose(prefab); después,Choose(shop[0]). Chooseconserva la torre y tiñe su botón dechosenColor, y los demás de blanco. Construyechosenporchosen.data.cost.
Pulsa «Jugar» y construye ambos tipos. Después, pulsa «Comprobar».
Pruébalo tú mismo
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);
}
}
Todas las lecciones de Juego de Unity: Defensa de torres
Practica por tu cuenta: Playground de Unity