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.
Tantangan
SedangPenjelajah 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]bernamaIslandSavedengan field publikplayerPosition(sebuah Vector3) danflags(sebuahList<Vector3>). Save(), yang dipanggil oleh tombol Save, menulis posisi penjelajah dan bendera sebagai JSON keisland.jsondiApplication.persistentDataPath.- Di
Start(), jikaisland.jsonada, kembalikan penjelajah ke posisi tersimpan dan tancapkan kembali setiap bendera tersimpan denganPlantFlagagar 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
}
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Arsitektur Game di Unity
1Komponen, Bukan Hierarki
Komponen KecilSkrip Dasar MusuhKomponen AbstrakKomponen yang Bekerja SamaRingkasan: Turret Modular5ScriptableObjects
Aset DataStatistik SenjataPengaturan BersamaGelombang sebagai DataUlasan: database Item8Kode yang Dapat Digunakan Kembali
Extension methodSingleton GenerikHelper GenerikUlasan: FindNearest