Singleton
Termasuk bagian Membangun Game Sungguhan dalam perjalanan Unity di Coddy. Pelajaran 13 dari 56.
Referensi Inspector memerlukan sesuatu yang bisa dijadikan sasaran untuk diseret. Musuh yang dibuat spawner selama permainan berasal dari prefab, dan prefab hanya bisa menunjuk ke aset dan bagian-bagiannya sendiri, tidak pernah ke object di dalam scene, sehingga field GameManager mereka kosong. Solusi yang umum adalah singleton: GameManager menyimpan dirinya sendiri di sebuah field yang bisa diakses oleh setiap script melalui nama class.
public class GameManager : MonoBehaviour
{
public static GameManager Instance;
private int kills;
void Awake()
{
Instance = this;
}
public void EnemyDown()
{
kills++;
Debug.Log("Kills: " + kills);
}
}// Enemy.cs, pada prefab musuh
public void Die()
{
GameManager.Instance.EnemyDown();
Destroy(gameObject);
}static berarti field tersebut milik class, bukan milik sebuah object. Setiap object GameManager akan memiliki kills sendiri, tetapi hanya ada satu Instance di seluruh permainan, dan kamu bisa mengaksesnya dengan nama class: GameManager.Instance. Script apa pun bisa membacanya, termasuk musuh yang di-spawn semenit lalu, tanpa perlu mengisi field miliknya sendiri.
Manager menetapkan Instance = this; di Awake, dengan this merujuk pada script itu sendiri. Unity menjalankan semua Awake di scene sebelum Start mana pun, jadi script lain bisa menggunakan GameManager.Instance sejak Start-nya. GameManager kedua di scene akan menimpa Instance dengan dirinya sendiri. Bab Scenes and Levels menunjukkan cara mencegahnya.
Tantangan
MudahHujan meteor turun. Spawner menjatuhkan Meteor dari prefab setiap 1.5 detik, tombol panah menggerakkan Player, dan GameManager menghitung meteor yang tertangkap dengan MeteorCaught() serta meteor yang menghantam tanah dengan MeteorLanded(). Skrip-skrip itu sudah siap.
Skrip Meteor melaporkan melalui field game-nya, tetapi meteor berasal dari prefab, jadi game kosong dan setiap laporan gagal. Perbaiki ini dengan singleton:
- Di
GameManager.cs, tambahkan field publik statisInstancebertipe GameManager dan atur nilainya ke skrip ini di Awake. - Di
Meteor.cs, hapus fieldgamedan laporkan melaluiGameManager.Instance.
Tekan Play, tangkap beberapa meteor dan biarkan beberapa lolos, lalu tekan Periksa.
Coba sendiri
using UnityEngine;
using TMPro;
public class GameManager : MonoBehaviour
{
public TMP_Text caughtText;
public TMP_Text shieldText;
private int caught;
private int shield = 3;
public void MeteorCaught()
{
caught++;
caughtText.text = "Caught: " + caught;
}
public void MeteorLanded()
{
shield--;
shieldText.text = "Shield: " + shield;
}
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Membangun Game Sungguhan
4Scene dan Level
Muat SceneMulai Ulang LevelLevel BerikutnyaPertahankan Antar-SceneRekap: Pilih Level10Proyek: Platformer 3D
LintasanPlatform Bergerak2Tombol dan Layar
Tombol dan onClickLambdaMenghubungkan di InspectorPanel Aktif dan NonaktifBilah KesehatanRangkuman: Toko Upgrade5Menyimpan dengan PlayerPrefs
Simpan AngkaMuat dengan Nilai DefaultSkor TertinggiSimpan PengaturanUlasan: Koin di Bank3Pengelola Game
Satu Skrip Menjalankan GameSingletonStatus GamePercabangan Berdasarkan StatusUlasan: Pengelola Ronde6Proyek: Pelari Tanpa Akhir
Tiga JalurRintangan di Depan