存檔功能是游戲中最常用的功能之一。
直接上代碼:
using System; using System.Collections; using System.Collections.Generic; using System.IO; using UnityEngine; namespace TianBoWang.Function { /// <summary> /// 儲存數據管理 /// </summary> public class SavaDataManager :MonoBehaviour { private SaveData saveData; public string jsonName="SceneData.json"; private string path; private void Awake() { path = Application.persistentDataPath + "/"+jsonName; saveData = LoadDataFromJson(path); SaveDataToJson(); } /// <summary> /// 從json里面讀取數據 /// </summary> private SaveData LoadDataFromJson(string p) { if (File.Exists(p)) { string json = File.ReadAllText(p); return JsonUtility.FromJson<SaveData>(json); } else { return new SaveData(GameSceneManager.GoldCoin); } } /// <summary> /// 儲存數據到json /// </summary> private void SaveDataToJson() { string json = JsonUtility.ToJson(saveData, true); StreamWriter sw = File.CreateText(path); sw.Close(); File.WriteAllText(path, json); } /// <summary> /// 獲取關卡信息 /// </summary> public SceneInfo GetDirectoryState(int sceneCount) { saveData = LoadDataFromJson(path); if (saveData.sceneInfo.Count != 0) { foreach (var item in saveData.sceneInfo) { if (item.currentLevel == sceneCount) { return item; } } } return new SceneInfo(sceneCount,new int[]{},new string[]{}); //Return clear state if there is no saved data } /// <summary> /// 儲存關卡信息 /// </summary> public void SetDirectoryState(SceneInfo current) { saveData = LoadDataFromJson(path); saveData.sceneInfo.RemoveAll(t => t.currentLevel == current.currentLevel); //Replace old data with new saveData.sceneInfo.Add(current); SaveDataToJson(); } /// <summary> /// 儲存金幣數量 /// </summary> public void SetCoins(int coins) { saveData = LoadDataFromJson(path); saveData.coinsCount = coins; SaveDataToJson(); } /// <summary> /// 獲取金幣數量 /// </summary> public int GetCoins() { saveData = LoadDataFromJson(path); return saveData.coinsCount; } } [Serializable] public struct SaveData { public int coinsCount; public List<SceneInfo> sceneInfo; public SaveData(int coins) { coinsCount = coins; sceneInfo = new List<SceneInfo>(); } } [Serializable] public class SceneInfo { public SceneInfo(int curLevel, int[] pass, string[] bonus,bool isComp=false) { currentLevel = curLevel; passArray = pass; bonusArray = bonus; isComplate = isComp; } public int currentLevel; //這一關第幾個pass通過了 public int[] passArray; public string[] bonusArray; public bool isComplate; } }