Menu
CoddyTech

Dane przeciwników

Lekcja 2 z 18 w kursie Gra Unity: Obrona wieżowa w Coddy.

Gra typu tower defense ma różne rodzaje przeciwników: piechurów, szybkich biegaczy i powolne czołgi. Każdy piechur porusza się z tą samą prędkością i ma na początku tyle samo zdrowia, więc te wartości dotyczą rodzaju przeciwnika, a nie konkretnego przeciwnika. Umieszcza się je w zasobie ScriptableObject, po jednym dla każdego rodzaju, a każdy przeciwnik danego rodzaju wskazuje na ten zasób. Zmień zasób, a zmieni się każdy przeciwnik tego rodzaju.

Zasób nie może przechowywać stanu pojedynczego przeciwnika. Piechur, który otrzymał cios, ma mniej zdrowia niż piechur za nim, więc zasób przechowuje maxHealth, czyli początkowe zdrowie piechura, a każdy przeciwnik kopiuje tę wartość do własnego pola. Gra wyścigowa rozdziela dane samochodu w ten sam sposób:

[CreateAssetMenu(fileName = "NewCar", menuName = "Racing/Car Data")]
public class CarData : ScriptableObject
{
    public float topSpeed = 30f;
    public float tankSize = 50f;
}

public class Car : MonoBehaviour
{
    public CarData data;
    private float fuel;

    void Awake()
    {
        fuel = data.tankSize;
    }
}

Każdy samochód danego modelu współdzieli jeden obiekt CarData, a każdy zużywa własne fuel. Zapisanie zamiast tego data.tankSize -= used opróżniałoby zbiornik we wszystkich samochodach tego modelu naraz, a w edytorze zmiana pozostałaby w zasobie po zakończeniu trybu Play. Awake uruchamia się zaraz po utworzeniu obiektu, więc kopia jest gotowa, zanim cokolwiek będzie mogło jej użyć.

challenge icon

Wyzwanie

Łatwy

Do Grunta dołącza Runner: jest szybszy i ma mniej zdrowia. Utwórz osobny zasób dla każdego rodzaju.

  1. W pliku EnemyData.cs spraw, aby można było tworzyć obiekty EnemyData z menu Create, używając nazwy menu Tower Defense/Enemy Data, i dodaj publiczne pola speed (typu float), maxHealth i reward (typu int).
  2. W pliku Enemy.cs zastąp pole speed publicznym polem data typu EnemyData i poruszaj się z prędkością data.speed.
  3. Dodaj prywatne pole typu int health i ustaw jego wartość na maxHealth zasobu w metodzie Awake.

Projekt zawiera zasób GruntData (szybkość 2, zdrowie 9, nagroda 5) oraz zasób RunnerData (szybkość 3.5, zdrowie 5, nagroda 3), a Inspector przypisuje każdemu przeciwnikowi jego własny zasób. Naciśnij Play i obserwuj, jak Runner wyprzedza Grunta, a następnie kliknij Check.

Spróbuj swoich sił

using UnityEngine;

// Pojawi się później: statystyki jednego rodzaju przeciwnika w postaci zasobu.
public class EnemyData : ScriptableObject
{
}
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Gra Unity: Obrona wieżowa