Generic Singleton
Coddy'nin Unity Journey'sinin Unity'de Oyun Mimarisi bölümünün bir parçası. Ders 34 / 50.
3. bölümdeki singleton, her yöneticinin tekrarladığı beş satırdan oluşur: statik bir Instance, bunu ayarlayan bir Awake ve yinelenen örnek kontrolü. Generic bir temel sınıf bunları bir kez yazar. Her yönetici, tür olarak kendi adını vererek bu sınıftan türetilir:
public abstract class Singleton<T> : MonoBehaviour where T : MonoBehaviour
{
public static T Instance { get; private set; }
protected virtual void Awake()
{
if (Instance != null && Instance != this)
{
Destroy(gameObject);
return;
}
Instance = this as T;
}
}
public class ScoreManager : Singleton<ScoreManager>
{
public int score;
public void Add(int points) { score += points; }
}
public class SoundManager : Singleton<SoundManager>
{
public void Play(string clip) { Debug.Log("Playing " + clip); }
}// herhangi bir betikte
ScoreManager.Instance.Add(10);
SoundManager.Instance.Play("coin");Generic bir sınıfın statik üyesi, ondan oluşturulan her türe aittir: Singleton<ScoreManager> ve Singleton<SoundManager>, her birinin kendine ait bir Instance'ı olan iki ayrı türdür; bu nedenle yöneticiler aynı örneği asla paylaşmaz. ScoreManager.Instance zaten ScoreManager türündedir; T bunun içindir. Temel sınıfın içinde this yalnızca bir Singleton<T> olarak bilinir; bu yüzden this as T onu gerçekte olduğu yönetici türünde aktarır.
Temel sınıf abstract'tır: Unity, nesnelere yalnızca yöneticileri ekler. Kendi Awake yöntemine ihtiyaç duyan bir yönetici, yalın bir void Awake() yazmamalıdır. Bu, temel sınıfın yöntemini gizler (derleyici bu konuda uyarı verir), Unity yalnızca yöneticinin yöntemini çağırır ve Instance hiçbir zaman ayarlanmaz. Yöntemi override edin ve önce temel sınıf yöntemini çağırın:
protected override void Awake()
{
base.Awake();
score = 0;
}Görev
OrtaMor portallarla birbirine bağlanan bir kasaba ve bir orman. Her sahnenin kendine ait bir Wallet ve MusicPlayer nesnesi var, bu yüzden ikisinden biri kendi başına çalıyor ve madeni paralar Wallet.Instance.Add(1) çağrısını yapıyor. Bugün her yönetici 3. bölümün singleton'ı, bu yüzden her yüklemede cüzdan boş bir cüzdanla değiştiriliyor. Her iki yöneticiye de sahne yüklemeleri boyunca varlıklarını koruyan genel bir temel sınıf ver:
PersistentSingleton.csdosyasında, herhangi bir MonoBehaviour türündeki T için bir MonoBehaviour olanpublic abstract class PersistentSingleton<T>sınıfını yaz. Bu sınıf, yalnızca sınıfın ayarlayabildiği T türünde bir public staticInstanceve birprotected virtual void Awake()içersin.- Awake, kendi türündeki ilk nesneyi korur: o nesne Instance olur ve sahne yüklemelerinden sağ çıkar. Sonradan gelen her nesne kendi nesnesini yok eder ve hiçbir şeyi değiştirmez.
WalletveMusicPlayerbu sınıftan türesin ve kendiInstancealanları kaldırılsın.MusicPlayer,Now playing: Adventurekaydını yazan kendine ait bir Awake metodunu korusun. Bu metot temel sınıfın Awake metodundan sonra ve yalnızca kalan nesne için çalışmalı; böylece müzik oyun başına bir kez başlar.
Oklar Player'ı yürütür. Oyna'ya bas, madeni parayı al, ormana gidip geri dön, ardından Kontrol et'e bas.
Kendin dene
using UnityEngine;
// PersistentSingleton<T>: sahne yüklemeleri boyunca varlığını sürdüren tek bir örnek
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