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.
Aufgabe
Mittel- Schreibe in
FlatExtensions.cseine statische KlasseFlatExtensions. FlatDistanceerweitert Vector3:a.FlatDistance(b)gibt die Entfernung vonanachbü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.FaceFlaterweitert Transform:t.FaceFlat(target)drehttso, 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.csrichtet sich die Eule in jedem Frame mit FaceFlat auf den Player aus. Ihreeyessind eingeschaltet, solange der Player über den Boden näher alssight(3) ist, und andernfalls ausgeschaltet. Die Eule sitzt hoch oben auf ihrem Pfosten, daher ist dies nichtVector3.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
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
1Komponenten statt Hierarchien
Kleine KomponentenEin Basisskript für GegnerAbstrakte KomponentenKomponenten im ZusammenspielRückblick: Modularer Geschützturm4Serialisierte Daten
Serialisierbare KlassenListen im InspectorEnums im InspectorRückblick: Loot-Tabelle7Zustandsautomaten
Zustände als KlassenEin ZustandsautomatÜbergängeGegner-KIWiederholung: Türzustände10Projekt: Arena-Überlebenskampf
Der HeldGegnertypen2Interfaces in Unity
IDamageableInterfaces und TryGetComponentGetComponentsRückblick: Interaktionstaste5ScriptableObjects
Daten-AssetsWaffenwerteGemeinsame EinstellungenWellen als DatenRückblick: Item-Datenbank8Wiederverwendbarer Code
ErweiterungsmethodenEin generisches SingletonGenerische HilfsmethodenRückblick: FindNearest