zoukankan      html  css  js  c++  java
  • Unity游戏数据用Json保存

    (一)关于路径

    unity有几个关键的路径 

    (1).Application.dataPath 只读路径,就是工作目录的Assets路径

    (2).Application.streamingAssetsPath 只读路径,在pc可写,程序打包后里面的所有资源都原封不动的打到游戏包里面

    (3).Application.persistentDataPath 读写路径,pc端:C:/Users/用户名/AppData/LocalLow/公司名/包名/文件。 Android:Android/data/包名/file/文件 。 ios:ios8系统不允许访问,但是你还是可以程序读取写入,但是外部无法看到。

    从以上可以看出数据要保存读取,所有路径是用Application.persistentDataPath。

    (二)关于Json插件

    用于unity解析Json插件貌似有很多,这里列举几个比较常见的

    (1)LitJson 用的人很多,但是有一次本人在一次IOS手机上出现过无法预知的错误,百度后貌似也有人碰到过。

    (2)miniJson 很多项目中用到很多,本人倒是没用过,不过见过很多商业项目用这个。

    (3)SimpleJson 本人正在开发的项目中使用中,此次介绍也是使用这个插件。

    (4)SimpleJson 下载地址 https://github.com/facebook-csharp-sdk/simple-json , 只要把SimpleJson.cs下载放入工程即可。

    ()加密解密算法

    (1)使用C#自带的des算法,需要引入 

    using System.Security.Cryptography;

    ()代码示例

    (1)数据对象: (最近发现序列化的时候成员必须是 get set 的形式,不然会报错,原因不知)

    public class PlayerData 
    {
        public int gold { get; set ; }
        public int level { get; set; }
        public string name { get; set; }      
    }

    声明数据对象实例,用一个静态变量保存,使之在整个游戏过程都不会删除

    public class GlobalData 
    {
        public static PlayerData playerData = new PlayerData();
    }

    (2)数据读取和保存操作

    using UnityEngine;
    using System.Collections;
    using SimpleJson;
    
    public class PlayerDataStore
    {
        private static string fileName = "data.txt";
        private static string key = "this key";
    
        //游戏开始时加载;
        public static bool Reader()
        {
            string txt = Helper.ReadText(fileName);
            if (string.IsNullOrEmpty(txt))
            {
                GlobalData.playerData = new PlayerData();
                Debug.LogWarning("login first time.");
                return false;
            }
            txt = Helper.DecryptString(txt, key);
            GlobalData.playerData  = SimpleJson.SimpleJson.DeserializeObject<PlayerData>(txt);
            return true;
        }
    
        //游戏结束和数据改变的时候保存;
        public static bool Writer()
        {
            if (GlobalData.playerData == null)
            {
                return false;
            }
            string jsd = SimpleJson.SimpleJson.SerializeObject(GlobalData.playerData);
            jsd = Helper.EncryptString(jsd, key);
            return Helper.WriteText(fileName, jsd);
        }
    }

    (3)加密解密函数

    using System.Security.Cryptography;

    public
    class Helper { //加密; public static string EncryptString(string str, string key) { byte[] buffer; UTF8Encoding encoding = new UTF8Encoding(); MD5CryptoServiceProvider provider = new MD5CryptoServiceProvider(); byte[] buffer2 = provider.ComputeHash(encoding.GetBytes(key)); TripleDESCryptoServiceProvider provider2 = new TripleDESCryptoServiceProvider { Key = buffer2, Mode = CipherMode.ECB, Padding = PaddingMode.PKCS7 }; byte[] bytes = encoding.GetBytes(str); try { buffer = provider2.CreateEncryptor().TransformFinalBlock(bytes, 0, bytes.Length); } finally { provider2.Clear(); provider.Clear(); } return Convert.ToBase64String(buffer); } //解密; public static string DecryptString(string str, string key) { byte[] buffer; UTF8Encoding encoding = new UTF8Encoding(); MD5CryptoServiceProvider provider = new MD5CryptoServiceProvider(); byte[] buffer2 = provider.ComputeHash(encoding.GetBytes(key)); TripleDESCryptoServiceProvider provider2 = new TripleDESCryptoServiceProvider { Key = buffer2, Mode = CipherMode.ECB, Padding = PaddingMode.PKCS7 }; try { byte[] inputBuffer = Convert.FromBase64String(str); buffer = provider2.CreateDecryptor().TransformFinalBlock(inputBuffer, 0, inputBuffer.Length); } catch (Exception ex) { Debug.LogError("DecryptString failed. return empty string." + ex.Message); return ""; } finally { provider2.Clear(); provider.Clear(); } return encoding.GetString(buffer); } }

    (4)游戏结束或数据改变时保存

    public class SceneManager : MonoBehaviour
    {    
        void Start()
        {
            PlayerDataStore.Reader();
        }
       void OnDestroy()
        {
            if(PlayerDataStore.Writer()==false)
            {
                Debug.LogError("writer file failed.");
            }     
        }
    }    

    在移动平台就麻烦一点,因为移动平台难以捕获游戏关闭的回调,像Android杀死进程,或者是我Android太烂的缘故。这个时候就需要在数据一改变就执行一次保存,防止数据丢失。

    (5)SimpleJson的其他简单用法

    private void GameInit()
    {
        SimpleJson.JsonArray jsa = SimpleJson.SimpleJson.DeserializeObject("[]") as SimpleJson.JsonArray;
        SimpleJson.JsonObject jso = SimpleJson.SimpleJson.DeserializeObject("{}") as SimpleJson.JsonObject;
        jso["cc"] = "dd";
        jso["bb"] = 1;
        jsa.Add(jso);
        Debug.LogError(jsa.ToString());
    }


  • 相关阅读:
    rsync+inotify实现实时同步,自动触发同步文件
    Linux下实现Rsync目录同步备份
    零基础学python-16.2 作用域法则
    零基础学python-16.1 作用域快速入门
    零基础学python-15.4 函数的多态vs对象的多态
    零基础学python-15.3 函数的定义、调用与多态
    零基础学python-15.2 分解函数
    零基础学python-15.1 为什么需要编写函数
    零基础学python-14.3 python的文档资源:help函数
    零基础学python-14.2 python的文档资源:文档字符串
  • 原文地址:https://www.cnblogs.com/July7th/p/4808095.html
Copyright © 2011-2022 走看看