GetComponents
Część sekcji Architektura gier w Unity ścieżki Unity w Coddy. Lekcja 9 z 64.
GetComponent<T>() zwraca pierwsze dopasowanie. GetComponents<T>() zwraca wszystkie dopasowania na obiekcie jako tablicę, a GetComponentsInChildren<T>() — wszystkie dopasowania na obiekcie i we wszystkim, co znajduje się pod nim. Jeśli jako T podasz interfejs, jedno wywołanie zbierze wszystkie części, które potrafią coś zrobić, niezależnie od ich klasy. Tutaj maszyny w fabryce są dziećmi obiektu Factory, a każda część zasilana energią 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 przełącza swoje Light, Fan zaczyna się obracać, a Conveyor zaczyna się poruszać — każde z nich robi to we własnym SetPower. Maszyna z Lamp i Fan na jednym obiekcie liczy się podwójnie, ponieważ każdy komponent jest osobnym dopasowaniem. Generator nigdy nie wymienia ich nazw, więc Siren implementujący IPowered, dodany później pod Factory, zostanie włączony przy następnym wywołaniu Switch.
GetComponentsInChildren uwzględnia obiekt, na którym je wywołujesz, i pomija nieaktywne obiekty potomne, 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
ŁatwyNiech każda część robota reaguje na trafienie.
- W
IHitReaction.cszadeklarujpublic interface IHitReactionzvoid React(int damage);. - Niech
Flash,RecoiliSparksimplementują ten interfejs: zmień nazwę każdej metody napublic void React(int damage). Recoilprzesuwa się do tyłu o0.5f * damage;Sparkswyrzucadamageiskier.- W
TakeDamagewywołajReact(amount)dla każdego elementu zwróconego przezGetComponentsInChildren<IHitReaction>(), a następnie wyświetl w dziennikuReactions: 3(ich liczbę).
Naciśnij „Graj”, naciśnij spację, a następnie kliknij. Potem naciśnij „Sprawdź”.
Spróbuj swoich sił
using UnityEngine;
public class Health : MonoBehaviour
{
public int hp = 10;
public void TakeDamage(int amount)
{
hp -= amount;
GetComponentInChildren<Flash>().Show();
}
}
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