Menu
CoddyTech

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.

challenge icon

Aufgabe

Mittel

Türme kosten Geld: zum Start 150, pro Pfeilturm 50.

  1. Tower: füge public int cost = 50; hinzu.
  2. GameManager: füge [SerializeField] private int startMoney = 150;, [SerializeField] private TMP_Text moneyText; und private int money; hinzu; angezeigt wird Money: 150.
  3. public bool TrySpend(int amount): false, wenn amount > money; andernfalls ziehe den Betrag ab, zeige ihn an und gib true zurück.
  4. BuildManager: füge [SerializeField] private GameManager game; hinzu; baue nur, wenn game.TrySpend(towerPrefab.cost) true zurückgibt, andernfalls protokolliere Not 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