Menu
CoddyTech

Singleton Generik

Termasuk bagian Arsitektur Game di Unity dalam perjalanan Unity di Coddy. Pelajaran 43 dari 64.

Singleton bagian 3 terdiri dari lima baris yang diulang setiap manager: Instance statis, Awake yang menetapkannya, dan pemeriksaan duplikat. Kelas dasar generik menulisnya sekali. Setiap manager mewarisi kelas itu dan menyebut dirinya sebagai tipe:

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); }
}
// di skrip apa pun
ScoreManager.Instance.Add(10);
SoundManager.Instance.Play("coin");

Anggota statis dari kelas generik berlaku untuk setiap tipe yang dibuat darinya: Singleton<ScoreManager> dan Singleton<SoundManager> adalah dua tipe yang masing-masing memiliki Instance, jadi kedua manager tidak pernah berbagi Instance. ScoreManager.Instance sudah bertipe ScoreManager, dan itulah kegunaan T. Di dalam kelas dasar, this hanya diketahui sebagai Singleton<T>, jadi this as T meneruskannya sebagai manager yang sebenarnya.

Kelas dasar ini bersifat abstrak: Unity hanya menempatkan manager pada objek. Manager yang memerlukan Awake sendiri tidak boleh menulis void Awake() biasa. Itu menyembunyikan method kelas dasar (compiler akan memberikan peringatan), Unity hanya memanggil method milik manager, dan Instance tidak pernah ditetapkan. Gunakan override dan panggil kelas dasar terlebih dahulu:

protected override void Awake()
{
    base.Awake();
    score = 0;
}
challenge icon

Tantangan

Sedang

Beri kedua manager basis yang bertahan saat scene dimuat.

  1. Di PersistentSingleton, tulis protected virtual void Awake(): yang pertama menjadi Instance dan tetap ada (DontDestroyOnLoad); yang muncul belakangan menghancurkan dirinya sendiri.
  2. Wallet dan MusicPlayer mewarisinya; hapus Instance mereka dan Awake milik Wallet.
  3. MusicPlayer meng-override Awake: base.Awake(), lalu, jika itu adalah Instance, mencatat Now playing: Adventure.

Tekan tombol “Main”, kunjungi hutan lalu kembali: 1 koin. Kemudian tekan tombol “Periksa”.

Coba sendiri

using UnityEngine;

public abstract class PersistentSingleton<T> : MonoBehaviour where T : MonoBehaviour
{
    public static T Instance { get; private set; }

    // Awake: pertahankan yang pertama saat scene dimuat, hancurkan yang muncul kemudian
}

Semua pelajaran di Arsitektur Game di Unity

Latihan sendiri: Playground Unity