Menu
CoddyTech

Simpan Game

Termasuk bagian Arsitektur Game di Unity dalam perjalanan Unity di Coddy. Pelajaran 25 dari 50.

Data simpanan game adalah satu object yang ditulis sebagai JSON. Masukkan semua yang dibutuhkan data simpanan ke dalam class [System.Serializable], isi dari game, lalu tulis JsonUtility.ToJson darinya ke suatu tempat yang tetap ada setelah game ditutup. Dungeon ini menyimpan lantai, emas, 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 diberikan Unity kepada game di setiap platform, dan tetap ada di antara sesi permainan serta setelah pembaruan. Path.Combine menggabungkan path itu dengan nama file menggunakan pemisah milik platform. File.WriteAllText(path, text) menulis file dan mengganti file lama, File.Exists memberi tahu apakah file tersedia, dan File.ReadAllText membacanya kembali (ketiganya berasal dari System.IO). Folder game itu sendiri mungkin hanya bisa dibaca, jadi simpanan disimpan di persistentDataPath dan tidak di tempat lain. Buat path di Awake atau Start: Unity menolak persistentDataPath di inisialisasi field.

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

challenge icon

Tantangan

Sedang

Penjelajah berjalan menyusuri pulau dengan tombol panah, dan tombol Spasi menancapkan bendera di tempat penjelajah berdiri. Buat pulau ini menjadi game tersimpan di file island.json:

  • Di IslandSave.cs, tulis class [System.Serializable] bernama IslandSave dengan field publik playerPosition (sebuah Vector3) dan flags (sebuah List<Vector3>).
  • Save(), yang dipanggil oleh tombol Save, menulis posisi penjelajah dan bendera sebagai JSON ke island.json di Application.persistentDataPath.
  • Di Start(), jika island.json ada, kembalikan penjelajah ke posisi tersimpan dan tancapkan kembali setiap bendera tersimpan dengan PlantFlag agar bendera masuk ke list untuk penyimpanan berikutnya.

Tekan Play, tancapkan beberapa bendera dan klik Save, lalu Stop dan tekan Play lagi. Kemudian 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 method ini
    public void Save()
    {
        // Tulis posisi pemain dan semua bendera ke island.json
    }
}
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Arsitektur Game di Unity