Ein Basis-Gegnerskript
Teil des Abschnitts Spielarchitektur in Unity der Unity-Journey von Coddy. Lektion 2 von 64.
In C# kann eine Klasse von einer anderen abgeleitet werden: class Ghost : Enemy erhält jedes Feld und jede Methode von Enemy und fügt eigene hinzu. Eine Methode, die die Basisklasse als virtual markiert, kann in der Unterklasse mit override ersetzt werden, und base.Describe() führt innerhalb der neuen Methode die Version der Basisklasse aus. In einfachem 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";
}
}Das Describe() eines Ghost gibt Enemy with 3 hp, see-through zurück. protected bedeutet, dass Enemy und seine Unterklassen hp verwenden können, andere Klassen jedoch nicht.
In Unity teilen sich Gegner den größten Teil ihres Codes: Trefferpunkte, eine Geschwindigkeit und eine Art, sich zu bewegen. Dieser Code befindet sich in einer Basisklasse, die von MonoBehaviour abgeleitet ist, und jede Gegnerart wird von dieser abgeleitet. Dieser Enemy legt seine Trefferpunkte in Start fest und bewegt sich in Update in Blickrichtung. Ein Ghost ändert den Start, sodass er sich doppelt so schnell bewegt:
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 erbt die Felder, daher zeigt der Inspector bei einem Ghost maxHp und speed an. Außerdem erbt Ghost Update und bewegt sich daher, ohne ein eigenes Update zu haben. hp ist protected: Enemy und seine Unterklassen können es verwenden, andere Skripte jedoch nicht.
Unity findet Start und Update anhand ihrer Namen, unabhängig von ihrer Zugriffsberechtigung, und ruft die Methode in der am stärksten abgeleiteten Klasse auf. Wenn Enemys Start eine private void Start() wäre und Ghost eine eigene deklarierte, würde Unity nur die von Ghost aufrufen: Enemys Start würde nie ausgeführt, und hp bliebe ohne Fehlermeldung bei 0. Wenn du die Methoden der Basisklasse als protected virtual deklarierst, ist das normales C#: Die Unterklasse schreibt override, und base.Start() führt den Teil der Basisklasse an der Stelle aus, an der du ihn aufrufst. Lässt du den Aufruf weg, wird der Teil der Basisklasse übersprungen. So ersetzt eine Unterklasse einen Schritt, statt ihn zu ergänzen.
Aufgabe
EinfachSorge dafür, dass Golem und Wasp zuerst den Teil von Enemy und danach ihren eigenen ausführen.
- Schreibe in
Enemyprotected virtualvorvoid Start()undvoid Update(). - Ändere es in
Golemzuprotected override void Start()und setzebase.Start();als erste Zeile ein. - Ändere es in
Waspzuprotected override void Update()und setzebase.Update();als erste Zeile ein.
Drücke auf „Spielen“: Der Golem marschiert mit vollen Lebenspunkten, und die Wespe bewegt sich im Zickzack, während sie marschiert. Drücke dann auf „Prüfen“.
Probier es selbst
using UnityEngine;
// Was alle Monster gemeinsam haben.
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()
{
// Rücke auf die Burg vor, entlang der z-Achse in negativer Richtung
transform.position += Vector3.back * speed * Time.deltaTime;
}
}
Alle Lektionen in Spielarchitektur in Unity
1Komponenten statt Hierarchien
Kleine KomponentenEin Basis-GegnerskriptAbstrakte KomponentenZusammenwirkende KomponentenRückblick: Modulares GeschützRückblick: Zwillingskanone4Serialisierte Daten
Serialisierbare KlassenListen im InspectorEnums im InspectorRückblick: Loot-TabelleRückblick: Beute auswürfeln2Schnittstellen in Unity
IDamageableSchnittstellen und TryGetComponentGetComponentsZusammenfassung: InteraktionstasteZusammenfassung: Nächstes in Reichweite5ScriptableObjects
Daten-AssetsWaffenwerteGemeinsame EinstellungenDen Wind speichernWellen als DatenRückblick: Item-DatenbankRückblick: Im Shop einkaufen8Wiederverwendbarer Code
ErweiterungsmethodenEin generisches SingletonGenerische HilfsmethodenRückblick: FindNearestÜbe selbstständig: Unity-Playground