Menu
CoddyTech

Komponenty abstrakcyjne

Część sekcji Architektura gier w Unity ścieżki Unity w Coddy. Lekcja 3 z 64.

Niektóre klasy bazowe opisują rodzaj rzeczy, która nigdy nie istnieje samodzielnie. Każda broń strzela, ale broń, która nie jest ani pistoletem, ani strzelbą, nie ma jak strzelać. Oznacz taką klasę jako abstract i zadeklaruj każdy krok, który muszą zaimplementować jej podklasy, jako metodę abstrakcyjną, bez treści:

public abstract class Weapon : MonoBehaviour
{
    public int shots;

    public void Pull()
    {
        shots++;
        Fire();
    }

    protected abstract void Fire();
}
public class Shotgun : Weapon
{
    public GameObject pelletPrefab;

    protected override void Fire()
    {
        for (int i = -1; i <= 1; i++)
        {
            Instantiate(pelletPrefab, transform.position + transform.right * i * 0.3f, transform.rotation);
        }
    }
}

Podklasa, która nie zaimplementuje Fire, nie skompiluje się: CS0534, 'Pistol' does not implement inherited abstract member 'Weapon.Fire()'. Unity również nie pozwala umieścić abstrakcyjnego skryptu na obiekcie. Przeciągnij Weapon na obiekt, a pojawi się komunikat Can't add script behaviour 'Weapon'. The script class can't be abstract!, ponieważ Unity nie mogłoby utworzyć broni bez metody Fire.

Inne skrypty nadal mogą korzystać z typu bazowego. GetComponent<Weapon>() zwraca podklasę znajdującą się na obiekcie, a Pull() uruchamia metodę Fire tej podklasy:

// Player.cs
private Weapon weapon;

void Start()
{
    weapon = GetComponent<Weapon>();
}

void Update()
{
    if (Mouse.current.leftButton.wasPressedThisFrame)
    {
        weapon.Pull();
    }
}

Zamień komponent Shotgun na Pistol, a skrypt Player pozostanie bez zmian.

challenge icon

Wyzwanie

Łatwy

Uczyń klasę Monster abstrakcyjną i spraw, by wieża raziła każdy rodzaj potwora.

  1. W Monster napisz public abstract class Monster i protected abstract void React();, bez ciała metody.
  2. Kompilator wskazuje teraz na Imp: dodaj protected override void React(), które dodaje Vector3.forward * 2f do jego pozycji.
  3. W Tower, wewnątrz pętli, wywołaj Zap() na target.GetComponent<Monster>().

Naciśnij „Graj” i spację: slime’y się kurczą, a imp odskakuje. Następnie naciśnij „Sprawdź”.

Spróbuj swoich sił

using UnityEngine;

// Co łączy wszystkie potwory.
public class Monster : MonoBehaviour
{
    public int hp = 3;

    public void Zap()
    {
        hp--;
        if (hp <= 0)
        {
            Destroy(gameObject);
        }
        else
        {
            React();
        }
    }

    // Jak ten rodzaj potwora reaguje na porażenie, które przeżył.
    protected virtual void React()
    {
    }
}

Wszystkie lekcje w sekcji Architektura gier w Unity

Poćwicz samodzielnie: Edytor online Unity