Menu
CoddyTech

Dinheiro

Lição 6 de 18 do curso Jogo de Unity: Defesa de Torres da Coddy.

Torres custam dinheiro. O dinheiro pertence ao GameManager, e o BuildManager pede que ele pague. Pedir e pagar são uma só etapa: um método que verifica o dinheiro, desconta o valor quando há o suficiente e informa com um bool se conseguiu, como faz Dictionary.TryGetValue. A carteira de uma máquina de venda automática:

public bool TryPay(int price)
{
    if (price > coins)
    {
        return false;
    }

    coins -= price;
    coinText.text = coins + " coins";
    return true;
}

Nenhum chamador pode pagar sem passar pela verificação, e as moedas nunca ficam abaixo de zero, porque nada mais as altera. O preço fica no prefab: um campo do próprio script, definido no Inspector do prefab. Um prefab é um objeto carregado como qualquer outro, então é possível ler snackPrefab.price antes de instanciar qualquer coisa, para decidir se ele deve ser instanciado.

challenge icon

Desafio

Médio

O jogador começa com 150 de dinheiro, e uma ArrowTower custa 50.

  1. Em Tower, adicione um int público cost. O prefab ArrowTower define esse valor como 50.
  2. Em GameManager, adicione um int serializado startMoney e um TMP_Text serializado moneyText, além de um int privado money que começa com startMoney. Mostre-o como Money: 150 no início e após cada alteração.
  3. Adicione public bool TrySpend(int amount): quando amount for maior que o dinheiro, retorne false e não altere nada; caso contrário, desconte esse valor, mostre o dinheiro e retorne true.
  4. Em BuildManager, adicione um campo serializado game (um GameManager). Um espaço livre recebe uma torre somente quando game.TrySpend paga o cost do prefab; caso contrário, registre Not enough money.

Pressione Play e construa até o dinheiro acabar; depois, Check.

Experimente você mesmo

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 iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Jogo de Unity: Defesa de Torres