Menu
CoddyTech

Metody rozszerzające

Część sekcji Architektura gier w Unity ścieżki Unity w Coddy. Lekcja 33 z 50.

Vector3 i Transform należą do Unity, więc nie możesz dodać do nich metody. Metoda rozszerzająca to metoda statyczna, którą C# pozwala wywoływać tak, jakby należała do danego typu. Te dwie metody pozwalają zaoszczędzić linie kodu, które pojawiają się w każdym projekcie:

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);
        }
    }
}
// w dowolnym skrypcie
transform.position = transform.position.WithY(0.5f);
inventoryPanel.DestroyChildren();

Metodę rozszerzającą definiują trzy elementy: klasa statyczna, która nie jest zagnieżdżona ani generyczna, metoda statyczna oraz this przed pierwszym parametrem. Ten parametr jest wartością po lewej stronie kropki, więc transform.position.WithY(0.5f) kompiluje się do UnityExtensions.WithY(transform.position, 0.5f). Vector3 jest strukturą, więc v jest kopią: WithY nie może zmienić wektora wywołującego i zamiast tego zwraca nowy. Właśnie w ten sposób można obejść problem z transform.position.y = 0.5f;, który się nie kompiluje.

Klasa statyczna nie jest MonoBehaviour. Znajduje się we własnym pliku .cs, który może mieć dowolną nazwę, i nigdy nie jest dodawana do obiektu. Metody dziedziczone przez MonoBehaviour, takie jak Destroy, wymagają tutaj podania swojej klasy: Object.Destroy. Niszczenie elementów potomnych wewnątrz foreach jest bezpieczne, ponieważ Unity usuwa je dopiero na końcu klatki.

challenge icon

Wyzwanie

Średni

Sowa siedząca wysoko na słupku obserwuje podwórze. Strzałki poruszają graczem (gotowe). Dodaj do projektu dwie metody rozszerzające i użyj ich w skrypcie sowy:

  • W pliku FlatExtensions.cs napisz klasę statyczną FlatExtensions.
  • FlatDistance rozszerza Vector3: a.FlatDistance(b) zwraca odległość od a do b po ziemi, pomijając różnicę wysokości. Od (0, 5, 0) do (3, 0, 4) wynosi ona 5.
  • FaceFlat rozszerza Transform: t.FaceFlat(target) obraca t w stronę celu tylko wokół osi y, dzięki czemu pozostaje w pozycji pionowej, niezależnie od tego, jak wysoko lub nisko znajduje się cel.
  • W pliku Owl.cs sowa w każdej klatce obraca się w stronę gracza za pomocą FaceFlat, a jej eyes są włączone, gdy gracz znajduje się bliżej niż sight (3) po ziemi, a w przeciwnym razie wyłączone. Sowa siedzi wysoko na słupku, więc nie używaj tu Vector3.Distance.

Naciśnij Play, obejdź słupek i przejdź pod sową, a następnie naciśnij Check.

Spróbuj swoich sił

using UnityEngine;

// FlatExtensions: FlatDistance i FaceFlat
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Architektura gier w Unity