Singleton adalah suatu class yang hanya boleh memiliki satu instance. Kenapa cuma satu? Karena berhubungan dengan data, kalau banyak nanti bingung. Data milik instance mana yang benar?

Kenapa sih perlu singleton ?

Gini, waktu berpindah scene, seluruh GameObject akan dihapus untuk menghemat memori. Sehingga gak bisa dipakai lagi di scene berikutnya. Selain itu, kadang sebuah variabel memiliki scope terbatas, sehingga tidak bisa diakses oleh objek yang lain.

Solusinya?
Ya bikin objek global yang bisa diakses siapa saja. Selain itu, paksa objeknya untuk tidak dihapus waktu pindah scene. Hasilnya, data tidak hilang.

Untuk belajar, kita akan membuat transisi dua scene yang akan menunjukkan jumlah coin yang dimiliki.


Pembuatan Scene

1.) Pertama, buat dulu tampilan scene.

Buat file bernama Scene1Script.cs lalu Add Component ke Main Camera.

Scene1Script.cs



using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;

public class Scene1Script : MonoBehaviour {

    void OnGUI(){
        GUI.Label (new Rect (Screen.width/2, Screen.height-80, 150, 30), "Scene 1");
        if(GUI.Button (new Rect (Screen.width / 2, Screen.height-50, 100, 30), "Go to Scene 2")){
            SceneManager.LoadScene ("Scene 2");
        }
    }
}

Dalam script ini cuma menampilkan sekarang ada di scene berapa, terus ada satu button untuk pindah ke scene satunya.

2.) Buat scene baru

Tujuannya agar bisa bolak-balik pindah antar scene. Untuk script sama dengan yang pertama, cuma beda parameter saja.

Scene2Script.cs


using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;

public class Scene2Script : MonoBehaviour {

    void OnGUI(){
        GUI.Label (new Rect (Screen.width/2, Screen.height-80, 150, 30), "Scene 2");
        if(GUI.Button (new Rect (Screen.width / 2, Screen.height-50, 100, 30), "Go to Scene 1")){
            SceneManager.LoadScene ("Scene 1");
        }
    }
}

GameManager

GameManager digunakan untuk men-handle segala sesuatu yang berhubungan dengan game. Di sini, cuma digunakan untuk menyimpan data coin saja. Di sinilah digunakan class singleton.

Nah, bisa saja dalam satu project punya beberapa manager untuk mengurusi sebuah task secara spesifik.

3.) Buat GameManager

Buat GameObject bernama GameManager, lalu Add Component script GameManagerScript.cs ke dalamnya.

GameManagerScript.cs


using System.Collections;
using UnityEngine;

public class GameManagerScript : MonoBehaviour {

    public static GameManagerScript gameManager;
    public float money;

    void Awake(){

        if (gameManager == null) {
            DontDestroyOnLoad (gameObject);
            gameManager = this;
        }

        else if (gameManager != this)
            Destroy (this);
    }

    void OnGUI(){
        GUI.Label (new Rect(Screen.width/2,Screen.height-120,300,30), 
            "Money : " + money + " coins");
    }
}
  • Karena singleton cuma bisa satu instance, cek dulu apakah udah ada instance ini.
  • Jika ternyata sudah memiliki instance, maka hapus instance yang lain dengan Destroy().

Kita tengok lagi masalah awalnya. Setiap berpindah scene, semua GameObject dihapus. Makanya, kita larang Unity untuk menghapus objek singleton dengan perintah DontDestroyOnLoad(). Proses yang terjadi di balik layar kira-kira seperti gambar di bawah :

Nah, sekarang bisa dicoba. Nilai coin akan tetap bernilai 1000.

Dalam tutorial berikutnya, kita akan kembangkan project ini untuk bisa save dan load data.

Source code bisa didownload di sini.