Generic Yardımcılar
Coddy'nin Unity Journey'sinin Unity'de Oyun Mimarisi bölümünün bir parçası. Ders 35 / 50.
Bazı yardımcılar her tür için aynıdır: bir bileşen al ya da ekle, bir diziden rastgele bir öğe seç. Genel bir yöntem bunları bir kez yazar; her çağrının doldurduğu türü T parametresi olarak kullanır:
public static class Helpers
{
public static T GetOrAdd<T>(this GameObject go) where T : Component
{
if (!go.TryGetComponent(out T found)) found = go.AddComponent<T>();
return found;
}
public static T RandomItem<T>(T[] items)
{
return items[Random.Range(0, items.Length)];
}
}Rigidbody body = crate.GetOrAdd<Rigidbody>();
Color paint = Helpers.RandomItem(colors);
GameObject enemy = Helpers.RandomItem(enemyPrefabs);where T : Component, T hakkında bir güvencedir ve yöntemin T ile neler yapabileceğine karar verir. AddComponent yalnızca bileşenleri kabul eder; bu nedenle kısıtlama olmadan derleyici go.AddComponent<T>() ifadesini reddeder. Kısıtlamayla birlikte Unity'nin Rigidbody'si veya kendi betikleriniz gibi herhangi bir bileşen kullanılabilir. Kısıtlama, .transform ve .gameObject gibi Component'in tüm üyelerine T üzerinden erişmenizi de sağlar. Zaten bir Rigidbody bileşeni olan crate bu bileşeni geri alır ve hiçbir şey eklenmez.
RandomItem'ın kısıtlaması yoktur, çünkü T'ye hiç dokunmaz: renkler, dizeler ve prefab'lar için aynı şekilde çalışır. Çağrıda türü nadiren yazarsınız: Color[] türündeki colors değişkeninden derleyici, T'nin Color olduğunu çıkarır. T[] yerine IEnumerable<T> alan bir yöntem hem dizileri hem de List'leri, FindObjectsByType<T> yönteminin döndürdüğü diziler de dahil, kabul eder.
Görev
OrtaBahçede bir şok kulesi duruyor. Space tuşuna basıldığında bir darbe gönderiyor: 4 birim yakınındaki kasalar havaya fırlatılıyor ve 4 birim yakınındaki lambalar yanıyor. Lamp.cs hazır, TurnOn() da mevcut. İkisini de bulan bir yardımcı yaz:
Helpers.csiçinde, herhangi bir bileşen türü için genel birInRange<T>(IEnumerable<T> items, Vector3 center, float range)metoduna sahip statik birHelperssınıfı yaz. Bu metot, konumucenternoktasından en fazlarangeuzaklıkta olan öğelerden oluşan birList<T>döndürür.Pulse.csiçinde, Space tuşuna basıldığında: sahnedeki kuleyerangeuzaklıkta bulunan her Rigidbody, yukarı doğruliftşiddetinde bir itki alır verangeuzaklıktaki her Lamp yakılır. Her ikisi için deFindObjectsByTypemetodunun verdiği diziler üzerinde InRange kullan.
Oynat'a bas, Space tuşuna bas, ardından Kontrol Et'e bas.
Kendin dene
using System.Collections.Generic;
using UnityEngine;
// Helpers.InRange<T>: bir noktanın menzili içindeki öğeler
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