Menu
CoddyTech

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;
}
challenge icon

Görev

Orta

Mor 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.cs dosyasında, herhangi bir MonoBehaviour türündeki T için bir MonoBehaviour olan public 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 static Instance ve bir protected 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.
  • Wallet ve MusicPlayer bu sınıftan türesin ve kendi Instance alanları kaldırılsın.
  • MusicPlayer, Now playing: Adventure kaydı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
quiz iconKendini test et

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