unity遊戲本地存檔(json,playerPrefs,Protobuffer,ScriptableObject)

本地存檔方案很多,下面簡單總結幾種使用playerprefs,json,scriptableObject花式存檔方案。

1、playerprefs結合Json的序列化和反序列化功能存儲複雜結構

public class Script1 : MonoBehaviour
{
    void Start()
    {
        ReadRecord();
        SaveRecord();
    }

    void ReadRecord()
    {
        Record record = new Record();
        //讀取存檔
        record = JsonUtility.FromJson<Record>(PlayerPrefs.GetString("record"));
        if (record == null)
        {
			record = InitData();
        }
        Debug.LogFormat("stringValue = {0}; bestScore={1}", record.stringValue, record.bestScore);
    }
    void SaveRecord()
    {
        //保存遊戲存檔
        Record record = new Record();
        record.stringValue = "Yaqing Ren";
        record.bestScore = 200;
        record.names = new List<string>() { "test1", "test2" };
        string json = JsonUtility.ToJson(record);
        //可以使用try catch來捕獲異常
        try
        {
            PlayerPrefs.SetString("record", json);
            Debug.Log("json:" + json);
        }
        catch (System.Exception err)
        {
            Debug.Log("Got: " + err);
        }
    }
    Record InitData()
    {
        Record record = new Record();
        record.stringValue = "Yaqing";
        record.bestScore = 0;
        record.names = new List<string>();
		return record;
    }

    //存檔對象
    [System.Serializable]
    public class Record
    {
        public string stringValue;
        public int bestScore;
        public List<string> names;
    }

}

2、playerprefs結合Protobuf存儲各種複雜結構

 

3、使用ScriptableObject生成Json文件進行存檔

創建了兩個ScriptableObject,一個是DataStore,需要保存的數據對象; 一個是DataManager,DataManager爲單例,可以通過該單例對象訪問所有的數據對象(假如不只DataStore這一個存儲數據的對象)。編輯器中保存的路徑爲:../Users/apple/Desktop/GameArchiver/ExcelData/SavedData

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

[System.Serializable]
public class CollectionStatueInfo
{
    public string statueName;
    public int count;
}

[CreateAssetMenu(fileName = "DataStore", menuName = "Data/Save/DataStore", order = 0)]
public class DataStore : ScriptableObject
{
    public int level = 0;
    public int bestScore = 0;
    public int playerGold = 0;
    public CollectionStatueInfo[] collectionStatueInfos;

    public void AddGold(int amount)
    {
        playerGold += amount;
    }

    public CollectionStatueInfo GetStatueInfo(string name)
    {
        for (int i = 0; i < collectionStatueInfos.Length; i++)
        {
            var info = collectionStatueInfos[i];
            if (info.statueName == name)
            {
                return info;
            }
        }
        return null;
    }

    public void SaveToJSON()
    {
        DataUtility<DataStore>.SaveToJSON(this);
    }
}
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;

/// <summary>
/// 初始化數據存儲
/// </summary>
[CreateAssetMenu(fileName = "DataManager", menuName = "Level/DataManager", order = 0)]
public class DataManager : ScriptableObject
{
    private static DataManager _instance;
    public static DataManager Instance
    {
        get
        {
            if (!_instance)
            {
                _instance = Resources.FindObjectsOfTypeAll<DataManager>().FirstOrDefault();
            }
            return _instance;
        }
    }

    [Header("DataStore")]
    public DataStore dataStoreTemple;
    private DataStore _dataStoreInstance;
    public DataStore dataStore
    {
        get
        {
            return _dataStoreInstance;
        }
    }

    public void LoadData()
    {
        _dataStoreInstance = DataUtility<DataStore>.LoadFromJSONorDefault(dataStoreTemple);
    }

    public void SaveData()
    {
        // dataStore.SaveToJSON();
        DataUtility<DataStore>.SaveToJSON(_dataStoreInstance);
    }

#if UNITY_EDITOR
    [UnityEditor.MenuItem("GameEditor/DataStore")]
    public static void ShowDataStore()
    {
        UnityEditor.Selection.activeObject = Instance.dataStore;
    }
#endif
}

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Script3 : MonoBehaviour
{
    public DataManager dataManager;
    void Start()
    {
        DataUtility<DataManager>.InitializeFromDefault(dataManager);
        DataManager.Instance.LoadData();
        DataManager.Instance.dataStore.level = 200;
        // DataManager.Instance.dataStore.SaveToJSON();
        DataManager.Instance.dataStore.AddGold(10);
        DataManager.Instance.SaveData();
    }
}

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章