Generic Singleton
Coddy'nin Unity Journey'sinin Unity'de Oyun Mimarisi bölümünün bir parçası. Ders 43 / 64.
3. bölümdeki singleton, her yöneticinin tekrarladığı beş satırdan oluşur: statik bir Instance, onu ayarlayan bir Awake ve yinelenen örnek denetimi. Genel 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");Genel bir sınıfın statik üyesi, o sınıftan oluşturulan her türe aittir: Singleton<ScoreManager> ve Singleton<SoundManager>, her birinin ayrı bir Instance üyesi olduğu iki türdür; bu nedenle yöneticiler hiçbir zaman aynı Instance üyesini paylaşmaz. ScoreManager.Instance zaten ScoreManager türündedir; T de bu işe yarar. 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 soyuttur: Unity, nesnelere yalnızca yöneticileri ekler. Kendi Awake metoduna ihtiyaç duyan bir yönetici, düz bir void Awake() yazmamalıdır. Bu, temel sınıfın metodunu gizler (derleyici bu konuda uyarı verir); Unity yalnızca yöneticinin metodunu çağırır ve Instance hiçbir zaman ayarlanmaz. Metodu geçersiz kılın ve önce temel sınıfın metodunu çağırın:
protected override void Awake()
{
base.Awake();
score = 0;
}Görev
OrtaHer iki yöneticiye de sahne yüklemelerinden sonra varlığını sürdüren bir temel sağlayın.
PersistentSingletoniçindeprotected virtual void Awake()yazın: ilkiInstanceolur ve varlığını sürdürür (DontDestroyOnLoad); daha sonra oluşturulan bir örnek kendini yok eder.WalletveMusicPlayerbu sınıftan türesin; bunlarınInstancealanlarını ve Wallet'ın Awake metodunu silin.MusicPlayer, Awake metodunu geçersiz kılar: öncebase.Awake()çağırır, ardından Instance kendisiyseNow playing: Adventuremesajını günlüğe yazar.
“Oyna” düğmesine basın, ormanı ziyaret edip geri dönün: 1 coin. Ardından “Kontrol et” düğmesine basın.
Kendin dene
using UnityEngine;
public abstract class PersistentSingleton<T> : MonoBehaviour where T : MonoBehaviour
{
public static T Instance { get; private set; }
// Awake: sahne yüklemeleri boyunca ilk örneği koru, sonradan oluşturulanları yok et
}
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