Menu
CoddyTech

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.

challenge icon

Thử thách

Trung bình

Lưu hòn đảo vào island.json.

  1. Trong IslandSave.cs, viết một lớp [System.Serializable] tên là IslandSave với public Vector3 playerPosition; và public List<Vector3> flags;.
  2. Trong Start(), đặt path thành Path.Combine(Application.persistentDataPath, "island.json").
  3. Save() ghi một IslandSave chứa transform.position và flags vào path dưới dạng JSON.
  4. Start() đọc lại tệp đã có: vị trí và gọi PlantFlag cho 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

Tự luyện tập: Playground Unity