Generische Hilfsmethoden
Teil des Abschnitts Spielarchitektur in Unity der Unity-Journey von Coddy. Lektion 44 von 64.
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 definiert sie einmal und verwendet den Typ als Parameter T, 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, die festlegt, was die Methode damit tun darf. AddComponent akzeptiert nur Komponenten. Ohne diese Einschränkung weist der Compiler daher go.AddComponent<T>() zurück; mit ihr funktioniert es mit jeder Komponente, etwa Unitys Rigidbody oder deinen eigenen Skripten. Durch die Einschränkung stehen dir für ein T außerdem alle Member von Component zur Verfügung, zum Beispiel .transform und .gameObject. Wenn eine Kiste bereits einen Rigidbody hat, wird dieser zurückgegeben und nichts hinzugefügt.
RandomItem hat keine Einschränkung, weil die Methode T nie verwendet: Sie funktioniert gleichermaßen mit Farben, Zeichenfolgen und Prefabs. Den Typ musst du beim Aufruf selten angeben: Anhand von colors, einem Color[], ermittelt der Compiler, dass T Color ist. Eine Methode, die IEnumerable<T> statt T[] entgegennimmt, akzeptiert sowohl Arrays als auch Lists, einschließlich der Arrays, die FindObjectsByType<T> zurückgibt.
Aufgabe
MittelSchreibe einen generischen Helfer für die Kisten und Lampen des Schockturms.
- Schreibe in
Helpers.csdie statische KlasseHelpersmit der öffentlichen MethodeInRange<T>(IEnumerable<T> items, Vector3 center, float range)für Komponenten: eineList<T>der Elemente, die höchstensrangeentfernt sind. - Gib in
Pulsebei Druck auf die Leertaste jedem Rigidbody im Bereich einen Aufwärtsimpuls vonlift. - Rufe dann bei jeder Lampe im Bereich
TurnOn()auf.
Drücke „Spielen“ und drücke die Leertaste: Die nahe Kiste springt. Drücke dann „Prüfen“.
Probier es selbst
using System.Collections.Generic;
using UnityEngine;
// Helpers.InRange<T>: die Elemente in Reichweite eines Punkts
Alle Lektionen in Spielarchitektur in Unity
1Komponenten statt Hierarchien
Kleine KomponentenEin Basis-GegnerskriptAbstrakte KomponentenZusammenwirkende KomponentenRückblick: Modulares GeschützRückblick: Zwillingskanone4Serialisierte Daten
Serialisierbare KlassenListen im InspectorEnums im InspectorRückblick: Loot-TabelleRückblick: Beute auswürfeln2Schnittstellen in Unity
IDamageableSchnittstellen und TryGetComponentGetComponentsZusammenfassung: InteraktionstasteZusammenfassung: Nächstes in Reichweite5ScriptableObjects
Daten-AssetsWaffenwerteGemeinsame EinstellungenDen Wind speichernWellen als DatenRückblick: Item-DatenbankRückblick: Im Shop einkaufen8Wiederverwendbarer Code
ErweiterungsmethodenEin generisches SingletonGenerische HilfsmethodenRückblick: FindNearestÜbe selbstständig: Unity-Playground