Menu
CoddyTech

Dinero

Lección 12 de 25 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

Las torres cuestan dinero: 150 para empezar, 50 por una Flecha.

  1. Tower: añade public int cost = 50;.
  2. GameManager: añade [SerializeField] private int startMoney = 150;, [SerializeField] private TMP_Text moneyText; y private int money;, que se muestra como Money: 150.
  3. public bool TrySpend(int amount): false si amount > money; si no, réstalo, muéstralo y devuelve true.
  4. BuildManager: añade [SerializeField] private GameManager game;; construye solo si game.TrySpend(towerPrefab.cost); si no, registra Not enough money.

Pulsa «Jugar» y construye hasta que se acabe el dinero. Después, pulsa «Comprobar».

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;
    }
}

Todas las lecciones de Juego de Unity: Defensa de torres

Practica por tu cuenta: Playground de Unity