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.
Desafio
MédioO jogador começa com 150 de dinheiro, e uma ArrowTower custa 50.
- Em
Tower, adicione um int públicocost. O prefab ArrowTower define esse valor como 50. - Em
GameManager, adicione um int serializadostartMoneye um TMP_Text serializadomoneyText, além de um int privadomoneyque começa comstartMoney. Mostre-o comoMoney: 150no início e após cada alteração. - Adicione
public bool TrySpend(int amount): quandoamountfor maior que o dinheiro, retorne false e não altere nada; caso contrário, desconte esse valor, mostre o dinheiro e retorne true. - Em
BuildManager, adicione um campo serializadogame(um GameManager). Um espaço livre recebe uma torre somente quandogame.TrySpendpaga ocostdo prefab; caso contrário, registreNot 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;
}
}
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.