[Unity][存档][JSONUnity]场景中的实体是否能保存数据

 

既然JSON能够保存场景中的 固定在场景中的实体,那么这些场景中的实体是否能够保存数据

 

在Unity编辑器中运行

E:\Unity\UnityProjects\New Unity Project\Assets\StreamingAssets\Resources

SaveData.json存储的内容

{"Items":[{"jsonCubes":[{"instanceID":3238},{"instanceID":3214},{"instanceID":3218}],"jsonDemon":{"instanceID":3138}}]}
 

打包EXE,运行EXE

E:\Unity\UnityProjects\TestEXE\Project001\New Unity Project_Data\StreamingAssets\Resources

SaveData.json

{"Items":[{"jsonCubes":[{"m_FileID":894,"m_PathID":0},{"m_FileID":890,"m_PathID":0},{"m_FileID":892,"m_PathID":0}],"jsonDemon":{"m_FileID":874,"m_PathID":0}}]}

 

发现 场景中的实体

JSONDemon中的一个int类型变量进行判断,而这个num_i,在每次打开EXE或者UNITY编辑器的时候,都会重新赋予一个初始的值0,不管重复多少次,只要是重新打开当前场景,就会初始化。除非搭配PlayerPrefs进行使用(相关资料5)。

... 
    int num_i = 0;
...

 

 

在text组件中显示结果

...
            text.text = "SAVE COMPLETE:"+ num_i;
...

 

...
            text.text = "LOAD COMPLETE:" + num_i;
...

PlayerPrefs搭配使用

 

...
    public void saveJSONCubeData()
    {
        num_i = PlayerPrefs.GetInt("num_i");
...
        PlayerPrefs.SetInt("num_i", num_i);
    }//saveJSONCubeData()
...

    public void loadJSONCubeDate()
    {
            num_i = PlayerPrefs.GetInt("num_i");
...

结果

在UNITY编辑器中,由于之前已经运行了一次,所以

 

打包EXE后,进行的显示

说明PlayerPrefs 存储的有效,只要是项目文件存在,就会一直保存数据。

 

 


其他所需的代码 在 相关资料4,

JSONDemon.cs 其中的改变如下所示


using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using System.IO;
using System.Linq;//.OfType


public class JSONDemon : MonoBehaviour
{
    int num_i = 0;
    /// <summary>
    /// 部分存档文件路径
    /// </summary>
    string path_json = "/Resources/SaveData.json";///Resources/
    //"/123/Scene/Test_Scene/Test_JSON/SaveData.json"
    ///Resources/
    /// <summary>
    /// 完整的 存档文件路径
    /// </summary>
    string path;
    /// <summary>
    /// 读取的JSON文本内容
    /// </summary>
    string jsonString;
    /// <summary>
    /// Test_JSONCube数组
    /// </summary>
    public Test_JSONCube[] test_JSONCubes;
    /// <summary>
    /// Test_JSONCube数组
    /// 读取 存储数据的 方块,更新座标,rotation
    /// </summary>
    public Test_JSONCube[] test_JSONCubes_LoadCube;
    public Text text;

    private void Start()
    {
        foreach (Test_JSONCube cube in test_JSONCubes)
        {
            cube.StartCube();
        }
        //saveJSONCubeData();
        //loadJSONCubeDate();
    }
    

    /// <summary>
    /// 保存JSON数据
    /// </summary>
    public void saveJSONCubeData()
    {
        num_i = PlayerPrefs.GetInt("num_i");
        num_i = num_i + 1;
        //获得 存档.json 的文件路径
        path = Application.streamingAssetsPath + path_json;
        DataJSONFile(path);
        string jsonStringZ = File.ReadAllText(path);//读取 存档文件.json的 所有文本内容,以String变量的形式读取

        SaveData data = new SaveData();
        List<Test_JSONCube> saveListData = new List<Test_JSONCube>();
        /*foreach (Test_JSONCube jSONCube in test_JSONCubes)
        {
            saveListData.Add(jSONCube);
        }*///或者saveListData.AddRange(test_JSONCubes);
        saveListData.AddRange(test_JSONCubes);//或者foreach (Test_JSONCube jSONCube in test_JSONCubes)
        data.jsonCubes = saveListData;
        data.jsonDemon = this.GetComponent<JSONDemon>();

        
        List<SaveData> saveDatas = new List<SaveData>();
        saveDatas.Add(data);
        string jsonToSave = JsonHelper.ToJson(saveDatas.ToArray());
        File.WriteAllText(Application.streamingAssetsPath + path_json, jsonToSave);
        //PlayerPrefs.SetString("Data", jsonToSave);
        //PlayerPrefs.Save();//保存在 PlayerPrefs.Save() 本地化保存数据

        if (text != null)
        {
            text.text = "SAVE COMPLETE:"+ num_i;
        }
        PlayerPrefs.SetInt("num_i", num_i);
    }//saveJSONCubeData()

    /// <summary>
    /// 读取JSON数据
    /// </summary>
    public void loadJSONCubeDate()
    {
        //DataJSONFile();
        if (File.Exists(Application.streamingAssetsPath + path_json) == true)
        {
            num_i = PlayerPrefs.GetInt("num_i");
            //获得 存档.json 的文件路径
            path = Application.streamingAssetsPath + path_json;
            string jsonToLoad = File.ReadAllText(path);//读取 存档文件.json的 所有文本内容,以String变量的形式读取
            Debug.Log("jsonStringZ:" + jsonToLoad);
            if (jsonToLoad != ""
                && test_JSONCubes_LoadCube.Length > 0)//用一个完全空白的empty.json文件进行测试,为了使得 获取的 文本内容不为空
            {
                SaveData[] saveDatas = JsonHelper.FromJson<SaveData>(jsonToLoad);
                //Load as Array
                //Test_JSONCube[] _tempLoadListDataZ = JsonHelper.FromJson<Test_JSONCube>(jsonToLoad);
                //Convert to List
                List<Test_JSONCube> loadListDataJsonCube = new List<Test_JSONCube>();

                for (int i = 0; i < saveDatas.Length; i++)
                {
                    loadListDataJsonCube = saveDatas[i].jsonCubes;
                    this.num_i = saveDatas[i].jsonDemon.num_i;

                }//for (int i =0; i < saveDatas.Length; i++)


                Debug.Log("-----------------------");
                foreach (Test_JSONCube cube in loadListDataJsonCube)
                {
                    Debug.Log("cubeName:" + cube.Name + "/Level:" + cube.Level + "/Position:" + cube.position + "/Rotation:" + cube.quaternion);

                    for (int i = 0; i < loadListDataJsonCube.Count; i++)
                    {
                        test_JSONCubes_LoadCube[i].setCube(cube);
                    }
                }
                for (int i = 0; i < loadListDataJsonCube.Count; i++)
                {
                    //test_JSONCubes_LoadCube[i];
                }

                Debug.Log("-----------------------");
                //Debug.Log("   loadListDataZ length: " + loadListDataZ.Count);
            }
        }
        if (text != null)
        {
            text.text = "LOAD COMPLETE:" + num_i;
        }
    }//loadJSONCubeDate()
    /// <summary>
    /// 判断 保存的JSON 格式的空文本文件 是否存在,如果存在 就 复制粘贴 为新的存档文件。
    /// </summary>
    private void DataJSONFile(string path)// [Unity][File][JSON]file.copy的使用方法代码动态创建.json文件
    {
        Debug.Log(".........1"+ File.Exists(Application.streamingAssetsPath + "/Resources/empty.json"));
        if (File.Exists(Application.streamingAssetsPath + "/Resources/empty.json") == true
            && File.Exists(path) == false)//Application.dataPath + path_json
        {
            Debug.Log(".........2");
            File.Copy(Application.streamingAssetsPath + "/Resources/empty.json", path);
            //Directory.CreateDirectory(path);
        }
        //Directory.CreateDirectory(path);
    }//DataJSONFile()

}//JSONDemon

[System.Serializable]
public class SaveData
{
    public List<Test_JSONCube> jsonCubes = new List<Test_JSONCube>();
    public JSONDemon jsonDemon;
}

 

 

相关资料:

1.

 

[Unity][EXE][存档]EXE打包文件代码动态新建JSON存档数据以及读取

2.

 

[Unity][存档][JSONUnity]读取方块数据为什么只能保存instanceID

3.

 

[Unity][存档][JSONUnity]如何同时保存地图数据和玩家数据

4.

 

[Unity][存档][JSONUnity]存储读取方块数据

5.

 

[Unity][存档]PlayerPrefs同一关键字存储的数据是否会受到影响

6.

 

 

 

 

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