博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Unity游戏数据用Json保存
阅读量:4940 次
发布时间:2019-06-11

本文共 4544 字,大约阅读时间需要 15 分钟。

(一)关于路径

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 下载地址  , 只要把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
(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());}

 

 

 

转载于:https://www.cnblogs.com/July7th/p/4808095.html

你可能感兴趣的文章
Add Two Numbers
查看>>
红楼梦主要人物及其命运结局
查看>>
<大话数据结构>读书笔记 第一章绪论 逻辑结构与物理结构
查看>>
实验10:Problem C: STL——呵呵型自动机
查看>>
IPhone微信H5用Video标签播放不了视频
查看>>
北风网视频菜单4
查看>>
洛谷 P1705 爱与愁过火
查看>>
[CF660C]Hard Process(尺取法)
查看>>
新建maven web后controller不能被扫描到
查看>>
Forking AfterBurn into Maya
查看>>
AMD规范
查看>>
Control.Invoke和Control.BeginInvoke简述
查看>>
Oracle的物化视图
查看>>
SHGetSpecialFolderPath用法
查看>>
QPainter绘制图片填充方式(正常大小、剪切大小、自适应大小、平铺)
查看>>
MEP风管对齐方式
查看>>
Android解析XML之SAX解析器
查看>>
Caused by: java.util.zip.ZipException: invalid LOC header (bad signature)
查看>>
学习笔记ResNet
查看>>
神奇的 Object.defineProperty
查看>>