既然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.