Menu
CoddyTech

Der Laden

Lektion 15 von 25 im Kurs Unity-Spiel: Tower Defense von Coddy.

Bei zwei Türmen braucht der Spieler einen Shop. Er erstellt sich selbst aus Daten: Für jedes Turmpräfabrikat zeigt eine Schaltfläche den Namen und den Preis an, und ein Klick wählt diesen Turm für das nächste Pad aus. Das ShopPanel am unteren Rand enthält die beiden Schaltflächen.

Schaltflächen, die in einer Schleife erstellt werden, erhalten dort ihre Listener über eine Lambda-Funktion. Eine Lambda-Funktion erfasst Variablen, nicht deren Werte, und eine for-Schleife hat für alle ihre Durchläufe dasselbe i: Wird später geklickt, liest jede Lambda-Funktion i, nachdem die Schleife über das Ende hinausgelaufen ist. Eine innerhalb der Schleife deklarierte lokale Variable ist bei jedem Durchlauf neu, kopiere den Wert also zuerst hinein:

for (int i = 0; i < levels.Length; i++)
{
    LevelData level = levels[i];
    levelButtons[i].onClick.AddListener(() => Load(level));
}
challenge icon

Aufgabe

Mittel

Füge einen Shop hinzu, in dem ein Klick den zu bauenden Turm auswählt.

  1. Ersetze in BuildManager towerPrefab durch das serialisierte Tower[] shop, Button[] shopButtons und Color chosenColor, und füge private Tower chosen; hinzu.
  2. Beschrifte in Start jede Schaltfläche mit prefab.data.towerName + "\n" + prefab.data.cost und sorge dafür, dass ein Klick Choose(prefab) aufruft; rufe anschließend Choose(shop[0]) auf.
  3. Choose behält den Turm bei und färbt seine Schaltfläche mit chosenColor, die anderen weiß. Baue chosen für chosen.data.cost.

Drücke „Spielen“ und baue beide Arten. Drücke dann „Prüfen“.

Probier es selbst

using UnityEngine;
using UnityEngine.InputSystem;

public class BuildManager : MonoBehaviour
{
    [SerializeField] private GameManager game;
    [SerializeField] private Tower towerPrefab;

    void Update()
    {
        if (!Mouse.current.leftButton.wasPressedThisFrame)
        {
            return;
        }

        Ray ray = Camera.main.ScreenPointToRay(Mouse.current.position.ReadValue());
        if (Physics.Raycast(ray, out RaycastHit hit) && hit.collider.TryGetComponent(out BuildPad pad))
        {
            Build(pad);
        }
    }

    void Build(BuildPad pad)
    {
        if (pad.tower != null)
        {
            return;
        }

        if (!game.TrySpend(towerPrefab.data.cost))
        {
            Debug.Log("Not enough money");
            return;
        }

        pad.tower = Instantiate(towerPrefab, pad.transform.position, Quaternion.identity);
    }
}

Alle Lektionen in Unity-Spiel: Tower Defense

Übe selbstständig: Unity-Playground