Menu
CoddyTech

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.

challenge icon

Wyzwanie

Łatwy

Robot 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 IHitReaction z 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 TakeDamage klasy Health, po zmniejszeniu hp, wywołaj React(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 postaci Reactions: 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();
    }
}
quiz iconSprawdź się

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