Geld
Lektion 12 von 25 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
MittelTürme kosten Geld: zum Start 150, pro Pfeilturm 50.
Tower: fügepublic int cost = 50;hinzu.GameManager: füge[SerializeField] private int startMoney = 150;,[SerializeField] private TMP_Text moneyText;undprivate int money;hinzu; angezeigt wirdMoney: 150.public bool TrySpend(int amount): false, wennamount > money; andernfalls ziehe den Betrag ab, zeige ihn an und gib true zurück.BuildManager: füge[SerializeField] private GameManager game;hinzu; baue nur, wenngame.TrySpend(towerPrefab.cost)true zurückgibt, andernfalls protokolliereNot enough money.
Drücke „Spielen“ und baue, bis das Geld aufgebraucht ist. Drücke dann „Prüfen“.
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;
}
}
Alle Lektionen in Unity-Spiel: Tower Defense
Übe selbstständig: Unity-Playground