Unity3D教程宝典之两步实现超实用的XML存档

两步实现超实用的XML存档

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

脚本下载地址

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




PS:风宇冲自己的U3d单机游戏和公司的单机游戏都用的这个XML存档,iOS,Android,PC,MAC都使用过的。放心使用吧。密钥的设定根据平台而定。

附:脚本代码
GameDataManager.cs的内容
  1. //=========================================================================================================
  2. //Note: Data Managing.
  3. //Date Created: 2012/04/17 by 风宇冲
  4. //Date Modified: 2012/12/14 by 风宇冲
  5. //=========================================================================================================
  6. using UnityEngine;
  7. using System.Collections;
  8. using System.IO;
  9. using System.Collections.Generic;
  10. using System;
  11. using System.Text;
  12. using System.Xml;
  13. using System.Security.Cryptography;
  14. //GameData,储存数据的类,把需要储存的数据定义在GameData之内就行//
  15. public class GameData
  16. {
  17. //密钥,用于防止拷贝存档//
  18. publicstring key;
  19. //下面是添加需要储存的内容//
  20. publicstring PlayerName;
  21. publicfloat MusicVolume;
  22. publicGameData()
  23. {
  24. PlayerName ="Player";
  25. MusicVolume= 0.6f;
  26. }
  27. }
  28. //管理数据储存的类//
  29. public class GameDataManager:MonoBehaviour
  30. {
  31. privatestring dataFileName ="tankyWarData.dat";//存档文件的名称,自己定//
  32. private XmlSaver xs = new XmlSaver();
  33. public GameData gameData;
  34. publicvoid Awake()
  35. {
  36. gameData =new GameData();
  37. //设定密钥,根据具体平台设定//
  38. gameData.key= SystemInfo.deviceUniqueIdentifier;
  39. Load();
  40. }
  41. //存档时调用的函数//
  42. public void Save()
  43. {
  44. stringgameDataFile = GetDataPath() + "/"+dataFileName;
  45. stringdataString= xs.SerializeObject(gameData,typeof(GameData));
  46. xs.CreateXML(gameDataFile,dataString);
  47. }
  48. //读档时调用的函数//
  49. public void Load()
  50. {
  51. stringgameDataFile = GetDataPath() + "/"+dataFileName;
  52. if(xs.hasFile(gameDataFile))
  53. {
  54. string dataString =xs.LoadXML(gameDataFile);
  55. GameData gameDataFromXML =xs.DeserializeObject(dataString,typeof(GameData)) as GameData;
  56. //是合法存档//
  57. if(gameDataFromXML.key == gameData.key)
  58. {
  59. gameData =gameDataFromXML;
  60. }
  61. //是非法拷贝存档//
  62. else
  63. {
  64. //留空:游戏启动后数据清零,存档后作弊档被自动覆盖//
  65. }
  66. }
  67. else
  68. {
  69. if(gameData!= null)
  70. Save();
  71. }
  72. }
  73. //获取路径//
  74. privatestatic string GetDataPath()
  75. {
  76. // Your gamehas read+write access to/var/mobile/Applications/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX/Documents
  77. //Application.dataPath returnsar/mobile/Applications/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX/myappname.app/Data
  78. // Strip"/Data" from path
  79. if(Application.platform == RuntimePlatform.IPhonePlayer)
  80. {
  81. string path= Application.dataPath.Substring (0,Application.dataPath.Length -5);
  82. // Stripapplication name
  83. path =path.Substring(0,path.LastIndexOf('/'));
  84. return path+ "/Documents";
  85. }
  86. else
  87. // returnApplication.dataPath + "/Resources";
  88. returnApplication.dataPath;
  89. }
  90. }



XmlSaver.cs的内容
  1. //=========================================================================================================
  2. //Note: XML processcing, can not savemultiple-array!!!
  3. //Date Created: 2012/04/17 by 风宇冲
  4. //Date Modified: 2012/04/19 by 风宇冲
  5. //=========================================================================================================
  6. using UnityEngine;
  7. using System.Collections;
  8. using System.Xml;
  9. using System.Xml.Serialization;
  10. using System.IO;
  11. using System.Text;
  12. using System.Security.Cryptography;
  13. using System;
  14. public class XmlSaver
  15. {
  16. //内容加密
  17. publicstring Encrypt(string toE)
  18. {
  19. //加密和解密采用相同的key,具体自己填,但是必须为32位//
  20. byte[]keyArray =UTF8Encoding.UTF8.GetBytes("12348578902223367877723456789012");
  21. RijndaelManaged rDel = new RijndaelManaged();
  22. rDel.Key =keyArray;
  23. rDel.Mode =CipherMode.ECB;
  24. rDel.Padding= PaddingMode.PKCS7;
  25. ICryptoTransform cTransform = rDel.CreateEncryptor();
  26. byte[]toEncryptArray = UTF8Encoding.UTF8.GetBytes(toE);
  27. byte[]resultArray =cTransform.TransformFinalBlock(toEncryptArray,toEncryptArray.Length);
  28. returnConvert.ToBase64String(resultArray,resultArray.Length);
  29. }
  30. //内容解密
  31. publicstring Decrypt(string toD)
  32. {
  33. //加密和解密采用相同的key,具体值自己填,但是必须为32位//
  34. byte[]keyArray =UTF8Encoding.UTF8.GetBytes("12348578902223367877723456789012");
  35. RijndaelManaged rDel = new RijndaelManaged();
  36. rDel.Key =keyArray;
  37. rDel.Mode =CipherMode.ECB;
  38. rDel.Padding= PaddingMode.PKCS7;
  39. ICryptoTransform cTransform = rDel.CreateDecryptor();
  40. byte[]toEncryptArray = Convert.FromBase64String(toD);
  41. byte[]resultArray =cTransform.TransformFinalBlock(toEncryptArray,toEncryptArray.Length);
  42. returnUTF8Encoding.UTF8.GetString(resultArray);
  43. }
  44. publicstring SerializeObject(object pObject,System.Type ty)
  45. {
  46. stringXmlizedString = null;
  47. MemoryStreammemoryStream = new MemoryStream();
  48. XmlSerializerxs = new XmlSerializer(ty);
  49. XmlTextWriterxmlTextWriter = new XmlTextWriter(memoryStream,Encoding.UTF8);
  50. xs.Serialize(xmlTextWriter,pObject);
  51. memoryStream =(MemoryStream)xmlTextWriter.BaseStream;
  52. XmlizedString =UTF8ByteArrayToString(memoryStream.ToArray());
  53. return XmlizedString;
  54. }
  55. publicobject DeserializeObject(string pXmlizedString,System.Typety)
  56. {
  57. XmlSerializerxs = new XmlSerializer(ty);
  58. MemoryStreammemoryStream = newMemoryStream(StringToUTF8ByteArray(pXmlizedString));
  59. XmlTextWriterxmlTextWriter = newXmlTextWriter(memoryStream,Encoding.UTF8);
  60. returnxs.Deserialize(memoryStream);
  61. }
  62. //创建XML文件
  63. publicvoid CreateXML(string fileName,string thisData)
  64. {
  65. string xxx =Encrypt(thisData);
  66. StreamWriter writer;
  67. writer =File.CreateText(fileName);
  68. writer.Write(xxx);
  69. writer.Close();
  70. }
  71. //读取XML文件
  72. publicstring LoadXML(string fileName)
  73. {
  74. StreamReader sReader =File.OpenText(fileName);
  75. string dataString =sReader.ReadToEnd();
  76. sReader.Close();
  77. string xxx =Decrypt(dataString);
  78. return xxx;
  79. }
  80. //判断是否存在文件
  81. publicbool hasFile(String fileName)
  82. {
  83. returnFile.Exists(fileName);
  84. }
  85. publicstring UTF8ByteArrayToString(byte[] characters)
  86. {
  87. UTF8Encodingencoding = new UTF8Encoding();
  88. stringconstructedString =encoding.GetString(characters);
  89. return(constructedString);
  90. }
  91. publicbyte[] StringToUTF8ByteArray(String pXmlString )
  92. {
  93. UTF8Encodingencoding = new UTF8Encoding();
  94. byte[]byteArray = encoding.GetBytes(pXmlString);
  95. return byteArray;
  96. }
  97. }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


这篇文章将为大家详细讲解有关Unity3D中如何通过Animator动画状态机获取任意animation clip的准确播放持续时长,小编觉得挺实用的,因此分享给大家做个参考,
这篇文章主要介绍了Unity3D如何播放游戏视频,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解
这篇文章给大家分享的是有关Unity3D各平台路径是什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1、Resources路径 Reso...
小编给大家分享一下Unity3D如何实现移动平台上的角色阴影,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!由于目前主流使用Unity3.x在移动平...
如何解析基于Unity3D的平坦四叉树地形与Virtual Texture的分析,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希
这篇文章主要介绍Unity3D如何实现动态分辨率降低渲染开销,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!之前项目降低分辨率我们都普...
这篇文章主要介绍了unity3d中如何使用屏幕空间改善shadowmap漏光,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编...
这篇文章主要介绍unity3d如何实现基于屏幕空间的描边,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Outline(Based on Image Space)由...
这篇文章给大家分享的是有关unity3d中导入fbx时的Scale是什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。在Unity中点击GameOb...
这篇文章主要为大家展示了“unity3d中如何实现ttc转ttf及制作字体”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习
这篇文章主要介绍了unity3d中水彩风渲染有什么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了...
这篇文章将为大家详细讲解有关unity3d中图像压缩原理是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1 图像可压缩...
这篇文章给大家分享的是有关unity3d中光照公式有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。漫反射、高光、物理渲染(PBR...
小编给大家分享一下unity3d中光照探针的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我...
这篇文章将为大家详细讲解有关Unity3D中Rendering Paths及LightMode的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有
这篇文章将为大家详细讲解有关unity3d中图形学的光照原理是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。首先,在...
这篇文章给大家分享的是有关unity3d中图片渲染流程是什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。相关名词GPU(Graphic Pr...
本篇我们来介绍一下左侧工具栏中基本绘制的应用。 一、墙体绘制直墙 & 矩形墙绘制墙体时,可以看到上方的工具栏中对墙体进行参数的设定。 弧形墙在建筑版的户...
xlua是由腾讯维护的一个开源项目,我们可以在github上下载这个开源项目并查看一些相关文档官网:https://github.com/Tencent/xLua配置文档:https://github.com/Tencent/xLua/blob/master/Assets/XLua/Doc/hotfix.md常见问题解答:https://github.com/Tencent/xLua/blob/master/Assets/
我们都知道,一个三维场景的画面的好坏,百分之四十取决于模型,百分之六十取决于贴图,可见贴图在画面中所占的重要性。在这里我将列举一些贴图,并且初步阐述其概念,理解原理的基础上制作贴图,也就顺手多了。我在这里主要列举几种UNITY3D中常用的贴图,与大家分享,希望对大家有帮助。01 首先