转自:http://blog.sina.com.cn/s/blog_471132920101d3kh.html

两步实现超实用的XML存档

本套存档的优点:易使用,跨平台,防作弊(内容加密 + 防拷贝)

脚本下载地址

使用方法非常简单:
把GameDataManager和XmlSaver两个脚本添加至工程后
(1)新建一个GameObject,起名GameDataManager并将GameDataManager脚本拖到上面。
(2)在GameDataManager里的GameData类中添加需要储存的数据
OK,跨平台防破解防拷贝的存档就搞定了!之后每次存档调用GameDataManager的Save函数,读档调用GameDataManager的Load函数。每次启动后GameDataManager会自动调用Load读档。如果玩家拿外来存档来覆盖本地存档,则游戏启动后数据清零,任何一次存档后作弊档被自动覆盖。注意:请勿放入二维以上数组,一般一维数据,枚举,自定义类等等数据类型可放心添加。

iOS,Android,PC,MAC都使用过的。密钥的设定根据平台而定。

GameDataManager.cs的内容

//=========================================================================================================
//Note: Data Managing.
//Date Created: 2012/04/17 by 风宇冲
//Date Modified: 2012/12/14 by 风宇冲
//========================================================================================================= using UnityEngine;
using System.Collections;
using System.IO;
using System.Collections.Generic;
using System;
using System.Text;
using System.Xml;
using System.Security.Cryptography;
//GameData,储存数据的类,把需要储存的数据定义在GameData之内就行// public class GameData
{ //密钥,用于防止拷贝存档// public string key; //下面是添加需要储存的内容// public string PlayerName; public float MusicVolume; public GameData() { PlayerName = "Player"; MusicVolume = 0.6f; }
}
//管理数据储存的类// public class GameDataManager:MonoBehaviour
{ private string dataFileName ="tankyWarData.dat";//存档文件的名称,自己定// private  XmlSaver xs = new XmlSaver(); public  GameData gameData; public void Awake() { gameData = new GameData(); //设定密钥,根据具体平台设定// gameData.key = SystemInfo.deviceUniqueIdentifier; Load(); } //存档时调用的函数// public  void Save() { string gameDataFile = GetDataPath() + "/"+dataFileName; string dataString= xs.SerializeObject(gameData,typeof(GameData)); xs.CreateXML(gameDataFile,dataString); } //读档时调用的函数// public  void Load() { string gameDataFile = GetDataPath() + "/"+dataFileName; if(xs.hasFile(gameDataFile)) { string dataString = xs.LoadXML(gameDataFile); GameData gameDataFromXML = xs.DeserializeObject(dataString,typeof(GameData)) as GameData; //是合法存档// if(gameDataFromXML.key == gameData.key) { gameData = gameDataFromXML; } //是非法拷贝存档// else { //留空:游戏启动后数据清零,存档后作弊档被自动覆盖//             } } else { if(gameData != null) Save(); } } //获取路径// private static string GetDataPath() { // Your game has read+write access to /var/mobile/Applications/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX/Documents // Application.dataPath returns ar/mobile/Applications/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX/myappname.app/Data              // Strip "/Data" from path if(Application.platform == RuntimePlatform.IPhonePlayer) { string path = Application.dataPath.Substring (0, Application.dataPath.Length - 5); // Strip application name path = path.Substring(0, path.LastIndexOf('/'));  return path + "/Documents"; } else //    return Application.dataPath + "/Resources"; return Application.dataPath; }
}

XmlSaver.cs

//=========================================================================================================
//Note: XML processcing,  can not save multiple-array!!!
//Date Created: 2012/04/17 by 风宇冲
//Date Modified: 2012/04/19 by 风宇冲
//========================================================================================================= using UnityEngine;
using System.Collections;
using System.Xml;
using System.Xml.Serialization;
using System.IO;
using System.Text;
using System.Security.Cryptography;
using System;
public class XmlSaver
{    //内容加密 public string Encrypt(string toE) { //加密和解密采用相同的key,具体自己填,但是必须为32位// byte[] keyArray = UTF8Encoding.UTF8.GetBytes("12348578902223367877723456789012"); RijndaelManaged rDel = new RijndaelManaged(); rDel.Key = keyArray; rDel.Mode = CipherMode.ECB; rDel.Padding = PaddingMode.PKCS7; ICryptoTransform cTransform = rDel.CreateEncryptor(); byte[] toEncryptArray = UTF8Encoding.UTF8.GetBytes(toE); byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray,0,toEncryptArray.Length); return Convert.ToBase64String(resultArray,0,resultArray.Length); } //内容解密 public string Decrypt(string toD) { //加密和解密采用相同的key,具体值自己填,但是必须为32位// byte[] keyArray = UTF8Encoding.UTF8.GetBytes("12348578902223367877723456789012"); RijndaelManaged rDel = new RijndaelManaged(); rDel.Key = keyArray; rDel.Mode = CipherMode.ECB; rDel.Padding = PaddingMode.PKCS7; ICryptoTransform cTransform = rDel.CreateDecryptor(); byte[] toEncryptArray = Convert.FromBase64String(toD); byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray,0,toEncryptArray.Length); return UTF8Encoding.UTF8.GetString(resultArray); } public string SerializeObject(object pObject,System.Type ty) { string XmlizedString   = null; MemoryStream memoryStream  = new MemoryStream(); XmlSerializer xs  = new XmlSerializer(ty); XmlTextWriter xmlTextWriter  = new XmlTextWriter(memoryStream, Encoding.UTF8); xs.Serialize(xmlTextWriter, pObject); memoryStream = (MemoryStream)xmlTextWriter.BaseStream; XmlizedString = UTF8ByteArrayToString(memoryStream.ToArray()); return XmlizedString; } public object DeserializeObject(string pXmlizedString , System.Type ty) { XmlSerializer xs  = new XmlSerializer(ty); MemoryStream memoryStream  = new MemoryStream(StringToUTF8ByteArray(pXmlizedString)); XmlTextWriter xmlTextWriter   = new XmlTextWriter(memoryStream, Encoding.UTF8); return xs.Deserialize(memoryStream); } //创建XML文件 public void CreateXML(string fileName,string thisData) { string xxx = Encrypt(thisData); StreamWriter writer; writer = File.CreateText(fileName); writer.Write(xxx); writer.Close(); } //读取XML文件 public string LoadXML(string fileName) { StreamReader sReader = File.OpenText(fileName); string dataString = sReader.ReadToEnd(); sReader.Close(); string xxx = Decrypt(dataString); return xxx; } //判断是否存在文件 public bool hasFile(String fileName) { return File.Exists(fileName); } public string UTF8ByteArrayToString(byte[] characters  ) {     UTF8Encoding encoding  = new UTF8Encoding(); string constructedString  = encoding.GetString(characters); return (constructedString); } public byte[] StringToUTF8ByteArray(String pXmlString ) { UTF8Encoding encoding  = new UTF8Encoding(); byte[] byteArray  = encoding.GetBytes(pXmlString); return byteArray; }
}

转载于:https://blog.51cto.com/568464209/1734375

U3D教程宝典之两步实现超实用的XML存档相关推荐

  1. c# 打开的窗口显示在最前面_通达信显示《同花顺,东方财富》F10步骤,两步实现,切换自如...

    大家好,目前主要流行的三大看盘软件:同花顺.东方财富.通达信都有各自的优缺点,本期给大家带来如何在通达信系统显示同花顺及东方财富F10的教程步骤,两步实现,切换自如,优缺点互补,让大家能够更加稳定的进 ...

  2. 成功解决wps文档的论文中插入图片时只显示一半图片(两步教程完美搞定!)

    成功解决wps文档的论文中插入图片时只显示一半图片(两步教程完美搞定!) 目录 解决问题 解决思路 解决方法 解决问题 解决wps文档的论文中插入图片时只显示一半图片,如图所示, 解决

  3. Endnote教程 : 仅需两步,一键转化参考文献为纯文本

    在投稿时遇到这样的一个问题,就是编辑会要求他提交一份纯文本或去除域代码格式的稿件,今天子聿就教大家如何一键去除文章中所有域代码,只需两步,即可得到纯文本格式的word稿件. 操作步骤 1. 建议在去除 ...

  4. 两步路轨迹文件位置_两步路图源文件技术说明与制作教程

    下文的阅读需要一定的代码方面的基础,但胜在浅显易懂. 重要知识1:两步路的图源文件的后缀为.xms. 重要知识2:点击两步路图源文件,选择用两步路户外助手打开,按照提示就能够完成导入. 重要知识3:一 ...

  5. 2Unity3D教程宝典之插件篇:Unity3D插件详细评测及教学下载

    转载自风宇冲Unity3D教程学院 http://blog.sina.com.cn/s/blog_471132920101crh3.html 引言:想用Unity3D制作优秀的游戏,插件是必不可少的. ...

  6. 【风宇冲】Unity3D教程宝典之插件篇:Unity3D插件详细评测及教学下载

    [风宇冲]Unity3D教程宝典之插件篇:Unity3D插件详细评测及教学下载 (2012-12-09 07:27:51) 转载▼ 标签: unity3d unity unity3d教程 unity3 ...

  7. 【风宇冲】Unity3D教程宝典…

    最近在做关键帧定制插值的动画,楼楼写的很有帮助~ 原文地址:[风宇冲]Unity3D教程宝典之 AnimationCurve作者:风宇冲 原创文章如需转载请注明:转载自风宇冲Unity3D教程学院   ...

  8. maven3.6.3 配置环境变量_JDK1.8简单配置环境变量---两步曲

    原文:JDK1.8简单配置环境变量---两步曲 - 云+社区 - 腾讯云 作者: 沁溪源 鄙人最近重新装完系统之后,在安装和配置jdk1.8的时候,发现网上许多教程配置jdk环境变量时都还在沿用传统的 ...

  9. 服务器存储满了进不去系统,解决PC常见问题 篇四十五:建议收藏!手贱升级进不去系统?两步简单恢复黑群晖!...

    解决PC常见问题 篇四十五:建议收藏!手贱升级进不去系统?两步简单恢复黑群晖! 2021-07-19 16:40:32 47点赞 302收藏 15评论 创作立场声明:本文属于原创文章,无任何利益关系, ...

  10. 只需两步快速获取微信小程序源码

    第一次在掘金这样高大上的社区写文章,忐忑地敲下我获取小程序源码过程中的经验分享. 最近在学习微信小程序开发,半个月学习下来,很想实战一下踩踩坑,于是就仿写了某个小程序的前端实现,过程一言难尽,差不多两 ...

最新文章

  1. python3和Python2的区别
  2. Linux环境下路由表配置一
  3. System.Web
  4. 使用非常驻任务管理事件
  5. python交互式程序设计导论第二周_沧州学堂云Python 交互式程序设计导论搜题公众号...
  6. LTRIM、RTRIM和TRIM在ORACLE中的用法:
  7. php mysql修复_MySQL数据表损坏的巧妙修复
  8. 标准C程序设计七---77
  9. 计算机网络——基本介绍
  10. ecs 云服务器 管理控制台_阿里云ECS服务器监控资源使用情况
  11. java 正则 pattern 线程安全_(一)Java Pattern类----java正则
  12. 虚拟机上的linux里安装ngnix,虚拟机(linux)下安装nginx的步骤教程
  13. Digilent提供的PmodOLEDrgb驱动程序
  14. js运算符优先级速查表
  15. Android开机自启动服务的写法
  16. vue+websocket+nodejs实现聊天室 -一对多、一对一聊天
  17. pyspark 读mysql数据_spark读mysql数据
  18. 如何更好的保护个人信息
  19. python基于PHP+MySQL的药店药品进销存管理系统
  20. php微信获取素材列表,20.6.7 获取素材列表

热门文章

  1. linux新建用户和目录权限设置密码,用户创建及权限管理
  2. php中的implode,php implode函数 多维数组
  3. 麻将胡牌算法的Java实现
  4. 还在用 Guava Cache?它才是 Java 本地缓存之王!
  5. 动态范围Bitmap的参考实现
  6. 一款 Windows 上的万能工具 Wox
  7. 微信接口昵称在服务器乱码,微信网页开发获取用户昵称乱码 微信昵称包含emoji表情乱码的解决方案...
  8. 游戏服务端框架之配置与玩家数据库设计
  9. Sky Blue And Black
  10. python标准库calendar判断年份是闰年和平年