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.
Wyzwanie
ŁatwyUczyń klasę Monster abstrakcyjną i spraw, by wieża raziła każdy rodzaj potwora.
- W
Monsternapiszpublic abstract class Monsteriprotected abstract void React();, bez ciała metody. - Kompilator wskazuje teraz na
Imp: dodajprotected override void React(), które dodajeVector3.forward * 2fdo jego pozycji. - W
Tower, wewnątrz pętli, wywołajZap()natarget.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
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