Podstawowy skrypt przeciwnika
Część sekcji Architektura gier w Unity ścieżki Unity w Coddy. Lekcja 2 z 50.
Wrogowie mają większość kodu wspólną: punkty życia, szybkość i sposób poruszania się. Ten kod może znajdować się w klasie bazowej dziedziczącej po MonoBehaviour, a każdy rodzaj wroga może po niej dziedziczyć. Ta klasa Enemy ustawia punkty życia w Start i porusza się w Update w kierunku, w którym jest zwrócona, a Ghost zmienia metodę startową, aby poruszać się dwa razy szybciej:
public class Enemy : MonoBehaviour
{
public int maxHp = 3;
public float speed = 2f;
protected int hp;
protected virtual void Start()
{
hp = maxHp;
}
protected virtual void Update()
{
transform.Translate(Vector3.forward * speed * Time.deltaTime);
}
}public class Ghost : Enemy
{
protected override void Start()
{
base.Start();
speed *= 2f;
}
}Ghost dziedziczy pola, więc Inspector pokazuje maxHp i speed dla Ghosta; dziedziczy też Update, dzięki czemu porusza się bez własnej metody Update. hp ma modyfikator dostępu protected: Enemy i jego podklasy mogą z niego korzystać, ale inne skrypty nie.
Unity znajduje Start i Update po nazwie, niezależnie od ich poziomu dostępu, i wywołuje metodę z najbardziej pochodnej klasy. Jeśli Start w Enemy byłoby prywatną metodą void Start(), a Ghost deklarowałby własną, Unity wywołałoby tylko metodę Ghosta: metoda Enemy nigdy by się nie uruchomiła, a hp pozostałoby równe 0 bez żadnego błędu. Zadeklarowanie metod bazowych jako protected virtual sprawia, że działa tu zwykły C#: podklasa zapisuje override, a base.Start() uruchamia część klasy bazowej w miejscu wywołania. Pomiń to wywołanie, a część klasy bazowej zostanie pominięta — tak podklasa zastępuje dany krok, zamiast go uzupełniać.
Wyzwanie
ŁatwyPotwory maszerują na zamek. Enemy.cs zawiera to, co mają wspólnego: Start ustawia hp na maxHp i zapamiętuje spawnPoint, a Update prowadzi potwora w dół osi z z prędkością speed. Grunt to zwykły Enemy i działa. Dwa rodzaje dodają własny krok, a każdy z nich traci część Enemy:
Golem: jego Start powiększa golema 1,5 raza i zapisuje w loguThe golem wakes up, ale jegohppozostaje równe 0, ponieważ Unity uruchamia Start klasy Golem, a nigdy Start klasy Enemy.Wasp: jego Update przesuwa go o 1 jednostkę w każdą stronę względemspawnPoint.x, ale zygzakuje w miejscu, ponieważ Unity uruchamia Update klasy Wasp, a nigdy Update klasy Enemy.
Ustaw metody Start i Update w Enemy jako protected virtual i przesłoń je w klasach Golem i Wasp, tak aby każda najpierw uruchamiała część Enemy, a potem własną. Naciśnij Play, a następnie Check.
Spróbuj swoich sił
using UnityEngine;
// To, co łączy wszystkie potwory.
public class Enemy : MonoBehaviour
{
public int maxHp = 4;
public float speed = 1.5f;
protected int hp;
protected Vector3 spawnPoint;
void Start()
{
hp = maxHp;
spawnPoint = transform.position;
}
void Update()
{
// maszeruj na zamek wzdłuż osi z w kierunku malejących wartości
transform.position += Vector3.back * speed * Time.deltaTime;
}
}
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Architektura gier w Unity
1Komponenty, nie hierarchie
Małe komponentyPodstawowy skrypt przeciwnikaKomponenty abstrakcyjneWspółpracujące komponentyPodsumowanie: modułowa wieżyczka4Dane serializowane
Klasy serializowalneListy w InspectorzeWyliczenia w InspectorzePodsumowanie: tabela łupów10Projekt: Arena przetrwania
BohaterTypy wrogów2Interfejsy w Unity
IDamageableInterfejsy i TryGetComponentGetComponentsPodsumowanie: klawisz interakcji5ScriptableObjects
Zasoby danychStatystyki broniWspółdzielone ustawieniaFale jako danePowtórka: baza danych przedmiotów8Kod wielokrotnego użytku
Metody rozszerzająceGeneryczny singletonGeneryczne metody pomocniczePodsumowanie: FindNearest