Menu
CoddyTech

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

Görev

Orta

Her iki yöneticiye de sahne yüklemelerinden sonra varlığını sürdüren bir temel sağlayın.

  1. PersistentSingleton içinde protected virtual void Awake() yazın: ilki Instance olur ve varlığını sürdürür (DontDestroyOnLoad); daha sonra oluşturulan bir örnek kendini yok eder.
  2. Wallet ve MusicPlayer bu sınıftan türesin; bunların Instance alanlarını ve Wallet'ın Awake metodunu silin.
  3. MusicPlayer, Awake metodunu geçersiz kılar: önce base.Awake() çağırır, ardından Instance kendisiyse Now playing: Adventure mesajı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

Kendi başına pratik yap: Unity playground