zoukankan      html  css  js  c++  java
  • U3D教程宝典之两步实现超实用的XML存档

    两步实现超实用的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; 
        } 
    } 

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

  • 相关阅读:
    c#,简单的冒泡排序
    uwp,c#,listView与gridView列表控件进阶
    使用gensim之KeyedVectors操作词向量模型
    python时间戳
    通过Python查找目录下含有指定字符串的所有文件
    聚类之DBSCAN
    使用pyhanlp进行分词
    将Python对象和变量保存在本地
    通过selenium进行博客备份
    matplotlib颜色代码
  • 原文地址:https://www.cnblogs.com/softimagewht/p/3888757.html
Copyright © 2011-2022 走看看