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.
Wyzwanie
ŚredniSowa 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.csnapisz klasę statycznąFlatExtensions. FlatDistancerozszerza Vector3:a.FlatDistance(b)zwraca odległość odadobpo ziemi, pomijając różnicę wysokości. Od (0, 5, 0) do (3, 0, 4) wynosi ona 5.FaceFlatrozszerza Transform:t.FaceFlat(target)obracatw 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.cssowa w każdej klatce obraca się w stronę gracza za pomocą FaceFlat, a jejeyessą 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 tuVector3.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
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
1Komponenty, nie hierarchie
Małe komponentyPodstawowy skrypt przeciwnikaKomponenty abstrakcyjneWspółpracujące komponentyPodsumowanie: modułowa wieżyczka4Dane serializowane
Klasy serializowalneListy w InspectorzeWyliczenia w InspectorzePodsumowanie: tabela łupów10Projekt: Arena przetrwania
BohaterTypy wrogów2Interfejsy w Unity
IDamageableInterfejsy i TryGetComponentGetComponentsPodsumowanie: klawisz interakcji5ScriptableObjects
Zasoby danychStatystyki broniWspółdzielone ustawieniaFale jako danePowtórka: baza danych przedmiotów8Kod wielokrotnego użytku
Metody rozszerzająceGeneryczny singletonGeneryczne metody pomocniczePodsumowanie: FindNearest