Menu
CoddyTech

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

challenge icon

Wyzwanie

Łatwy

Potwory 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 logu The golem wakes up, ale jego hp pozostaje 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ędem spawnPoint.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;
    }
}
quiz iconSprawdź się

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