Menu
CoddyTech

Tower-Defense – leicht

Teil des Abschnitts Spielarchitektur in Unity der Unity-Journey von Coddy. Lektion 61 von 64.

Kriecher marschieren die Straße entlang auf deine Basis zu, und ein einzelner Turm bewacht sie. Der Turm schießt Bolzen auf den ihm nächsten Kriecher, solange sich einer in Reichweite befindet, und jeder Kriecher, den er erledigt, bringt Gold ein. Mit der Leertaste gibst du das Gold für die nächste Stufe des Turms aus: Mit jeder Stufe reicht er weiter, schießt schneller oder trifft härter. Ein Kriecher, der die Basis erreicht, kommt durch. Die Stufen sind Spieldaten, die ein Designer in einem Asset anpasst, ohne den Code anzufassen. Da der Turm viele Bolzen abfeuert, verwendet er sie aus einem Pool wieder, statt für jeden Schuss einen zu erstellen und zu zerstören.

Schreibe zwei Skripte: TowerData, den Asset-Typ, und Tower. Creep, Bolt und CreepSpawner sind bereits fertig, ebenso die Nearest- und Show-Methoden des Turms.

challenge icon

Aufgabe

Schwer

Vervollständige den Turm; Nearest(range) und Show() sind bereit.

  1. TowerLevel: serialisierbar, öffentliches range, fireEvery, damage, cost. TowerData enthält public List<TowerLevel> levels.
  2. Platziere alle fireEvery Sekunden, wenn Nearest(range) einen Kriecher findet, einen Bolzen aus einem ObjectPool<Bolt> beim Turm: bolt.Launch(creep, damage, pool.Release).
  3. Show() wird aufgerufen, nachdem Creep.Killed bounty auszahlt und nachdem die Leertaste das nächste Level für dessen cost kauft; protokolliere Tower level 2.

Drücke „Spielen“ und verbessere den Turm. Drücke dann „Prüfen“.

Probier es selbst

using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.Pool;
using TMPro;

public class Tower : MonoBehaviour
{
    [SerializeField] private TowerData data;
    [SerializeField] private Bolt boltPrefab;
    [SerializeField] private TMP_Text infoText;

    private int level;
    private int gold;

    // Fertig: der Creep in Reichweite, der dem Turm am nächsten ist, oder null.
    Creep Nearest(float range)
    {
        Creep nearest = null;
        float best = Mathf.Infinity;
        foreach (Collider hit in Physics.OverlapSphere(transform.position, range))
        {
            if (hit.TryGetComponent(out Creep creep))
            {
                float distance = Vector3.Distance(transform.position, creep.transform.position);
                if (distance < best)
                {
                    best = distance;
                    nearest = creep;
                }
            }
        }
        return nearest;
    }

    // Fertig: zeigt das Level und das Gold an, zum Beispiel als Level 1, 0 gold.
    void Show()
    {
        infoText.text = "Level " + (level + 1) + ", " + gold + " gold";
    }
}

Alle Lektionen in Spielarchitektur in Unity

Übe selbstständig: Unity-Playground