在场景中的实体保存固定的数据,
对字符串数据进行加密(D加密都能够被破解,何况短短32位的密钥加密)
在场景中的实体保存固定的数据
根据相关资料1,2
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}}]}
对字符串数据进行加密
根据参考资料1
对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}}]}
打开SaveData.json文件,显示为乱码
1BxgAMrnYK9jgo4xybyujuoKBBp4pINTTlXTj41AWSEvmv1UMCRqCO9TRRS1hKMB5+veMwyyYgaLwBtQV0ItXlzb/pk3VvlwCYbhSgCoXZNhaeajkTYg/PXK38nsJiMaPzUQN9So+Q2oT+gT/hvS4O8vAfUlwvRZJKfZrxkXMVY=
读取数据的时候通过 密钥 进行解密,读取数据。
EncryptDecipherTool.cs代码在参考资料1中,
那么对32位的Key密钥进行加密解密即可,阻挡一些作弊者。
固定的数字能否成为密钥
1.通过获得本机的MAC地址,来进行运算获得32位数字的字符串。
MAC地址的长度为48位(6个字节),通常表示为12个16进制数,如:00-16-EA-AE-3C-40就是一个MAC地址
MAC地址16进制转换,为12位10进制的数字。
要考虑到 更换主机 进行游戏,MAC地址也会跟随改变 这种情况。
2.获得上一次登录的时间,本次登录的时间
国家时间的时区不同,语言习惯YY/MM/DD,DD/MM/YY,
年月日小时分钟秒,4+2+2+2+2+2=14位10进制数字
本次登录软件的时间,
3.
4.
5.
6.
获得固定数字不够32位,以及明码,根据一些密码的规则,
进行运算,或者是
1.随机排列,例如,奇数与偶数呼唤
2.一些数学公式,来获得32位密钥。固定数字*数学公式=32位10进制密钥
3.比如通过登录时间获得14位10进制数字YYM1M1DD/HHM2M2SS,其余的18位数字,进行随机重复的排列
YYM1M1DD/HHM2M2SS
SSHHM2M2M1M1YYDDYYDD
JSONDemon.cs相关资料2
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using System.IO;
using System.Linq;//.OfType
using System.Collections;
using System.Text;
using System.Security.Cryptography;
using System;
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());
jsonToSave = EncryptDecipherTool.Encrypt(jsonToSave);
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变量的形式读取
jsonToLoad = EncryptDecipherTool.Decipher(jsonToLoad);
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][存档][JSONUnity]读取方块数据为什么只能保存instanceID
2.
[Unity][存档][JSONUnity]场景中的实体是否能保存数据
3.
4.
参考资料:
1.
2.
3.
4.
5.
6.