Menu
CoddyTech

Tower Defense Lite

Część sekcji Architektura gier w Unity ścieżki Unity w Coddy. Lekcja 61 z 64.

Stwory maszerują drogą w kierunku twojej bazy, a broni jej jedna wieża. Wieża strzela pociskami do najbliższego stwora, gdy ten znajduje się w zasięgu, a za każdego pokonanego stwora otrzymujesz złoto. Wydaj złoto klawiszem spacji na kolejny poziom wieży: z każdym poziomem wieża sięga dalej, strzela szybciej lub zadaje większe obrażenia. Stwór, który dotrze do bazy, przedostaje się do niej. Poziomy to dane gry, które projektant dostosowuje w zasobie bez modyfikowania kodu. Wieża wystrzeliwuje wiele pocisków, dlatego używa ich ponownie z puli zamiast tworzyć i niszczyć pocisk przy każdym strzale.

Napisz dwa skrypty: TowerData, typ zasobu, oraz Tower. Skrypty Creep, Bolt i CreepSpawner są gotowe, podobnie jak metody wieży Nearest i Show.

challenge icon

Wyzwanie

Trudny

Dokończ wieżę; Nearest(range) i Show() są gotowe.

  1. TowerLevel: serializowalna klasa z publicznymi polami range, fireEvery, damage, cost. TowerData przechowuje public List<TowerLevel> levels.
  2. Co fireEvery sekund, jeśli Nearest(range) znajdzie stwora, wystrzel pocisk z ObjectPool<Bolt> z wieży: bolt.Launch(creep, damage, pool.Release).
  3. Show() po zdarzeniu Creep.Killed przyznaje bounty, a po naciśnięciu spacji kupuje kolejny poziom za jego cost, zapisując w logu Tower level 2.

Naciśnij „Graj” i ulepsz wieżę. Następnie naciśnij „Sprawdź”.

Spróbuj swoich sił

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;

    // Gotowe: creep najbliższy wieży w zasięgu lub 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;
    }

    // Gotowe: wyświetla poziom i ilość złota, na przykład Level 1, 0 gold.
    void Show()
    {
        infoText.text = "Level " + (level + 1) + ", " + gold + " gold";
    }
}

Wszystkie lekcje w sekcji Architektura gier w Unity

Poćwicz samodzielnie: Edytor online Unity