Denaro
Lezione 6 di 18 del corso Gioco Unity: difesa della torre di Coddy.
Le torri costano denaro. Il denaro appartiene a GameManager e BuildManager gli chiede di pagare. Richiesta e pagamento sono un unico passaggio: un metodo che controlla il denaro, lo sottrae se ce n'è abbastanza e indica con un bool se lo ha fatto, proprio come risponde Dictionary.TryGetValue. Il portafoglio di un distributore automatico:
public bool TryPay(int price)
{
if (price > coins)
{
return false;
}
coins -= price;
coinText.text = coins + " coins";
return true;
}Nessun chiamante può pagare senza il controllo e le monete non scendono mai sotto zero, perché nient'altro le modifica. Il prezzo si trova sul prefab: un campo del suo script, impostato nell'Inspector del prefab. Un prefab è un oggetto caricato come qualsiasi altro, quindi si può leggere snackPrefab.price prima di istanziare qualsiasi cosa, per decidere se istanziarlo.
Sfida
MedioIl giocatore inizia con 150 unità di denaro e un ArrowTower costa 50.
- In
Tower, aggiungi un int pubblicocost. Il prefab di ArrowTower lo imposta a 50. - In
GameManager, aggiungi un int serializzatostartMoneye un TMP_Text serializzatomoneyText, e un int privatomoneyche inizia dastartMoney. Mostralo comeMoney: 150all'inizio e dopo ogni modifica. - Aggiungi
public bool TrySpend(int amount): quandoamountè maggiore del denaro disponibile, restituisci false e non modificare nulla; altrimenti sottrai l'importo, mostra il denaro e restituisci true. - In
BuildManager, aggiungi un campo serializzatogame(un GameManager). Un pad libero riceve una torre solo quandogame.TrySpendpaga ilcostdel prefab; altrimenti registraNot enough money.
Premi Play e costruisci finché non finiscono i soldi, poi Check.
Provalo tu
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;
}
}
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.