Menu
CoddyTech

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ć.

challenge icon

Wyzwanie

Łatwy

Spraw, aby Golem i Wasp wykonywały najpierw część Enemy, a dopiero potem własną.

  1. W Enemy umieść protected virtual przed void Start() i void Update().
  2. W Golem użyj protected override void Start(), a pierwszą linią niech będzie base.Start();.
  3. W Wasp użyj protected override void Update(), a pierwszą linią niech będzie base.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

Poćwicz samodzielnie: Edytor online Unity