U3D教程宝典之两步实现超实用的XML存档
转自: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存档相关推荐
- c# 打开的窗口显示在最前面_通达信显示《同花顺,东方财富》F10步骤,两步实现,切换自如...
大家好,目前主要流行的三大看盘软件:同花顺.东方财富.通达信都有各自的优缺点,本期给大家带来如何在通达信系统显示同花顺及东方财富F10的教程步骤,两步实现,切换自如,优缺点互补,让大家能够更加稳定的进 ...
- 成功解决wps文档的论文中插入图片时只显示一半图片(两步教程完美搞定!)
成功解决wps文档的论文中插入图片时只显示一半图片(两步教程完美搞定!) 目录 解决问题 解决思路 解决方法 解决问题 解决wps文档的论文中插入图片时只显示一半图片,如图所示, 解决
- Endnote教程 : 仅需两步,一键转化参考文献为纯文本
在投稿时遇到这样的一个问题,就是编辑会要求他提交一份纯文本或去除域代码格式的稿件,今天子聿就教大家如何一键去除文章中所有域代码,只需两步,即可得到纯文本格式的word稿件. 操作步骤 1. 建议在去除 ...
- 两步路轨迹文件位置_两步路图源文件技术说明与制作教程
下文的阅读需要一定的代码方面的基础,但胜在浅显易懂. 重要知识1:两步路的图源文件的后缀为.xms. 重要知识2:点击两步路图源文件,选择用两步路户外助手打开,按照提示就能够完成导入. 重要知识3:一 ...
- 2Unity3D教程宝典之插件篇:Unity3D插件详细评测及教学下载
转载自风宇冲Unity3D教程学院 http://blog.sina.com.cn/s/blog_471132920101crh3.html 引言:想用Unity3D制作优秀的游戏,插件是必不可少的. ...
- 【风宇冲】Unity3D教程宝典之插件篇:Unity3D插件详细评测及教学下载
[风宇冲]Unity3D教程宝典之插件篇:Unity3D插件详细评测及教学下载 (2012-12-09 07:27:51) 转载▼ 标签: unity3d unity unity3d教程 unity3 ...
- 【风宇冲】Unity3D教程宝典…
最近在做关键帧定制插值的动画,楼楼写的很有帮助~ 原文地址:[风宇冲]Unity3D教程宝典之 AnimationCurve作者:风宇冲 原创文章如需转载请注明:转载自风宇冲Unity3D教程学院 ...
- maven3.6.3 配置环境变量_JDK1.8简单配置环境变量---两步曲
原文:JDK1.8简单配置环境变量---两步曲 - 云+社区 - 腾讯云 作者: 沁溪源 鄙人最近重新装完系统之后,在安装和配置jdk1.8的时候,发现网上许多教程配置jdk环境变量时都还在沿用传统的 ...
- 服务器存储满了进不去系统,解决PC常见问题 篇四十五:建议收藏!手贱升级进不去系统?两步简单恢复黑群晖!...
解决PC常见问题 篇四十五:建议收藏!手贱升级进不去系统?两步简单恢复黑群晖! 2021-07-19 16:40:32 47点赞 302收藏 15评论 创作立场声明:本文属于原创文章,无任何利益关系, ...
- 只需两步快速获取微信小程序源码
第一次在掘金这样高大上的社区写文章,忐忑地敲下我获取小程序源码过程中的经验分享. 最近在学习微信小程序开发,半个月学习下来,很想实战一下踩踩坑,于是就仿写了某个小程序的前端实现,过程一言难尽,差不多两 ...
最新文章
- python3和Python2的区别
- Linux环境下路由表配置一
- System.Web
- 使用非常驻任务管理事件
- python交互式程序设计导论第二周_沧州学堂云Python 交互式程序设计导论搜题公众号...
- LTRIM、RTRIM和TRIM在ORACLE中的用法:
- php mysql修复_MySQL数据表损坏的巧妙修复
- 标准C程序设计七---77
- 计算机网络——基本介绍
- ecs 云服务器 管理控制台_阿里云ECS服务器监控资源使用情况
- java 正则 pattern 线程安全_(一)Java Pattern类----java正则
- 虚拟机上的linux里安装ngnix,虚拟机(linux)下安装nginx的步骤教程
- Digilent提供的PmodOLEDrgb驱动程序
- js运算符优先级速查表
- Android开机自启动服务的写法
- vue+websocket+nodejs实现聊天室 -一对多、一对一聊天
- pyspark 读mysql数据_spark读mysql数据
- 如何更好的保护个人信息
- python基于PHP+MySQL的药店药品进销存管理系统
- php微信获取素材列表,20.6.7 获取素材列表
热门文章
- linux新建用户和目录权限设置密码,用户创建及权限管理
- php中的implode,php implode函数 多维数组
- 麻将胡牌算法的Java实现
- 还在用 Guava Cache?它才是 Java 本地缓存之王!
- 动态范围Bitmap的参考实现
- 一款 Windows 上的万能工具 Wox
- 微信接口昵称在服务器乱码,微信网页开发获取用户昵称乱码 微信昵称包含emoji表情乱码的解决方案...
- 游戏服务端框架之配置与玩家数据库设计
- Sky Blue And Black
- python标准库calendar判断年份是闰年和平年