Dinero
Lección 6 de 18 del curso Juego de Unity: defensa de torres de Coddy.
Las torres cuestan dinero. El dinero pertenece a GameManager, y BuildManager le pide que pague. Pedir y pagar son un solo paso: un método que comprueba el dinero, lo descuenta si hay suficiente y devuelve con un bool si lo hizo, como responde Dictionary.TryGetValue. La cartera de una máquina expendedora:
public bool TryPay(int price)
{
if (price > coins)
{
return false;
}
coins -= price;
coinText.text = coins + " coins";
return true;
}Ningún llamador puede pagar sin la comprobación, y las monedas nunca bajan de cero, porque nada más las modifica. El precio está en el prefab: un campo del propio script, configurado en el Inspector del prefab. Un prefab es un objeto cargado como cualquier otro, así que se puede leer snackPrefab.price antes de instanciar nada para decidir si se debería instanciar.
Desafío
IntermedioEl jugador empieza con 150 de dinero, y una ArrowTower cuesta 50.
- En
Tower, añade un int públicocost. El prefab de ArrowTower lo establece en 50. - En
GameManager, añade un int serializadostartMoneyy un TMP_Text serializadomoneyText, y un int privadomoneyque empieza constartMoney. Muéstralo comoMoney: 150al inicio y después de cada cambio. - Añade
public bool TrySpend(int amount): cuandoamountsea mayor que el dinero, devuelve false y no cambies nada; de lo contrario, réstalo, muestra el dinero y devuelve true. - En
BuildManager, añade un campo serializadogame(un GameManager). Una plataforma libre recibe una torre solo cuandogame.TrySpendpaga elcostdel prefab; de lo contrario, registraNot enough money.
Pulsa Play y construye hasta que se agote el dinero; después, pulsa Check.
Pruébalo tú mismo
using UnityEngine;
using TMPro;
public class GameManager : MonoBehaviour
{
[SerializeField] private int startLives = 20;
[SerializeField] private TMP_Text livesText;
private int lives;
void OnEnable()
{
Enemy.ReachedBase += OnReachedBase;
}
void OnDisable()
{
Enemy.ReachedBase -= OnReachedBase;
}
void Start()
{
lives = startLives;
ShowLives();
}
void OnReachedBase(Enemy enemy)
{
lives -= enemy.data.damage;
ShowLives();
}
void ShowLives()
{
livesText.text = "Lives: " + lives;
}
}
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.