http://blog.youkuaiyun.com/qinyuanpei/article/details/47775979文章很全面
角色信息:指一切表征虚拟角色成长路线的信息,如生命值、魔法值、经验值等等。
道具信息:指一切表征虚拟道具数量或者作用的信息,如药品、道具、装备等等。
场景信息:指一切和游戏场景相关的信息,如场景名称、角色在当前场景中的位置坐标等等。
事件信息:指一切和游戏事件相关的信息,如主线任务、支线任务、触发性事件等等。
从上面的文章来看,有:
1,Json库的序列化与反序列化,相应库的加密解密函数,一些基础的IO函数。
2,Xml的优点是可读性强,缺点是冗余信息多
3,PlayerPrefs存储方案本质上是将数据写入到一个Xml文件。这种方案适合存储简单信息
http://blog.youkuaiyun.com/beihuanlihe130/article/details/53676006unity的相应dll包下载
代码如下:
加密前:{"age":18,"name":"JJJ"}
加密后:2E7ctwZh4/ocH2REodhUfXjTOcFu6cwZsOaAa45lCn4=
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Newtonsoft.Json;
using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;
public class IO_GameSave : MonoBehaviour {
void Start() {
string filePath = Application.dataPath + "/Save";
string fileName = filePath + "/myData.sav";
MyData data = new MyData();
data.age = 18;
data.name = "JJJ";
SetData(filePath, fileName, data);
MyData deData = (MyData)GetData(typeof(MyData),fileName);
print("test3 age " + deData.age);
print("name " + deData.name);
}
void Start_test1() {
MyData data = new MyData();
data.age = 18;
data.name = "JJJ";
string str = SeriableObj(data);
MyData deData = (MyData)DeSeriableObj(str,typeof(MyData));
print("test1 age " + deData.age);
print("name " + deData.name);
}
private static string SeriableObj(object obj) {
string str = string.Empty;
str = JsonConvert.SerializeObject(obj);
return str;
}
private static object DeSeriableObj(string str,Type type) {
object desObj = null;
desObj = JsonConvert.DeserializeObject(str, type);
return desObj;
}
public static void CreatDir(string DirPath) {
if (IsHaveDir(DirPath))
return;
Directory.CreateDirectory(DirPath);
}
public static void CreatFile(string filePath,string content){
StreamWriter strWrite = File.CreateText(filePath);
strWrite.Write(content);
strWrite.Close();
}
public static bool IsHaveDir(string DirPath) {
return Directory.Exists(DirPath);
}
public static bool IsHaveFile(string filePath) {
return File.Exists(filePath);
}
public static void SetData(string filePath,string fileName,object obj) {
CreatDir(filePath);
string str = SeriableObj(obj);
//加密 猜想:可以随机生成相应的字符串,然后存到PlayerPrefs里
string strJiaMi = RijndaelEncrypt(str, "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
CreatFile(fileName, strJiaMi);
}
public static object GetData(Type type,string fileName) {
StreamReader strReader = File.OpenText(fileName);
string str = strReader.ReadToEnd();
//解密
string strJieMi = RijndaelDecrypt(str, "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
return DeSeriableObj(strJieMi, type);
}
/// <summary>
/// Rijndael加密算法
/// </summary>
/// <param name="pString">待加密的明文</param>
/// <param name="pKey">密钥,长度可以为:64位(byte[8]),128位(byte[16]),192位(byte[24]),256位(byte[32])</param>
/// <param name="iv">iv向量,长度为128(byte[16])</param>
/// <returns></returns>
private static string RijndaelEncrypt(string pString, string pKey)
{
//密钥
byte[] keyArray = UTF8Encoding.UTF8.GetBytes(pKey);
//待加密明文数组
byte[] toEncryptArray = UTF8Encoding.UTF8.GetBytes(pString);
//Rijndael解密算法
RijndaelManaged rDel = new RijndaelManaged();
rDel.Key = keyArray;
rDel.Mode = CipherMode.ECB;
rDel.Padding = PaddingMode.PKCS7;
ICryptoTransform cTransform = rDel.CreateEncryptor();
//返回加密后的密文
byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
return Convert.ToBase64String(resultArray, 0, resultArray.Length);
}
/// <summary>
/// ijndael解密算法
/// </summary>
/// <param name="pString">待解密的密文</param>
/// <param name="pKey">密钥,长度可以为:64位(byte[8]),128位(byte[16]),192位(byte[24]),256位(byte[32])</param>
/// <param name="iv">iv向量,长度为128(byte[16])</param>
/// <returns></returns>
private static String RijndaelDecrypt(string pString, string pKey)
{
//解密密钥
byte[] keyArray = UTF8Encoding.UTF8.GetBytes(pKey);
//待解密密文数组
byte[] toEncryptArray = Convert.FromBase64String(pString);
//Rijndael解密算法
RijndaelManaged rDel = new RijndaelManaged();
rDel.Key = keyArray;
rDel.Mode = CipherMode.ECB;
rDel.Padding = PaddingMode.PKCS7;
ICryptoTransform cTransform = rDel.CreateDecryptor();
//返回解密后的明文
byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
return UTF8Encoding.UTF8.GetString(resultArray);
}
class MyData {
public int age;
public string name;
}
}