Lưu trò chơi
Thuộc phần Kiến trúc trò chơi trong Unity trong hành trình Unity của Coddy. Bài học 31 trên 64.
Một bản lưu trò chơi là một đối tượng được ghi dưới dạng JSON. Đặt mọi thứ bản lưu cần vào một lớp [System.Serializable], điền dữ liệu từ trò chơi rồi ghi kết quả JsonUtility.ToJson vào một nơi tồn tại lâu hơn trò chơi. Hầm ngục này lưu tầng, vàng và các chìa khóa đã tìm thấy:
[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 là thư mục Unity cấp cho trò chơi trên mọi nền tảng, được giữ nguyên giữa các lần chơi và qua các bản cập nhật. Path.Combine ghép đường dẫn này với tên tệp bằng dấu phân cách của nền tảng. File.WriteAllText(path, text) ghi tệp, thay thế tệp cũ nếu có, File.Exists cho biết tệp có tồn tại hay không, còn File.ReadAllText đọc lại nội dung tệp (cả ba đều thuộc System.IO). Thư mục riêng của trò chơi có thể chỉ cho phép đọc, vì vậy hãy lưu vào persistentDataPath và không lưu ở nơi nào khác. Tạo đường dẫn trong Awake hoặc Start: Unity không cho phép dùng persistentDataPath trong trình khởi tạo trường.
Lớp lưu trữ chỉ giữ những gì bản lưu cần, còn trò chơi sao chép giá trị vào lớp này để lưu và lấy giá trị ra để tải. Bạn có thể lưu một bản lưu nhỏ vào PlayerPrefs thay vì tệp: PlayerPrefs.SetString("dungeon", json) và PlayerPrefs.GetString("dungeon") lưu cùng một JSON. Hãy lưu khi có sự kiện đáng giữ lại, tại điểm kiểm tra hoặc bằng nút Save: OnApplicationQuit chạy khi thoát bình thường, nhưng điện thoại có thể đóng trò chơi ở chế độ nền mà không gọi hàm này.
Thử thách
Trung bìnhLưu hòn đảo vào island.json.
- Trong
IslandSave.cs, viết một lớp[System.Serializable]tên làIslandSavevớipublic Vector3 playerPosition;vàpublic List<Vector3> flags;. - Trong
Start(), đặtpaththànhPath.Combine(Application.persistentDataPath, "island.json"). Save()ghi một IslandSave chứatransform.positionvàflagsvàopathdưới dạng JSON.Start()đọc lại tệp đã có: vị trí và gọiPlantFlagcho từng lá cờ.
Nhấn Chơi, cắm cờ, nhấn Lưu, dừng rồi nhấn Chơi: chúng sẽ xuất hiện trở lại. Sau đó nhấn Kiểm tra.
Tự làm thử
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");
// Tải island.json tại đây
}
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);
}
// Nút Save gọi phương thức này
public void Save()
{
// Ghi vị trí của người chơi và các lá cờ vào island.json
}
}
Tất cả bài học trong Kiến trúc trò chơi trong Unity
1Thành phần, không phải hệ thống phân cấp
Thành phần nhỏTập lệnh kẻ địch cơ sởThành phần trừu tượngCác thành phần phối hợp với nhauÔn tập: tháp pháo mô-đunÔn tập: pháo nòng đôi4Dữ liệu tuần tự hóa
Lớp có thể tuần tự hóaDanh sách trong InspectorKiểu liệt kê trong InspectorÔn tập: Bảng vật phẩm rơiÔn tập: Quay vật phẩm2Giao diện trong Unity
IDamageableGiao diện và TryGetComponentGetComponentsÔn tập: phím tương tácÔn tập: đối tượng gần nhất trong tầm với5ScriptableObjects
Tài sản dữ liệuChỉ số vũ khíCài đặt dùng chungLưu gióSóng dưới dạng dữ liệuÔn tập: Cơ sở dữ liệu vật phẩmÔn tập: Mua hàng từ cửa hàng8Code có thể tái sử dụng
Phương thức mở rộngSingleton tổng quátCác hàm hỗ trợ tổng quátÔn tập: FindNearest3Sự kiện
Sự kiện C# trong UnityĐăng ký trong OnEnableCác trường UnityEventSự kiện điều khiển UIÔn tập: Cửa sổ bật lên thành tíchÔn tập: Bộ hẹn giờ cửa sổ bật lên6Lưu dữ liệu bằng JSON
JsonUtilityLưu trò chơiTải dữ liệu và giá trị mặc địnhÔn tập: các ô lưuChọn và xóa một ô lưu9Tái sử dụng đối tượng bằng pool
Vì sao cần pool đối tượngPool dùng hàng đợiObjectPool của UnityÔn tập: pool đạnTự luyện tập: Playground Unity