Generic Yardımcılar
Coddy'nin Unity Journey'sinin Unity'de Oyun Mimarisi bölümünün bir parçası. Ders 44 / 64.
Bazı yardımcılar her tür için aynıdır: bir bileşeni 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 parametresi T olur:
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 garantidir ve yöntemin T ile neler yapabileceğini belirler. AddComponent yalnızca bileşenleri kabul eder; bu nedenle kısıtlama olmadan derleyici go.AddComponent<T>() kullanımını reddeder. Kısıtlamayla birlikte Unity'nin Rigidbody bileşeni veya kendi betiklerin gibi her bileşen kullanılabilir. Kısıtlama ayrıca T üzerinde Component'in tüm üyelerine erişmeni sağlar; örneğin .transform ve .gameObject. Zaten Rigidbody bileşeni olan bir crate, o bileşeni geri alır ve hiçbir şey eklenmez.
RandomItem için kısıtlama gerekmez, çünkü T'ye hiç dokunmaz: renkler, dizeler ve prefab'lar için aynı şekilde çalışır. Çağrı sırasında türü nadiren belirtirsin: colors bir Color[] olduğundan derleyici T'nin Color olduğunu çıkarır. T[] yerine IEnumerable<T> alan bir yöntem hem dizileri hem de List'leri kabul eder; buna FindObjectsByType<T> tarafından döndürülen diziler de dahildir.
Görev
OrtaŞok kulesinin kasaları ve lambaları için genel bir yardımcı yaz.
Helpers.csiçinde, bileşenler içinHelpersstatik sınıfını veInRange<T>(IEnumerable<T> items, Vector3 center, float range)genel metodunu yaz: en fazlarangeuzaklıktaki öğelerden oluşan birList<T>döndürsün.Pulseiçinde, Space tuşuna basıldığında menzil içindeki her Rigidbody'yeliftdeğerinde yukarı yönlü bir darbe uygula.- Ardından menzil içindeki her Lamp için
TurnOn()metodunu çağır.
“Oyna” düğmesine bas ve Space tuşuna bas: yakındaki kasa zıplar. Ardından “Kontrol et” düğmesine bas.
Kendin dene
using System.Collections.Generic;
using UnityEngine;
// Helpers.InRange<T>: bir noktanın menzili içindeki öğeler
Unity'de Oyun Mimarisi bölümündeki tüm dersler
1Kalıtım Değil, Bileşenler
Küçük BileşenlerTemel Düşman Script'iSoyut BileşenlerBirlikte Çalışan BileşenlerTekrar: Modüler TaretTekrar: Çift Namlulu Top4Serileştirilmiş Veriler
Serileştirilebilir SınıflarInspector'da ListelerInspector'da Enum'larTekrar: Ganimet TablosuTekrar: Ganimeti At2Unity'de Arayüzler
IDamageableArayüzler ve TryGetComponentGetComponentsÖzet: Etkileşim TuşuÖzet: Erişim Mesafesindeki En Yakın5ScriptableObjects
Veri VarlıklarıSilah İstatistikleriOrtak AyarlarRüzgârı KaydetVeri Olarak DalgalarTekrar: Eşya VeritabanıTekrar: Dükkândan Satın Al8Yeniden Kullanılabilir Kod
Genişletme MetotlarıGeneric SingletonGeneric YardımcılarTekrar: FindNearestKendi başına pratik yap: Unity playground