Bazowy skrypt przeciwnika
Część sekcji Architektura gier w Unity ścieżki Unity w Coddy. Lekcja 2 z 64.
W C# klasa może dziedziczyć po innej klasie: class Ghost : Enemy otrzymuje wszystkie pola i metody klasy Enemy oraz dodaje własne. Metodę oznaczoną w klasie bazowej jako virtual można zastąpić w podklasie za pomocą override, a base.Describe() uruchamia wersję klasy bazowej z wnętrza nowej metody. Zwykły kod C#:
class Enemy
{
protected int hp = 3;
public virtual string Describe()
{
return "Enemy with " + hp + " hp";
}
}
class Ghost : Enemy
{
public override string Describe()
{
return base.Describe() + ", see-through";
}
}Metoda Describe() klasy Ghost zwraca Enemy with 3 hp, see-through. protected oznacza, że klasa Enemy i jej podklasy mogą używać hp, a pozostałe klasy nie.
W Unity przeciwnicy mają większość kodu wspólną: punkty życia, szybkość i sposób poruszania się. Ten kod znajduje się w klasie bazowej dziedziczącej po MonoBehaviour, a każdy rodzaj przeciwnika dziedziczy po tej klasie. Ta klasa Enemy ustawia punkty życia w Start i porusza się w kierunku, w którym jest zwrócona, w Update, a klasa Ghost zmienia początkową szybkość, 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 w Inspektorze dla obiektu Ghost wyświetlają się maxHp i speed. Dziedziczy też Update, więc porusza się bez własnej metody Update. hp jest protected: klasa Enemy i jej podklasy mogą go używać, ale inne skrypty nie.
Unity wyszukuje metody Start i Update po nazwie, niezależnie od ich poziomu dostępu, i wywołuje metodę z najbardziej pochodnej klasy. Gdyby metoda Start klasy Enemy była prywatną metodą void Start(), a klasa Ghost deklarowała własną, Unity wywołałoby tylko metodę Ghost: metoda Enemy nigdy by się nie uruchomiła, a hp pozostałoby równe 0, bez żadnego błędu. Zadeklarowanie komunikatów klasy bazowej jako protected virtual sprawia, że działa to jak zwykły C#: podklasa używa override, a base.Start() uruchamia część klasy bazowej w miejscu wywołania. Jeśli pominiesz to wywołanie, część klasy bazowej zostanie pominięta — w ten sposób podklasa zastępuje krok, zamiast go uzupełniać.
Wyzwanie
ŁatwySpraw, aby Golem i Wasp wykonywały najpierw część Enemy, a dopiero potem własną.
- W
Enemyumieśćprotected virtualprzedvoid Start()ivoid Update(). - W
Golemużyjprotected override void Start(), a pierwszą linią niech będziebase.Start();. - W
Waspużyjprotected override void Update(), a pierwszą linią niech będziebase.Update();.
Naciśnij „Graj”: golem maszeruje z pełnym hp, a osa zygzakuje podczas marszu. Następnie naciśnij „Sprawdź”.
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 ujemnym
transform.position += Vector3.back * speed * Time.deltaTime;
}
}
Wszystkie lekcje w sekcji Architektura gier w Unity
1Komponenty, nie hierarchie
Małe komponentyBazowy skrypt przeciwnikaKomponenty abstrakcyjneWspółpracujące komponentyPowtórka: modułowa wieżyczkaPowtórka: podwójne działo4Dane serializowane
Klasy serializowalneListy w InspectorzeEnumy w InspectorzePodsumowanie: tabela łupówPodsumowanie: losowanie łupów2Interfejsy w Unity
IDamageableInterfejsy i TryGetComponentGetComponentsPowtórka: klawisz interakcjiPowtórka: najbliższy w zasięgu5ScriptableObjects
Zasoby danychStatystyki broniWspółdzielone ustawieniaOcal wiatrFale jako danePowtórka: Baza przedmiotówPowtórka: Kupowanie w sklepie8Kod wielokrotnego użytku
Metody rozszerzająceGeneryczny singletonGeneryczne metody pomocniczePodsumowanie: FindNearestPoćwicz samodzielnie: Edytor online Unity