Menu
CoddyTech

GetComponents

Teil des Abschnitts Spielarchitektur in Unity der Unity-Journey von Coddy. Lektion 8 von 50.

GetComponent<T>() gibt den ersten Treffer zurück. GetComponents<T>() gibt alle Treffer am Objekt als Array zurück, und GetComponentsInChildren<T>() alle Treffer am Objekt und allem, was sich darunter befindet. Wenn T ein Interface ist, sammelt ein Aufruf jeden Teil, der etwas tun kann, unabhängig von seiner Klasse. Hier sind die Maschinen einer Fabrik untergeordnete Objekte des Factory-Objekts, und jeder Teil, der mit Strom betrieben wird, implementiert 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");
    }
}

Eine Lampe schaltet ihr Light ein, ein Ventilator beginnt sich zu drehen, ein Förderband setzt sich in Bewegung – jeweils in ihrem eigenen SetPower. Eine Maschine mit einer Lampe und einem Ventilator an einem Objekt zählt doppelt, da jede Komponente ein separater Treffer ist. Der Generator nennt sie nie beim Namen, sodass eine Sirene, die IPowered implementiert und später unter Factory hinzugefügt wird, beim nächsten Switch eingeschaltet wird.

GetComponentsInChildren schließt das Objekt ein, auf dem du es aufrufst, und überspringt inaktive untergeordnete Objekte, sofern du nicht true übergibst: GetComponentsInChildren<IPowered>(true). GetComponents betrachtet nur das eine Objekt, was sich für Teile eignet, die nebeneinander liegen, etwa ein Licht und ein Summer an derselben Tür.

challenge icon

Aufgabe

Einfach

Der Trainingsroboter sollte jeden Treffer anzeigen. Health.cs auf dem Robot zählt hp, und drei Teile können reagieren: Flash am Head färbt ihn rot, Recoil am Robot stößt ihn zurück und Sparks an der Antenna schleudert Funken. Mit der Leertaste trifft man den Roboter mit 1 Schaden, ein Klick verursacht 2 Schaden (Trainer.cs, bereits vorbereitet). Im Moment informiert Health nur den Kopf.

  • Definiere in IHitReaction.cs ein Interface IHitReaction mit einer Methode, void React(int damage).
  • Lass Flash, Recoil und Sparks das Interface implementieren: Die Methode jedes Scripts wird zu React(int damage). Flash verhält sich wie zuvor. Recoil stößt den Roboter pro Schadenspunkt um 0.5 Einheiten zurück (+z), und Sparks schleudert pro Schadenspunkt einen Funken.
  • Rufe in Healths TakeDamage nach dem Verringern von hp für jedes IHitReaction auf dem Robot und seinen untergeordneten Objekten React(amount) auf. Finde sie mit einem Aufruf von GetComponentsInChildren und protokolliere, wie viele reagiert haben, als Reactions: 3.

Drücke Play, triff den Roboter mit der Leertaste und mit einem Klick und drücke dann Check.

Probier es selbst

using UnityEngine;

public class Health : MonoBehaviour
{
    public int hp = 10;

    public void TakeDamage(int amount)
    {
        hp -= amount;
        GetComponentInChildren<Flash>().Show();
    }
}
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Spielarchitektur in Unity