(一)关于路径
unity有几个关键的路径
(1).Application.dataPath 只读路径,就是工作目录的Assets路径
(2).Application.streamin
gAssetsPath
只读路径,在pc可写,程序打包后里面的所有资源都原封不动的打到游戏包里面
(3).Application.persistentDataPath
读写路径,pc端:C:/Users
/用户名/AppData/LocalLow/公司名/包名/文件。
Android:Android/data/包名/file/文件 。
ios:ios8系统不允许访问,但是你还是可以程序读取写入,但是外部无法看到。
从以上可以看出数据要保存读取,所有路径是用
Application.persistentDataPath。
(二)关于Json插件
用于unity解析Json插件貌似有很多,这里列举几个比较常见的
(1)LitJson 用的人很多,但是有一次本人在一次IOS手机上出现过无法预知的错误,百度后貌似也有人碰到过。
(2)miniJson 很多项目中用到很多,本人倒是没用过,不过见过很多商业项目用这个。
(3)SimpleJson 本人正在开发的项目中使用中,此次介绍也是使用这个插件。
(4)SimpleJson 下载地址 https://github.com/facebook-csharp-sdk/simple-json , 只要把SimpleJson.cs下载放入工程即可。
(三)加密解密算法
(1)使用C#自带的des算法,需要引入
using System.Security.Cryptography;
(四)代码示例
(1)数据对象: (最近发现序列化的时候成员必须是 get set 的形式,不然会报错,原因不知)
public class PlayerData
{
public int gold { get; set ; }
public int level { get; set; }
public string name { get; set; }
}
声明数据对象实例,用一个静态变量保存,使之在整个游戏过程都不会删除
public class GlobalData
{
public static PlayerData playerData = new PlayerData();
}
(2)数据读取和保存操作
using UnityEngine;
using System.Collections;
using SimpleJson; public class PlayerDataStore
{
private static string fileName = "data.txt";
private static string key = "this key"; //游戏开始时加载;
public static bool Reader()
{
string txt = Helper.ReadText(fileName);
if (string.IsNullOrEmpty(txt))
{
GlobalData.playerData = new PlayerData();
Debug.LogWarning("login first time.");
return false;
}
txt = Helper.DecryptString(txt, key);
GlobalData.playerData = SimpleJson.SimpleJson.DeserializeObject<PlayerData>(txt);
return true;
} //游戏结束和数据改变的时候保存;
public static bool Writer()
{
if (GlobalData.playerData == null)
{
return false;
}
string jsd = SimpleJson.SimpleJson.SerializeObject(GlobalData.playerData);
jsd = Helper.EncryptString(jsd, key);
return Helper.WriteText(fileName, jsd);
}
}
(3)加密解密函数
using System.Security.Cryptography; public class Helper
{ //加密;
public static string EncryptString(string str, string key)
{
byte[] buffer;
UTF8Encoding encoding = new UTF8Encoding();
MD5CryptoServiceProvider provider = new MD5CryptoServiceProvider();
byte[] buffer2 = provider.ComputeHash(encoding.GetBytes(key));
TripleDESCryptoServiceProvider provider2 = new TripleDESCryptoServiceProvider
{
Key = buffer2,
Mode = CipherMode.ECB,
Padding = PaddingMode.PKCS7
};
byte[] bytes = encoding.GetBytes(str);
try
{
buffer = provider2.CreateEncryptor().TransformFinalBlock(bytes, , bytes.Length);
}
finally
{
provider2.Clear();
provider.Clear();
}
return Convert.ToBase64String(buffer);
} //解密;
public static string DecryptString(string str, string key)
{
byte[] buffer;
UTF8Encoding encoding = new UTF8Encoding();
MD5CryptoServiceProvider provider = new MD5CryptoServiceProvider();
byte[] buffer2 = provider.ComputeHash(encoding.GetBytes(key));
TripleDESCryptoServiceProvider provider2 = new TripleDESCryptoServiceProvider
{
Key = buffer2,
Mode = CipherMode.ECB,
Padding = PaddingMode.PKCS7
};
try
{
byte[] inputBuffer = Convert.FromBase64String(str);
buffer = provider2.CreateDecryptor().TransformFinalBlock(inputBuffer, , inputBuffer.Length);
}
catch (Exception ex)
{
Debug.LogError("DecryptString failed. return empty string." + ex.Message);
return "";
}
finally
{
provider2.Clear();
provider.Clear();
}
return encoding.GetString(buffer);
}
}
(4)游戏结束或数据改变时保存
public class SceneManager : MonoBehaviour
{
void Start()
{
PlayerDataStore.Reader();
}
void OnDestroy()
{
if(PlayerDataStore.Writer()==false)
{
Debug.LogError("writer file failed.");
}
}
}
在移动平台就麻烦一点,因为移动平台难以捕获游戏关闭的回调,像Android杀死进程,或者是我Android太烂的缘故。这个时候就需要在数据一改变就执行一次保存,防止数据丢失。
(5)SimpleJson的其他简单用法
private void GameInit()
{
SimpleJson.JsonArray jsa = SimpleJson.SimpleJson.DeserializeObject("[]") as SimpleJson.JsonArray;
SimpleJson.JsonObject jso = SimpleJson.SimpleJson.DeserializeObject("{}") as SimpleJson.JsonObject;
jso["cc"] = "dd";
jso["bb"] = ;
jsa.Add(jso);
Debug.LogError(jsa.ToString());
}