Dalam tutorial sebelumnya, kita telah belajar cara menggunakan singleton dan fungsinya untuk presistensi data. Sekarang, kita akan tambahkan fitur penyimpanan data tersebut.

Tambah Money

Buat dulu script untuk menambah dan mengurangi money yang dimiliki agar terlihat bedanya. Tambahkan ke MainCamera.

ChangeAmount.cs


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

public class GantiNilaiScript : MonoBehaviour {

    void OnGUI(){

        if(GUI.Button (new Rect(Screen.width/2, 10,100,30), "Add +10 coins"))
            GameManagerScript.gameManager.money += 10;

        if(GUI.Button (new Rect(Screen.width/2, 60,150,30), "Substract -10 coins"))
            GameManagerScript.gameManager.money -= 10;
    }
}

SaveLoadManager

Buat satu lagi manager yang bertugas untuk melakukan save dan load money yang disimpan.

SaveLoadManager.cs


using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Runtime.Serialization.Formatters.Binary;
using System.IO;

public class SaveLoadManager : MonoBehaviour {

    public static SaveLoadManager saveLoad;

    private string savePath;

    void Awake(){
        savePath = Application.persistentDataPath + "/gameInfo.dat";
        if (saveLoad == null) {
            DontDestroyOnLoad (gameObject);
            saveLoad = this;
        }

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

    public void saveGame(){
        BinaryFormatter bf  = new BinaryFormatter ();
        FileStream file     = File.Create (savePath);

        GameData gameData       = new GameData ();
        gameData.money          = GameManagerScript.gameManager.money;

        bf.Serialize (file,gameData);
        file.Close ();
    }

    public void load(){
        if(File.Exists (savePath)){
            BinaryFormatter bf  = new BinaryFormatter ();
            FileStream file     = File.Open (savePath, FileMode.Open);

            GameData gameData = (GameData) bf.Deserialize (file);
            file.Close ();

            GameManagerScript.gameManager.money = gameData.money;
        }
    }
}

[System.Serializable]
class GameData{
    public float money;
}

Wew,
ada banyak sekali yang perlu dijelaskan di sini.

Pertama, di dalam Awake() lakukan pengecekan singleton seperti kemarin. Deklarasikan juga lokasi penyimpanan dan filename yang dipakai.

Kedua, di method saveGame() Unity akan membuat file di lokasi penyimpanan. Data yang bisa disimpan hanyalah data serializable. Untuk membuat file digunakan FileStream, kemudian lakukan serialisasi data serializable oleh BinaryFormatter.

Proses serialisasi ini adalah proses merubah sebuah struktur data menjadi format lain yang dapat disimpan dan dikembalikan lagi ke bentuk semula. Data yang akan di serialisasi ditandai dengan [System.Serializable].

Ketiga, di method load() lakukan pengecekan apakah sudah pernah menyimpan sebelumnya. Jika sudah, buka dan de-serialisasi.

Proses serialisasi dan deserialisasi kira-kira penggambarannya seperti gambar di bawah ini.

Save

Setelah manager selesai dibuat, tinggal buat button untuk menjalankannya. Letakkan di scene 1 dan 2.

SaveLoad.cs


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

public class SaveLoad : MonoBehaviour {

    void OnGUI(){
        if(GUI.Button (new Rect(Screen.width/2,200,300,30), 
            "Save")){
            SaveLoadManager.saveLoad.saveGame ();

        }
        if(GUI.Button (new Rect(Screen.width/2,250,300,30), 
            "Load")){
            SaveLoadManager.saveLoad.load ();
        }
    }
}

Hasilnya adalah seperti ini :

Kira kira bagaimana caranya agar ketika game dimulai, otomatis melakukan pengecekan sudah pernah nge-save atau belum?

Source code dapat didownload di sini.