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;
}Tantangan
SedangBeri kedua manager basis yang bertahan saat scene dimuat.
- Di
PersistentSingleton, tulisprotected virtual void Awake(): yang pertama menjadiInstancedan tetap ada (DontDestroyOnLoad); yang muncul belakangan menghancurkan dirinya sendiri. WalletdanMusicPlayermewarisinya; hapusInstancemereka dan Awake milik Wallet.MusicPlayermeng-override Awake:base.Awake(), lalu, jika itu adalah Instance, mencatatNow 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
1Komponen, Bukan Hierarki
Komponen KecilSkrip Dasar MusuhKomponen AbstrakKomponen yang Bekerja BersamaRangkuman: Turret ModularRangkuman: Meriam Kembar4Data yang Diserialisasi
Class yang Dapat DiserialisasiList di InspectorEnum di InspectorRangkuman: Tabel LootRangkuman: Acak Loot2Antarmuka di Unity
IDamageableAntarmuka dan TryGetComponentGetComponentsRingkasan: Tombol InteractRingkasan: Terdekat dalam Jangkauan5ScriptableObjects
Aset DataStatistik SenjataPengaturan BersamaSelamatkan AnginGelombang sebagai DataRekap: database ItemBeli dari Toko8Kode yang Dapat Digunakan Kembali
Extension methodSingleton GenerikHelper GenerikUlasan: FindNearestLatihan sendiri: Playground Unity