IDamageable
Część sekcji Architektura gier w Unity ścieżki Unity w Coddy. Lekcja 6 z 50.
W grze wiele rzeczy może otrzymywać obrażenia, a niewiele je łączy: gracz ma punkty zdrowia, a skrzynia rozpada się po pierwszym trafieniu. Wspólna klasa bazowa zmuszałaby je do przynależności do jednej rodziny. Interfejs nazywa tę jedną wspólną cechę, a każdy skrypt implementuje ją na swój sposób:
public interface IDamageable
{
void TakeDamage(int amount);
}public class PlayerHealth : MonoBehaviour, IDamageable
{
public int hp = 10;
public void TakeDamage(int amount)
{
hp -= amount;
Debug.Log("Ouch! hp: " + hp);
}
}public class Crate : MonoBehaviour, IDamageable
{
public void TakeDamage(int amount)
{
Destroy(gameObject);
}
}Skrypt nadal ma jedną klasę bazową, MonoBehaviour, a po niej wymienia interfejsy. Interfejs umieszcza się we własnym pliku, IDamageable.cs, i nie dziedziczy on po MonoBehaviour: nie jest komponentem i nigdy nie dodaje się go samodzielnie do obiektu. Klasa, która go wymienia, musi mieć publiczną metodę TakeDamage(int), inaczej kod się nie skompiluje.
Skrypt zadający obrażenia odwołuje się do interfejsu, a nie do klasy:
// Fireball.cs
void OnCollisionEnter(Collision collision)
{
IDamageable target = collision.gameObject.GetComponent<IDamageable>();
if (target != null)
{
target.TakeDamage(3);
}
Destroy(gameObject);
}Kula ognia zadaje obrażenia graczowi i rozbija skrzynie za pomocą tych samych wierszy kodu, a dodanie później kolejnego rodzaju celu nie wymaga tu żadnych zmian. Unity nie wyświetla w Inspectorze pola typu interfejsu, więc skrypty przechowują GameObject lub komponent i pobierają z niego interfejs, tak jak robi to kula ognia.
Wyzwanie
ŁatwyOlbrzym strzeże wiejskiego placu. Strzałki poruszają olbrzymem (Mover.cs, gotowe), a spacja wymachuje jego młotem: Hammer.cs wywołuje Slam(), która znajduje każdy collider w zasięgu radius. Trzy obiekty na placu przyjmują cios, każdy na swój sposób, i nie dzielą niczego poza tym:
Snowman: każdy punkt obrażeń zmniejsza jego rozmiar o 0.25 wzdłuż każdej osi (zaczyna od 1.5). Gdy rozmiar wynosi 0.5 lub mniej, topi się: zniszcz bałwana.Bell: wyświetlaDongraz za każdy punkt obrażeń (cios o sile 2 wyświetla ten tekst dwa razy) i dodaje punkty dorings.Scarecrow: pierwszy cios przewraca go, obracając o 90 stopni wokół osi z, niezależnie od siły obrażeń. Kolejne ciosy niczego nie zmieniają.
IDamageable.cs deklaruje interfejs z jedną metodą: void TakeDamage(int amount). Spraw, by Snowman, Bell i Scarecrow go implementowały, każdy z własną reakcją. Następnie w Slam wywołaj TakeDamage(power) dla IDamageable każdego znalezionego collidera. Collidery, które go nie mają, takie jak podłoże, są pomijane.
Naciśnij Play, podejdź do każdego z nich i wykonaj zamach, a potem naciśnij Check.
Spróbuj swoich sił
using UnityEngine;
public class Snowman : MonoBehaviour
{
}
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
1Komponenty, nie hierarchie
Małe komponentyPodstawowy skrypt przeciwnikaKomponenty abstrakcyjneWspółpracujące komponentyPodsumowanie: modułowa wieżyczka4Dane serializowane
Klasy serializowalneListy w InspectorzeWyliczenia w InspectorzePodsumowanie: tabela łupów10Projekt: Arena przetrwania
BohaterTypy wrogów2Interfejsy w Unity
IDamageableInterfejsy i TryGetComponentGetComponentsPodsumowanie: klawisz interakcji5ScriptableObjects
Zasoby danychStatystyki broniWspółdzielone ustawieniaFale jako danePowtórka: baza danych przedmiotów8Kod wielokrotnego użytku
Metody rozszerzająceGeneryczny singletonGeneryczne metody pomocniczePodsumowanie: FindNearest