Menu
CoddyTech

Erweiterungsmethoden

Teil des Abschnitts Spielarchitektur in Unity der Unity-Journey von Coddy. Lektion 33 von 50.

Vector3 und Transform gehören zu Unity, daher kannst du ihnen keine Methode hinzufügen. Eine Erweiterungsmethode ist eine statische Methode, die C# dich so aufrufen lässt, als gehörte sie zu 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 jedem 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, sodass transform.position.WithY(0.5f) zu UnityExtensions.WithY(transform.position, 0.5f) kompiliert wird. Vector3 ist eine Struktur, 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; der Name ist beliebig, und sie wird niemals einem Objekt hinzugefügt. Methoden, die ein MonoBehaviour erbt, wie Destroy, benötigen hier ihre Klasse: Object.Destroy. Kinder innerhalb der foreach-Schleife zu zerstören ist sicher, weil Unity sie erst am Ende des Frames entfernt.

challenge icon

Aufgabe

Mittel
  • Schreibe in FlatExtensions.cs eine statische Klasse FlatExtensions.
  • FlatDistance erweitert Vector3: a.FlatDistance(b) gibt die Entfernung von a nach b über den Boden zurück, wobei der Höhenunterschied nicht berücksichtigt wird. Von (0, 5, 0) nach (3, 0, 4) beträgt sie 5.
  • FaceFlat erweitert Transform: t.FaceFlat(target) dreht t so, dass es sich nur um die y-Achse auf das Ziel ausrichtet und aufrecht bleibt, egal wie hoch oder niedrig das Ziel ist.
  • In Owl.cs richtet sich die Eule in jedem Frame mit FaceFlat auf den Player aus. Ihre eyes sind eingeschaltet, solange der Player über den Boden näher als sight (3) ist, und andernfalls ausgeschaltet. Die Eule sitzt hoch oben auf ihrem Pfosten, daher ist dies nicht Vector3.Distance.

Drücke Play, gehe um den Pfosten herum und unter der Eule hindurch, und drücke dann Check.

Probier es selbst

using UnityEngine;

// FlatExtensions: FlatDistance und FaceFlat
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