Menu
CoddyTech

Metody rozszerzające

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

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 rozszerzanego typu. Te dwie metody pozwalają zaoszczędzić kilka linijek, 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. Dzięki temu można też 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 dodaje się jej do obiektu. Metody dziedziczone przez MonoBehaviour, takie jak Destroy, wymagają tutaj podania klasy: Object.Destroy. Usuwanie dzieci wewnątrz pętli foreach jest bezpieczne, ponieważ Unity usuwa je dopiero na końcu klatki.

challenge icon

Wyzwanie

Średni

Dodaj sowie dwie metody rozszerzające.

  1. W FlatExtensions dodaj publiczną metodę statyczną FlatDistance(this Vector3 a, Vector3 b): odległość bez uwzględniania wysokości, 5 od (0, 5, 0) do (3, 0, 4).
  2. Podobnie FaceFlat(this Transform t, Vector3 target) obraca t tylko wokół osi y.
  3. W Owl skieruj sowę w stronę gracza za pomocą FaceFlat; eyes są włączone, gdy FlatDistance jest mniejsze niż sight.

Naciśnij „Graj” i przejdź pod sową: jej oczy zaświecą. Następnie naciśnij „Sprawdź”.

Spróbuj swoich sił

using UnityEngine;

public static class FlatExtensions
{
    // Tutaj umieść FlatDistance (Vector3) i FaceFlat (Transform)
}

Wszystkie lekcje w sekcji Architektura gier w Unity

Poćwicz samodzielnie: Edytor online Unity