本地存檔方案很多,下面簡單總結幾種使用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();
}
}