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.
Aufgabe
MittelGib der Eule zwei Erweiterungsmethoden.
- Füge in
FlatExtensionsdie öffentliche statische MethodeFlatDistance(this Vector3 a, Vector3 b)hinzu: die Entfernung ohne die Höhe,5von (0, 5, 0) nach (3, 0, 4). - Ebenso dreht
FaceFlat(this Transform t, Vector3 target)tnur um die y-Achse. - Richte in
Owldie Eule mit FaceFlat auf den Spieler aus;eyessind aktiviert, wenn FlatDistance kleiner alssightist.
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
1Komponenten statt Hierarchien
Kleine KomponentenEin Basis-GegnerskriptAbstrakte KomponentenZusammenwirkende KomponentenRückblick: Modulares GeschützRückblick: Zwillingskanone4Serialisierte Daten
Serialisierbare KlassenListen im InspectorEnums im InspectorRückblick: Loot-TabelleRückblick: Beute auswürfeln2Schnittstellen in Unity
IDamageableSchnittstellen und TryGetComponentGetComponentsZusammenfassung: InteraktionstasteZusammenfassung: Nächstes in Reichweite5ScriptableObjects
Daten-AssetsWaffenwerteGemeinsame EinstellungenDen Wind speichernWellen als DatenRückblick: Item-DatenbankRückblick: Im Shop einkaufen8Wiederverwendbarer Code
ErweiterungsmethodenEin generisches SingletonGenerische HilfsmethodenRückblick: FindNearestÜbe selbstständig: Unity-Playground