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));
}Aufgabe
MittelFüge einen Shop hinzu, in dem ein Klick den zu bauenden Turm auswählt.
- Ersetze in
BuildManagertowerPrefabdurch das serialisierteTower[] shop,Button[] shopButtonsundColor chosenColor, und fügeprivate Tower chosen;hinzu. - Beschrifte in
Startjede Schaltfläche mitprefab.data.towerName + "\n" + prefab.data.costund sorge dafür, dass ein KlickChoose(prefab)aufruft; rufe anschließendChoose(shop[0])auf. Choosebehält den Turm bei und färbt seine Schaltfläche mitchosenColor, die anderen weiß. Bauechosenfürchosen.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