Menu
CoddyTech

Singleton

Termasuk bagian Membangun Game Sungguhan dalam perjalanan Unity di Coddy. Pelajaran 13 dari 60.

Referensi Inspector membutuhkan sesuatu sebagai tujuan untuk diseret. Musuh yang dibuat spawner selama permainan berasal dari prefab, dan prefab hanya dapat menunjuk ke aset dan bagian-bagiannya sendiri, tidak pernah ke objek di dalam scene, jadi field GameManager mereka kosong. Solusi yang umum adalah singleton: GameManager menyimpan dirinya sendiri di sebuah field yang dapat dijangkau setiap skrip 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 objek. Setiap objek GameManager akan memiliki kills sendiri, tetapi hanya ada satu Instance di seluruh permainan, dan kamu dapat mengaksesnya dengan nama class: GameManager.Instance. Skrip apa pun dapat membacanya, termasuk musuh yang baru saja muncul semenit lalu, tanpa perlu mengisi field miliknya sendiri.

Manager menetapkan Instance = this; di Awake, dengan this sebagai skrip itu sendiri. Unity menjalankan semua Awake di scene sebelum Start mana pun, jadi skrip lain dapat menggunakan GameManager.Instance sejak Start-nya. GameManager kedua di scene akan menimpa Instance dengan dirinya sendiri; bab Scenes and Levels menunjukkan cara mencegahnya.

challenge icon

Tantangan

Mudah

Biarkan meteor mencapai GameManager melalui singleton.

  1. Di GameManager.cs, tambahkan public static GameManager Instance; dan Awake() dengan Instance = this;.
  2. Di Meteor.cs, hapus field game dan panggil GameManager.Instance.MeteorLanded() serta GameManager.Instance.MeteorCaught() sebagai gantinya.

Tekan tombol “Main” dan tangkap meteor: Caught: 1 akan muncul, tanpa error di Console. Lalu tekan tombol “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;
    }
}

Semua pelajaran di Membangun Game Sungguhan

Latihan sendiri: Playground Unity