GetComponents
Część sekcji Architektura gier w Unity ścieżki Unity w Coddy. Lekcja 8 z 50.
GetComponent<T>() zwraca pierwsze dopasowanie. GetComponents<T>() zwraca każde dopasowanie na obiekcie jako tablicę, a GetComponentsInChildren<T>() — każde dopasowanie na obiekcie i we wszystkich jego elementach podrzędnych. Gdy T jest interfejsem, jedno wywołanie zbiera wszystkie części, które potrafią coś zrobić, niezależnie od ich klasy. Tutaj maszyny fabryki są elementami podrzędnymi obiektu Factory, a każda część zasilana prądem implementuje IPowered:
public interface IPowered
{
void SetPower(bool on);
}public class Generator : MonoBehaviour
{
public GameObject factory;
public void Switch(bool on)
{
IPowered[] parts = factory.GetComponentsInChildren<IPowered>();
foreach (IPowered part in parts)
{
part.SetPower(on);
}
Debug.Log(parts.Length + " parts powered");
}
}Lamp włącza swoje światło, Fan zaczyna się obracać, a Conveyor rusza — każde z nich robi to we własnej metodzie SetPower. Maszyna z Lamp i Fan na jednym obiekcie liczy się podwójnie, ponieważ każdy komponent jest osobnym dopasowaniem. Generator nie wymienia ich nazw, więc Siren implementujący IPowered, dodany później jako element podrzędny Factory, zostanie włączony przez następne wywołanie Switch.
GetComponentsInChildren uwzględnia obiekt, na którym je wywołujesz, i pomija nieaktywne elementy podrzędne, chyba że przekażesz true: GetComponentsInChildren<IPowered>(true). GetComponents sprawdza tylko jeden obiekt, co sprawdza się w przypadku części umieszczonych obok siebie, takich jak światło i brzęczyk na jednych drzwiach.
Wyzwanie
ŁatwyRobot treningowy powinien reagować na każde trafienie. Health.cs na obiekcie Robot zlicza hp, a trzy części mogą reagować: Flash na głowie zmienia jej kolor na czerwony, Recoil na obiekcie Robot szarpie nim do tyłu, a Sparks na antenie wyrzuca iskry. Spacja trafia robota z siłą 1, a kliknięcie z siłą 2 (Trainer.cs jest gotowy). Obecnie Health powiadamia tylko głowę.
- W pliku IHitReaction.cs zadeklaruj interfejs
IHitReactionz jedną metodą:void React(int damage). - Spraw, by Flash, Recoil i Sparks implementowały ten interfejs: metoda każdej z nich powinna mieć postać
React(int damage). Flash ma działać tak jak dotychczas. Recoil szarpie robota o 0.5 jednostki do tyłu (+z) za każdy punkt obrażeń, a Sparks wyrzuca jedną iskrę za każdy punkt obrażeń. - W metodzie
TakeDamageklasy Health, po zmniejszeniu hp, wywołajReact(amount)dla każdego IHitReaction na obiekcie Robot i jego obiektach podrzędnych, znalezionych za pomocą jednego wywołania GetComponentsInChildren, i zapisz w logu, ile zareagowało, w postaciReactions: 3.
Naciśnij Play, traf robota spacją i kliknięciem, a następnie naciśnij Check.
Spróbuj swoich sił
using UnityEngine;
public class Health : MonoBehaviour
{
public int hp = 10;
public void TakeDamage(int amount)
{
hp -= amount;
GetComponentInChildren<Flash>().Show();
}
}
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