Generische Hilfsmethoden
Teil des Abschnitts Spielarchitektur in Unity der Unity-Journey von Coddy. Lektion 35 von 50.
Einige Hilfsmethoden sind für jeden Typ gleich: eine Komponente abrufen oder hinzufügen, einen zufälligen Eintrag aus einem Array auswählen. Eine generische Methode schreibt sie einmal, wobei der Typ als Parameter T dient, den jeder Aufruf festlegt:
public static class Helpers
{
public static T GetOrAdd<T>(this GameObject go) where T : Component
{
if (!go.TryGetComponent(out T found)) found = go.AddComponent<T>();
return found;
}
public static T RandomItem<T>(T[] items)
{
return items[Random.Range(0, items.Length)];
}
}Rigidbody body = crate.GetOrAdd<Rigidbody>();
Color paint = Helpers.RandomItem(colors);
GameObject enemy = Helpers.RandomItem(enemyPrefabs);where T : Component ist eine Zusicherung über T und legt fest, was die Methode damit tun darf. AddComponent akzeptiert nur Komponenten. Ohne die Einschränkung weist der Compiler daher go.AddComponent<T>() zurück; mit ihr funktioniert jede Komponente, egal ob Unitys Rigidbody oder deine eigenen Skripte. Die Einschränkung stellt außerdem alle Member von Component für ein T bereit, etwa .transform und .gameObject. Hat eine Kiste bereits einen Rigidbody, wird dieser zurückgegeben und nichts hinzugefügt.
RandomItem hat keine Einschränkung, weil es T nie verwendet: Die Methode funktioniert gleichermaßen mit Farben, Zeichenfolgen und Prefabs. Beim Aufruf gibst du den Typ nur selten an: Aus colors, einem Color[], ermittelt der Compiler, dass T Color ist. Eine Methode, die IEnumerable<T> statt T[] akzeptiert, nimmt sowohl Arrays als auch Lists entgegen, einschließlich der Arrays, die FindObjectsByType<T> zurückgibt.
Aufgabe
MittelEin Schockturm steht im Hof. Wenn die Leertaste gedrückt wird, sendet er einen Impuls aus: Kisten im Umkreis von 4 werden hochgeschleudert, und Lampen im Umkreis von 4 leuchten auf. Lamp.cs ist bereit, mit TurnOn(). Schreibe einen Helfer, der beides findet:
- Schreibe in
Helpers.cseine statische KlasseHelpersmit einer generischen MethodeInRange<T>(IEnumerable<T> items, Vector3 center, float range)für beliebige Komponententypen. Sie gibt eineList<T>der Elemente zurück, deren Position höchstensrangevoncenterentfernt ist. - Wenn in
Pulse.csdie Leertaste gedrückt wird: Jeder Rigidbody in der Szene, der höchstensrangevom Turm entfernt ist, erhält einen Aufwärtsimpuls vonlift, und jede Lamp im Umkreis vonrangewird eingeschaltet. Verwende InRange für beides und übergib die Arrays, dieFindObjectsByTypedir liefert.
Drücke Play, drücke die Leertaste und dann Check.
Probier es selbst
using System.Collections.Generic;
using UnityEngine;
// Helpers.InRange<T>: die Elemente innerhalb der Reichweite eines Punkts
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