Genişletme Metotları
Coddy'nin Unity Journey'sinin Unity'de Oyun Mimarisi bölümünün bir parçası. Ders 33 / 50.
Vector3 ve Transform, Unity'ye aittir; bu nedenle bunlara bir yöntem ekleyemezsin. Genişletme yöntemi, C#'ın sanki onlara aitmiş gibi çağırmana izin verdiği statik bir yöntemdir. Bu ikisi, her projede karşına çıkan satırları azaltır:
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);
}
}
}// herhangi bir betikte
transform.position = transform.position.WithY(0.5f);
inventoryPanel.DestroyChildren();Bir yöntemin genişletme yöntemi olması için üç şey gerekir: iç içe olmayan ve generic olmayan bir statik sınıf, statik bir yöntem ve ilk parametrenin önünde this. Bu parametre noktanın solundaki değerdir; yani transform.position.WithY(0.5f), UnityExtensions.WithY(transform.position, 0.5f) olarak derlenir. Vector3 bir struct olduğundan, v bir kopyadır: WithY, çağıranın vektörünü değiştiremez ve bunun yerine yeni bir vektör döndürür. transform.position.y = 0.5f; ifadesinin derlenmemesini aşmanın yolu da budur.
Statik sınıf bir MonoBehaviour değildir. Kendine ait bir .cs dosyasında bulunur; dosyanın adı herhangi bir şey olabilir ve hiçbir zaman bir nesneye eklenmez. MonoBehaviour'ın miras aldığı Destroy gibi yöntemler için burada sınıfı belirtmen gerekir: Object.Destroy. foreach içinde alt öğeleri yok etmek güvenlidir, çünkü Unity bunları yalnızca karenin sonunda kaldırır.
Görev
OrtaUzun bir direğin üzerindeki baykuş bahçeyi gözetliyor. Ok tuşları Player'ı hareket ettiriyor (hazır). Projeye iki genişletme metodu ekleyip bunları baykuşta kullan:
FlatExtensions.csiçindeFlatExtensionsadlı bir statik sınıf yaz.FlatDistance, Vector3'ü genişletir:a.FlatDistance(b), yükseklik farkını hesaba katmadan, zemindekiailebarasındaki mesafeyi döndürür. (0, 5, 0) ile (3, 0, 4) arasındaki mesafe 5'tir.FaceFlat, Transform'u genişletir:t.FaceFlat(target),t'yi yalnızca y ekseni etrafında hedefe bakacak şekilde döndürür; böylece hedef ne kadar yüksekte ya da alçakta olursa olsun dik durur.Owl.csiçinde baykuş her karede FaceFlat ile oyuncuya döner; oyuncu zemindesight(3) mesafesinden daha yakındaykeneyesaçık, aksi takdirde kapalı olur. Baykuş direğinin tepesinde oturduğundan, buradaVector3.Distancekullanılamaz.
Oynat'a bas, direğin etrafında ve baykuşun altından yürü, ardından Kontrol Et'e bas.
Kendin dene
using UnityEngine;
// FlatExtensions: FlatDistance ve FaceFlat
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Unity'de Oyun Mimarisi bölümündeki tüm dersler
1Hiyerarşiler Değil, Bileşenler
Küçük BileşenlerTemel Bir Düşman BetiğiSoyut BileşenlerBirlikte Çalışan BileşenlerÖzet: Modüler Taret4Serileştirilmiş Veriler
Serileştirilebilir SınıflarInspector'da ListelerInspector'da Enum'larÖzet: Ganimet Tablosu7Durum Makineleri
Sınıflar Olarak DurumlarBir Durum MakinesiGeçişlerDüşmanların Yapay ZekâsıTekrar: Kapı Durumları10Proje: Arena Hayatta Kalma
KahramanDüşman Türleri5ScriptableObjects
Veri VarlıklarıSilah İstatistikleriPaylaşılan AyarlarVeri Olarak DalgalarTekrar: Eşya Veritabanı8Yeniden Kullanılabilir Kod
Genişletme MetotlarıGeneric SingletonGeneric YardımcılarTekrar: FindNearest