Singleton Generik
Termasuk bagian Arsitektur Game di Unity dalam perjalanan Unity di Coddy. Pelajaran 34 dari 50.
Singleton di bagian 3 terdiri dari lima baris yang diulang setiap manager: Instance static, Awake yang menetapkannya, dan pemeriksaan duplikat. Generic base class menuliskannya sekali. Setiap manager mewarisi dari class tersebut 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 script mana pun
ScoreManager.Instance.Add(10);
SoundManager.Instance.Play("coin");Anggota static dari generic class dimiliki oleh 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, itulah kegunaan T. Di dalam base class, this hanya diketahui sebagai Singleton<T>, jadi this as T menyerahkannya sebagai manager yang sebenarnya.
Base class ini abstract: Unity hanya menempatkan manager pada object. Manager yang memerlukan Awake sendiri tidak boleh menulis void Awake() biasa. Ini menyembunyikan method milik base class (compiler akan memperingatkanmu), Unity hanya memanggil method milik manager, dan Instance tidak pernah ditetapkan. Gunakan override dan panggil base terlebih dahulu:
protected override void Awake()
{
base.Awake();
score = 0;
}Tantangan
SedangSebuah kota dan hutan, terhubung oleh portal ungu. Setiap scene memiliki object Wallet dan MusicPlayer sendiri, jadi masing-masing bermain sendiri, dan koin memanggil Wallet.Instance.Add(1). Saat ini, setiap manager adalah singleton bagian 3, jadi setiap pemuatan mengganti wallet dengan yang kosong. Beri kedua manager basis generik yang mempertahankan keduanya saat scene dimuat:
- Di
PersistentSingleton.cs, tulispublic abstract class PersistentSingleton<T>, sebuah MonoBehaviour untuk tipe MonoBehaviour apa pun T, denganInstancestatic public bertipe T yang hanya dapat diatur oleh class tersebut, danprotected virtual void Awake(). - Awake-nya mempertahankan instance pertama dari jenisnya: instance itu menjadi Instance dan bertahan saat scene dimuat. Instance berikutnya menghancurkan object-nya sendiri dan tidak mengubah apa pun.
WalletdanMusicPlayermewarisinya, dan fieldInstancemilik mereka sendiri dihapus.MusicPlayertetap memiliki Awake sendiri yang mencatatNow playing: Adventure. Awake ini harus dijalankan setelah Awake milik base, dan hanya untuk instance yang bertahan, agar musik dimulai sekali per game.
Panah menggerakkan Player. Tekan Jalankan, ambil koin, pergi ke hutan lalu kembali, kemudian tekan Periksa.
Coba sendiri
using UnityEngine;
// PersistentSingleton<T>: satu instance yang tetap ada saat scene dimuat ulang
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Arsitektur Game di Unity
1Komponen, Bukan Hierarki
Komponen KecilSkrip Dasar MusuhKomponen AbstrakKomponen yang Bekerja SamaRingkasan: Turret Modular5ScriptableObjects
Aset DataStatistik SenjataPengaturan BersamaGelombang sebagai DataUlasan: database Item8Kode yang Dapat Digunakan Kembali
Extension methodSingleton GenerikHelper GenerikUlasan: FindNearest