Menu
CoddyTech

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.

challenge icon

Aufgabe

Mittel

Schreibe einen generischen Helfer für die Kisten und Lampen des Schockturms.

  1. Schreibe in Helpers.cs die statische Klasse Helpers mit der öffentlichen Methode InRange<T>(IEnumerable<T> items, Vector3 center, float range) für Komponenten: eine List<T> der Elemente, die höchstens range entfernt sind.
  2. Gib in Pulse bei Druck auf die Leertaste jedem Rigidbody im Bereich einen Aufwärtsimpuls von lift.
  3. 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

Übe selbstständig: Unity-Playground