我是标题
- 1.依赖包
- 2.原理:
- 3.代码
- 4.可用优化
- 5.数据加密
1.依赖包
Newtonsoft请在PacakgeManager处下载。
参考:打工人小棋
2.原理:
把要存储的对象数据等使用JsonConvert.SerializeObject(object T)进行序列化为字符串,并且通过File.WriteAllText写入json文本文件。
读取的时候就通过反序列化读取存储的数据。
T data = JsonConvert.DeserializeObject(jsonContent);
3.代码
Unity官方推荐把存档文件放置到Application.persistentDataPath目录下。在Windows环境下路径为:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Newtonsoft.Json;
using System.IO;
public class LocalConfig
{
public static void SavaUserData(UserData userData)
{
if(!File.Exists(Application.persistentDataPath + "/users"))
{
System.IO.Directory.CreateDirectory(Application.persistentDataPath + "/users");
}
// 序列化
string jsonContent = JsonConvert.SerializeObject(userData);
// 输出一个json文件 {0} 是占位符 类似printf的%d
File.WriteAllText(Application.persistentDataPath + string.Format("/users/{0}.json", userData.name), jsonContent);
}
public static UserData LoadUserData(string userName)
{
string path = Application.persistentDataPath + string.Format("/users/{0}.json", userName);
if(File.Exists(path))
{
// 读取路径文本数据
string jsonContent = File.ReadAllText(path);
// 反序列化
UserData userData = JsonConvert.DeserializeObject<UserData>(jsonContent);
return userData;
}
else
{
Debug.LogError("DO NOT EXIST");
return null;
}
}
}
public class UserData
{
public int level;
public string name;
}
4.可用优化
由于硬盘的读写是比较耗时的操作,我们可以用字典存储<userName,userData>的键值对。
好处:读取相同的数据只有第一次需要使用文件读取,后续只需要使用字典访问。
由于每次退出程序DIctionary都会清空所以第一次访问同一个对象会比后续慢。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Newtonsoft.Json;
using System.IO;
public class LocalConfig
{
public static Dictionary<string, UserData> userDataDic = new Dictionary<string, UserData>();
public static void SavaUserData(UserData userData)
{
if(!File.Exists(Application.persistentDataPath + "/users"))
{
System.IO.Directory.CreateDirectory(Application.persistentDataPath + "/users");
}
// 序列化
string jsonContent = JsonConvert.SerializeObject(userData);
// 输出一个json文件 {0} 是占位符 类似printf的%d
File.WriteAllText(Application.persistentDataPath + string.Format("/users/{0}.json", userData.name), jsonContent);
if(userDataDic.ContainsKey(userData.name))
{
userDataDic[userData.name] = userData;
}
else
{
userDataDic.Add(userData.name, userData);
}
}
public static UserData LoadUserData(string userName)
{
if(userDataDic.ContainsKey(userName))
{
return userDataDic[userName];
}
string path = Application.persistentDataPath + string.Format("/users/{0}.json", userName);
if(File.Exists(path))
{
// 读取路径文本数据
string jsonContent = File.ReadAllText(path);
// 反序列化
UserData userData = JsonConvert.DeserializeObject<UserData>(jsonContent);
return userData;
}
else
{
Debug.LogError("DO NOT EXIST");
return null;
}
}
}
public class UserData
{
public int level;
public string name;
}
5.数据加密
因为一个数字异或同一个数字两次能得到原来的结果,所以可以借此来加密解密。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Newtonsoft.Json;
using System.IO;
public class LocalConfig
{
public static Dictionary<string, UserData> userDataDic = new Dictionary<string, UserData>();
private static char[] chars = {'4','5','6'};
private static string Encrypt(string data)
{
char[] temp = data.ToCharArray();
for(int i = 0; i < temp.Length; i++)
{
temp[i] = (char) (temp[i] ^ chars[i % 3]);
}
return new string(temp);
}
public static void SavaUserData(UserData userData)
{
if(!File.Exists(Application.persistentDataPath + "/users"))
{
System.IO.Directory.CreateDirectory(Application.persistentDataPath + "/users");
}
// 序列化
string jsonContent = JsonConvert.SerializeObject(userData);
jsonContent = Encrypt(jsonContent);
// 输出一个json文件 {0} 是占位符 类似printf的%d
File.WriteAllText(Application.persistentDataPath + string.Format("/users/{0}.json", userData.name), jsonContent);
if(userDataDic.ContainsKey(userData.name))
{
userDataDic[userData.name] = userData;
}
else
{
userDataDic.Add(userData.name, userData);
}
}
public static UserData LoadUserData(string userName)
{
if(userDataDic.ContainsKey(userName))
{
return userDataDic[userName];
}
string path = Application.persistentDataPath + string.Format("/users/{0}.json", userName);
if(File.Exists(path))
{
// 读取路径文本数据
string jsonContent = File.ReadAllText(path);
// 反序列化
jsonContent = Encrypt(jsonContent);
UserData userData = JsonConvert.DeserializeObject<UserData>(jsonContent);
return userData;
}
else
{
Debug.LogError("DO NOT EXIST");
return null;
}
}
}
public class UserData
{
public int level;
public string name;
}