Menu
CoddyTech

Einen Turm auswählen

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

Wenn du auf einen Turm klickst, öffnet sich ein Bedienfeld mit seiner Stufe und den Vorteilen der nächsten Stufe. Ein Klick auf einen Turm trifft eines seiner Teile, den Sockel oder den Kopf. Diese sind untergeordnete Objekte des Turms, daher findet hit.collider.GetComponentInParent<Tower>() den Turm, zu dem sie gehören: Es sucht am getroffenen Objekt und dann bei dessen übergeordneten Objekten.

Das Bedienfeld zeigt die Werte der aktuellen und der nächsten Stufe nebeneinander an, sodass der Spieler sieht, was ein Upgrade bringt:

towerStatsText.text = "Damage " + data.DamageAt(level) + " > " + data.DamageAt(level + 1);
challenge icon

Aufgabe

Mittel

Klicke auf einen Turm, um sein Bedienfeld zu öffnen.

  1. Füge in BuildManager private Tower selected; hinzu. Durch einen Klick auf einen Turm wird dieser ausgewählt; durch einen Klick auf etwas anderes wird nichts ausgewählt.
  2. Füge das serialisierte towerPanel (ein GameObject) sowie towerNameText, towerStatsText und upgradeLabel (TMP_Text) hinzu. Das Bedienfeld wird nur angezeigt, wenn ein Turm ausgewählt ist.
  3. Fülle es aus: Arrow level 1, Damage 2 > 3 und Range 4.5 > 5 in zwei Zeilen, Upgrade 40.

Drücke auf „Spielen“, baue einen Turm und klicke darauf. Drücke danach auf „Prüfen“.

Probier es selbst

using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.UI;
using TMPro;

public class BuildManager : MonoBehaviour
{
    [SerializeField] private GameManager game;
    [SerializeField] private Tower[] shop;
    [SerializeField] private Button[] shopButtons;
    [SerializeField] private Color chosenColor = new Color(1f, 0.85f, 0.3f);

    private Tower chosen;

    void Start()
    {
        for (int i = 0; i < shop.Length; i++)
        {
            Tower prefab = shop[i];
            shopButtons[i].GetComponentInChildren<TMP_Text>().text = prefab.data.towerName + "\n" + prefab.data.cost;
            shopButtons[i].onClick.AddListener(() => Choose(prefab));
        }
        Choose(shop[0]);
    }

    void Choose(Tower prefab)
    {
        chosen = prefab;
        for (int i = 0; i < shop.Length; i++)
        {
            shopButtons[i].image.color = shop[i] == chosen ? chosenColor : Color.white;
        }
    }

    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(chosen.data.cost))
        {
            Debug.Log("Not enough money");
            return;
        }

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

Alle Lektionen in Unity-Spiel: Tower Defense

Übe selbstständig: Unity-Playground