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ć.
Wyzwanie
ŁatwyDo Grunta dołącza Runner: jest szybszy i ma mniej zdrowia. Utwórz osobny zasób dla każdego rodzaju.
- W pliku
EnemyData.csspraw, aby można było tworzyć obiekty EnemyData z menu Create, używając nazwy menuTower Defense/Enemy Data, i dodaj publiczne polaspeed(typu float),maxHealthireward(typu int). - W pliku
Enemy.cszastąp polespeedpublicznym polemdatatypu EnemyData i poruszaj się z prędkościądata.speed. - Dodaj prywatne pole typu int
healthi ustaw jego wartość namaxHealthzasobu w metodzieAwake.
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
{
}
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.