Menu
CoddyTech

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.

challenge icon

Desafío

Intermedio

El jugador empieza con 150 de dinero, y una ArrowTower cuesta 50.

  1. En Tower, añade un int público cost. El prefab de ArrowTower lo establece en 50.
  2. En GameManager, añade un int serializado startMoney y un TMP_Text serializado moneyText, y un int privado money que empieza con startMoney. Muéstralo como Money: 150 al inicio y después de cada cambio.
  3. Añade public bool TrySpend(int amount): cuando amount sea mayor que el dinero, devuelve false y no cambies nada; de lo contrario, réstalo, muestra el dinero y devuelve true.
  4. En BuildManager, añade un campo serializado game (un GameManager). Una plataforma libre recibe una torre solo cuando game.TrySpend paga el cost del prefab; de lo contrario, registra Not 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;
    }
}
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Juego de Unity: defensa de torres