Menu
CoddyTech

Simpan Game

Termasuk bagian Arsitektur Game di Unity dalam perjalanan Unity di Coddy. Pelajaran 31 dari 64.

Save game adalah satu object yang ditulis sebagai JSON. Masukkan semua yang dibutuhkan save ke dalam class [System.Serializable], isi nilainya dari game, lalu tulis hasil JsonUtility.ToJson ke suatu tempat yang tetap ada setelah game ditutup. Dungeon ini menyimpan lantai, gold, dan kunci yang ditemukan:

[System.Serializable]
public class DungeonSave
{
    public int floor;
    public int gold;
    public List<string> keys;
}
using System.Collections.Generic;
using System.IO;
using UnityEngine;

public class Dungeon : MonoBehaviour
{
    public int floor = 1;
    public int gold;
    public List<string> keys = new List<string>();
    private string path;

    void Start()
    {
        path = Path.Combine(Application.persistentDataPath, "dungeon.json");
        if (File.Exists(path))
        {
            DungeonSave save = JsonUtility.FromJson<DungeonSave>(File.ReadAllText(path));
            floor = save.floor;
            gold = save.gold;
            keys = save.keys;
        }
    }

    public void Save()
    {
        DungeonSave save = new DungeonSave();
        save.floor = floor;
        save.gold = gold;
        save.keys = keys;
        File.WriteAllText(path, JsonUtility.ToJson(save));
    }
}

Application.persistentDataPath adalah folder yang disediakan Unity untuk game di setiap platform, dan tetap ada di antara sesi bermain serta setelah pembaruan. Path.Combine menggabungkan path tersebut dengan nama file menggunakan pemisah milik platform. File.WriteAllText(path, text) menulis file dan menggantikan file yang lama, File.Exists memberi tahu apakah file tersebut ada, dan File.ReadAllText membaca isinya kembali. Ketiganya berasal dari System.IO. Folder game itu sendiri mungkin hanya bisa dibaca, jadi simpan data di persistentDataPath dan jangan di tempat lain. Buat path di Awake atau Start: Unity tidak mengizinkan penggunaan persistentDataPath dalam inisialisasi field.

Class save hanya menyimpan hal-hal yang dibutuhkan, lalu game menyalin nilai ke dalamnya saat menyimpan dan mengambil nilai darinya saat memuat. Save kecil bisa disimpan di PlayerPrefs alih-alih di file: PlayerPrefs.SetString("dungeon", json) dan PlayerPrefs.GetString("dungeon") menyimpan JSON yang sama. Simpan saat terjadi sesuatu yang layak disimpan, di checkpoint atau melalui tombol Simpan: OnApplicationQuit berjalan saat game ditutup secara normal, tetapi ponsel bisa menutup game di latar belakang tanpa menjalankannya.

challenge icon

Tantangan

Sedang

Simpan pulau di island.json.

  1. Di IslandSave.cs, tulis class IslandSave dengan [System.Serializable], public Vector3 playerPosition;, dan public List<Vector3> flags;.
  2. Di Start(), atur path ke Path.Combine(Application.persistentDataPath, "island.json").
  3. Save() menulis IslandSave yang berisi transform.position dan flags ke path dalam format JSON.
  4. Start() membaca kembali file yang sudah ada: posisinya, lalu memanggil PlantFlag untuk setiap bendera.

Tekan tombol “Main”, tanam bendera, tekan Simpan, hentikan lalu tekan tombol “Main”: bendera muncul kembali. Lalu tekan tombol “Periksa”.

Coba sendiri

using System.Collections.Generic;
using System.IO;
using UnityEngine;
using UnityEngine.InputSystem;

public class Explorer : MonoBehaviour
{
    public GameObject flagPrefab;
    public float speed = 4f;
    private List<Vector3> flags = new List<Vector3>();
    private InputAction moveAction;

    void Start()
    {
        moveAction = InputSystem.actions.FindAction("Move");
        // Muat island.json di sini
    }

    void Update()
    {
        Vector2 input = moveAction.ReadValue<Vector2>();
        transform.Translate(new Vector3(input.x, 0f, input.y) * speed * Time.deltaTime);
        if (Keyboard.current.spaceKey.wasPressedThisFrame)
        {
            PlantFlag(transform.position);
        }
    }

    void PlantFlag(Vector3 position)
    {
        flags.Add(position);
        Instantiate(flagPrefab, new Vector3(position.x, 0.5f, position.z), Quaternion.identity);
    }

    // Tombol Save memanggil fungsi ini
    public void Save()
    {
        // Tulis posisi pemain dan bendera ke island.json
    }
}

Semua pelajaran di Arsitektur Game di Unity

Latihan sendiri: Playground Unity