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.
Wyzwanie
ŚredniDodaj sowie dwie metody rozszerzające.
- W
FlatExtensionsdodaj publiczną metodę statycznąFlatDistance(this Vector3 a, Vector3 b): odległość bez uwzględniania wysokości,5od (0, 5, 0) do (3, 0, 4). - Podobnie
FaceFlat(this Transform t, Vector3 target)obracattylko wokół osi y. - W
Owlskieruj sowę w stronę gracza za pomocą FaceFlat;eyessą 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
1Komponenty, nie hierarchie
Małe komponentyBazowy skrypt przeciwnikaKomponenty abstrakcyjneWspółpracujące komponentyPowtórka: modułowa wieżyczkaPowtórka: podwójne działo4Dane serializowane
Klasy serializowalneListy w InspectorzeEnumy w InspectorzePodsumowanie: tabela łupówPodsumowanie: losowanie łupów2Interfejsy w Unity
IDamageableInterfejsy i TryGetComponentGetComponentsPowtórka: klawisz interakcjiPowtórka: najbliższy w zasięgu5ScriptableObjects
Zasoby danychStatystyki broniWspółdzielone ustawieniaOcal wiatrFale jako danePowtórka: Baza przedmiotówPowtórka: Kupowanie w sklepie8Kod wielokrotnego użytku
Metody rozszerzająceGeneryczny singletonGeneryczne metody pomocniczePodsumowanie: FindNearestPoćwicz samodzielnie: Edytor online Unity