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();
    }
}

 

 

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