U3D游戏存档功能的实现(基于unity内置的JsonUtility读取/写入数据)

  存档功能是游戏中最常用的功能之一。

  直接上代码:

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;
    }
}
原文地址:https://www.cnblogs.com/yzxhz/p/9681490.html