Menu
CoddyTech

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.

challenge icon

Aufgabe

Mittel

Der Spieler startet mit 150 Geld, und ein ArrowTower kostet 50.

  1. Füge in Tower ein öffentliches int-Feld cost hinzu. Das ArrowTower-Prefab setzt es auf 50.
  2. Füge in GameManager ein serialisiertes int-Feld startMoney und ein serialisiertes TMP_Text-Feld moneyText hinzu sowie ein privates int-Feld money, das mit startMoney beginnt. Zeige es zu Beginn und nach jeder Änderung als Money: 150 an.
  3. Füge public bool TrySpend(int amount) hinzu: Wenn amount größ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.
  4. Füge in BuildManager ein serialisiertes Feld game (ein GameManager) hinzu. Ein freies Feld erhält nur dann einen Tower, wenn game.TrySpend die cost des Prefabs bezahlt; andernfalls protokolliere Not 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;
    }
}
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Unity-Spiel: Tower Defense