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)数据对象:

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());
}
时间: 2024-08-11 03:36:57

Unity游戏数据用Json保存的相关文章

Unity本地数据存储---Sqlite和JSON

2014-04-30更新 剔除了使用网络上烂大街的SQLite使用方法(原因android下无法读取数据),使用libSQLite3.so,通过DLLImport,在C#代码里直接调用C接口 这种原生调用SQLite的方式,我在pc.android上亲测无误,ios没测过,但是stackoverflow上有兄弟试过,没问题.园子的朋友如果可以测IOS的,欢迎提供结果 基本思路,游戏基础配置数据,比如怪物的属性.装备模板属性.关卡怪物等,使用SQLite(Unity插件SQLiteUnityKit

C# Unity游戏开发——Excel中的数据是如何到游戏中的 (二)

本帖是延续的:C# Unity游戏开发——Excel中的数据是如何到游戏中的 (一) 上个帖子主要是讲了如何读取Excel,本帖主要是讲述读取的Excel数据是如何序列化成二进制的,考虑到现在在手游中应用很广泛的序列化技术Google的ProtoBuf,所以本文也是按照ProtoBuf的方式来操作的.ProtoBuf是一个开源库,简单来说ProtoBuf就是一个能使序列化的数据变得更小的类库,当然这里指的更小是相对的.好了ProtBuf的东西就不在多说,以后会专门写一篇帖子的.本帖其实就相当于上

C# Unity游戏开发——Excel中的数据是如何到游戏中的 (三)

本帖是延续的:C# Unity游戏开发——Excel中的数据是如何到游戏中的 (二) 前几天有点事情所以没有继续更新,今天我们接着说.上个帖子中我们看到已经把Excel数据生成了.bin的文件,不过其实这样到游戏中还是不能用的.主要有两个方面,1.bin文件的后缀使我们随便取的名字,但是这种文件Unity不买账.因为Unity中的二进制文件必须是以.bytes命名的.2.在写文件之前其实还可以对二进制进行压缩,这样可以最大化节省设备空间.也就是说我们在生成数据实例后还需要做以下几件事:序列化 -

C#开发Unity游戏教程之游戏对象的属性变量

C#开发Unity游戏教程之游戏对象的属性变量 Unity游戏对象的属性--变量 通过对上一章的学习,读者应该了解到了,游戏对象上的属性与脚本中的变量,建立联系的方式就是将脚本赋予游戏对象.上一章仅仅是简单的介绍了脚本中的变量,读者一定只是瘾,如今好了.作者将使用一整章的篇幅介绍变量与属性. Unity游戏对象的属性 在Unity中.游戏场景中游戏对象的属性,能够在Inspector视图里查看,想看哪个游戏对象的属性.就使用鼠标选中哪个游戏对象就可以. 比如,要查看游戏场景中Main Camer

unity中数据的持久化存储

unity 提供了PlayerPrefs这个类用于存储游戏数据到电脑硬盘中. 这个类有10个函数可以使用 Class Functions类函数 SetInt Sets the value of the preference identified by key.设置由key确定的参数值. GetInt Returns the value corresponding to key in the preference file if it exists.如果存在,返回偏好文件中key对应的值. Set

Unity游戏开发实战视频教程

Unity客户端架构设计与网络游戏关键技术(Avatar,热更新,Protobuf)课程分类:游戏开发适合人群:中级课时数量:20(42节)课时用到技术:Unity客户端,UI设计框架,Avatar换装,Protobuf-net等涉及项目:搭建Unity客户端 UI设计框架以及Avatar换装和移动端热更新技术实现以及Protobuf-net在Unity中运用咨询qq:1840215592 课程介绍:1.课程研发环境开发工具:Unity4.6和VS20082.内容简介本课程内容详细介绍了如何实现

【Unity游戏开发】用C#和Lua实现Unity中的事件分发机制EventDispatcher

一.简介 最近马三换了一家大公司工作,公司制度规范了一些,因此平时的业余时间多了不少.但是人却懒了下来,最近这一个月都没怎么研究新技术,博客写得也是拖拖拉拉,周六周天就躺尸在家看帖子.看小说,要么就是吃鸡,唉!真是罪过罪过.希望能从这篇博客开始有些改善吧,尽量少玩耍,还是多学习吧~ 好了扯得有点远了,来说说我们今天博客的主题——“用C#和Lua实现Unity中的事件分发机制”,事件分发机制或者叫事件监听派发系统,在每个游戏框架中都是不可或缺的一个模块.我们可以用它来解耦,监听网络消息,或者做一些

Unity优化方向——优化Unity游戏中的垃圾回收

介绍 当我们的游戏运行时,它使用内存来存储数据.当不再需要该数据时,存储该数据的内存将被释放,以便可以重用.垃圾是用来存储数据但不再使用的内存的术语.垃圾回收是该内存再次可用以进行重用的进程的名称. Unity使用垃圾回收作为管理内存的一部分.如果垃圾回收发生得太频繁或者有太多工作要做,我们的游戏可能会表现不佳,这意味着垃圾回收是导致性能问题的常见原因. 在本文中,我们将了解垃圾回收如何工作的,什么时候发生垃圾回收,以及如何有效地使用内存,从而最小化垃圾回收对游戏的影响. 诊断垃圾回收的问题 垃

unity持久化数据之Excel

tags: unity,unity excel,unity持久化数据 grammar_cjkRuby: true --- unity持久化数据之Excel 第三方库 EPPlus:https://github.com/JanKallman/EPPlus 读取 using OfficeOpenXml; using UnityEditor; .... .... [MenuItem("Excel/Load Excel")] static void LoadExcel() { string p