Menu
CoddyTech

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.

challenge icon

Aufgabe

Mittel

Ein 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.cs eine statische Klasse Helpers mit einer generischen Methode InRange<T>(IEnumerable<T> items, Vector3 center, float range) für beliebige Komponententypen. Sie gibt eine List<T> der Elemente zurück, deren Position höchstens range von center entfernt ist.
  • Wenn in Pulse.cs die Leertaste gedrückt wird: Jeder Rigidbody in der Szene, der höchstens range vom Turm entfernt ist, erhält einen Aufwärtsimpuls von lift, und jede Lamp im Umkreis von range wird eingeschaltet. Verwende InRange für beides und übergib die Arrays, die FindObjectsByType dir 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
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