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.
Tantangan
SedangSimpan pulau di island.json.
- Di
IslandSave.cs, tulis classIslandSavedengan[System.Serializable],public Vector3 playerPosition;, danpublic List<Vector3> flags;. - Di
Start(), aturpathkePath.Combine(Application.persistentDataPath, "island.json"). Save()menulis IslandSave yang berisitransform.positiondanflagskepathdalam format JSON.Start()membaca kembali file yang sudah ada: posisinya, lalu memanggilPlantFlaguntuk 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
1Komponen, Bukan Hierarki
Komponen KecilSkrip Dasar MusuhKomponen AbstrakKomponen yang Bekerja BersamaRangkuman: Turret ModularRangkuman: Meriam Kembar4Data yang Diserialisasi
Class yang Dapat DiserialisasiList di InspectorEnum di InspectorRangkuman: Tabel LootRangkuman: Acak Loot2Antarmuka di Unity
IDamageableAntarmuka dan TryGetComponentGetComponentsRingkasan: Tombol InteractRingkasan: Terdekat dalam Jangkauan5ScriptableObjects
Aset DataStatistik SenjataPengaturan BersamaSelamatkan AnginGelombang sebagai DataRekap: database ItemBeli dari Toko8Kode yang Dapat Digunakan Kembali
Extension methodSingleton GenerikHelper GenerikUlasan: FindNearestLatihan sendiri: Playground Unity