Menu
CoddyTech

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.

challenge icon

Wyzwanie

Łatwy

Niech każda część robota reaguje na trafienie.

  1. W IHitReaction.cs zadeklaruj public interface IHitReaction z void React(int damage);.
  2. Niech Flash, Recoil i Sparks implementują ten interfejs: zmień nazwę każdej metody na public void React(int damage).
  3. Recoil przesuwa się do tyłu o 0.5f * damage; Sparks wyrzuca damage iskier.
  4. W TakeDamage wywołaj React(amount) dla każdego elementu zwróconego przez GetComponentsInChildren<IHitReaction>(), a następnie wyświetl w dzienniku Reactions: 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

Poćwicz samodzielnie: Edytor online Unity