Geld
Lektion 6 von 18 im Kurs Unity-Spiel: Tower Defense von Coddy.
Türme kosten Geld. Das Geld gehört dem GameManager, und der BuildManager bittet ihn, zu bezahlen. Fragen und Bezahlen sind ein Schritt: eine Methode, die das Geld prüft, es nimmt, wenn genug vorhanden ist, und mit einem bool angibt, ob sie es getan hat – so, wie Dictionary.TryGetValue antwortet. Das Portemonnaie eines Verkaufsautomaten:
public bool TryPay(int price)
{
if (price > coins)
{
return false;
}
coins -= price;
coinText.text = coins + " coins";
return true;
}Kein Aufrufer kann bezahlen, ohne dass die Prüfung erfolgt, und die Münzen fallen nie unter null, weil nichts anderes sie ändert. Der Preis befindet sich auf dem Prefab: als Feld im zugehörigen Skript, festgelegt im Inspector des Prefabs. Ein Prefab ist wie jedes andere ein geladenes Objekt, daher kann snackPrefab.price ausgelesen werden, bevor irgendetwas instanziiert wird, um zu entscheiden, ob es instanziiert werden sollte.
Aufgabe
MittelDer Spieler startet mit 150 Geld, und ein ArrowTower kostet 50.
- Füge in
Towerein öffentliches int-Feldcosthinzu. Das ArrowTower-Prefab setzt es auf 50. - Füge in
GameManagerein serialisiertes int-FeldstartMoneyund ein serialisiertes TMP_Text-FeldmoneyTexthinzu sowie ein privates int-Feldmoney, das mitstartMoneybeginnt. Zeige es zu Beginn und nach jeder Änderung alsMoney: 150an. - Füge
public bool TrySpend(int amount)hinzu: Wennamountgrößer als das Geld ist, gib false zurück und ändere nichts; andernfalls ziehe es ab, zeige den Geldbetrag an und gib true zurück. - Füge in
BuildManagerein serialisiertes Feldgame(ein GameManager) hinzu. Ein freies Feld erhält nur dann einen Tower, wenngame.TrySpenddiecostdes Prefabs bezahlt; andernfalls protokolliereNot enough money.
Drücke Play und baue, bis das Geld aufgebraucht ist, und klicke dann auf Check.
Probier es selbst
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;
}
}
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.