Menu
CoddyTech

Erweiterungsmethoden

Teil des Abschnitts Spielarchitektur in Unity der Unity-Journey von Coddy. Lektion 42 von 64.

Vector3 und Transform gehören zu Unity, daher kannst du ihnen keine Methode hinzufügen. Eine Erweiterungsmethode ist eine statische Methode, die du in C# so aufrufen kannst, als gehörte sie ihnen. Diese beiden ersparen dir Zeilen, die in jedem Projekt vorkommen:

public static class UnityExtensions
{
    public static Vector3 WithY(this Vector3 v, float y)
    {
        return new Vector3(v.x, y, v.z);
    }

    public static void DestroyChildren(this Transform parent)
    {
        foreach (Transform child in parent)
        {
            Object.Destroy(child.gameObject);
        }
    }
}
// in einem beliebigen Skript
transform.position = transform.position.WithY(0.5f);
inventoryPanel.DestroyChildren();

Drei Dinge machen eine Erweiterungsmethode aus: eine statische Klasse, die weder verschachtelt noch generisch ist, eine statische Methode und this vor dem ersten Parameter. Dieser Parameter ist der Wert links vom Punkt, daher wird transform.position.WithY(0.5f) zu UnityExtensions.WithY(transform.position, 0.5f) kompiliert. Vector3 ist ein Struct, daher ist v eine Kopie: WithY kann den Vektor des Aufrufers nicht ändern und gibt stattdessen einen neuen zurück. So umgeht man auch transform.position.y = 0.5f;, was nicht kompiliert.

Die statische Klasse ist kein MonoBehaviour. Sie befindet sich in einer eigenen .cs-Datei, deren Name beliebig sein kann, und wird niemals einem Objekt hinzugefügt. Methoden, die ein MonoBehaviour erbt, wie Destroy, benötigen hier ihre Klasse: Object.Destroy. Es ist sicher, die Kinder innerhalb der foreach-Schleife zu zerstören, da Unity sie erst am Ende des Frames entfernt.

challenge icon

Aufgabe

Mittel

Gib der Eule zwei Erweiterungsmethoden.

  1. Füge in FlatExtensions die öffentliche statische Methode FlatDistance(this Vector3 a, Vector3 b) hinzu: die Entfernung ohne die Höhe, 5 von (0, 5, 0) nach (3, 0, 4).
  2. Ebenso dreht FaceFlat(this Transform t, Vector3 target) t nur um die y-Achse.
  3. Richte in Owl die Eule mit FaceFlat auf den Spieler aus; eyes sind aktiviert, wenn FlatDistance kleiner als sight ist.

Drücke „Spielen“ und gehe unter der Eule hindurch: Ihre Augen leuchten. Drücke dann „Prüfen“.

Probier es selbst

using UnityEngine;

public static class FlatExtensions
{
    // FlatDistance (Vector3) und FaceFlat (Transform) gehören hierher
}

Alle Lektionen in Spielarchitektur in Unity

Übe selbstständig: Unity-Playground