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.
Aufgabe
EinfachDer 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
IHitReactionmit 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
TakeDamagenach dem Verringern von hp für jedes IHitReaction auf dem Robot und seinen untergeordneten ObjektenReact(amount)auf. Finde sie mit einem Aufruf von GetComponentsInChildren und protokolliere, wie viele reagiert haben, alsReactions: 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();
}
}
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
1Komponenten statt Hierarchien
Kleine KomponentenEin Basisskript für GegnerAbstrakte KomponentenKomponenten im ZusammenspielRückblick: Modularer Geschützturm4Serialisierte Daten
Serialisierbare KlassenListen im InspectorEnums im InspectorRückblick: Loot-Tabelle7Zustandsautomaten
Zustände als KlassenEin ZustandsautomatÜbergängeGegner-KIWiederholung: Türzustände10Projekt: Arena-Überlebenskampf
Der HeldGegnertypen2Interfaces in Unity
IDamageableInterfaces und TryGetComponentGetComponentsRückblick: Interaktionstaste5ScriptableObjects
Daten-AssetsWaffenwerteGemeinsame EinstellungenWellen als DatenRückblick: Item-Datenbank8Wiederverwendbarer Code
ErweiterungsmethodenEin generisches SingletonGenerische HilfsmethodenRückblick: FindNearest