(一)关于路径

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, , 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, , 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"] = ;
jsa.Add(jso);
Debug.LogError(jsa.ToString());
}


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

  1. Python中的文件处理和数据存储json

    前言:每当需要分析或修改存储在文件中的信息时,读取文件都很有用,对数据分析应用程序来说尤其如此. 例如,你可以编写一个这样的程序:读取一个文本文件的内容,重新设置这些数据的格式并将其写入文件,让浏览器 ...

  2. unity 通过JsonUtility实现json数据的本地保存和读取

    本文主要讲解json数据在本地的保存和读取,使用的是unity5之后提供的JsonUtility工具. 一.关于json数据的保存 在实际开发中,有时候可能涉及到大量数据保存到本地,以便于下次客户端的 ...

  3. EasyUI使用JSON保存数据

    目前来说,使用JSON保存数据比较方便,前台可以不用Test.aspx 页面,可以直接用Html页面,使用.aspx页面的弊端就不在这里熬述. 具体步骤如下: 1.新建一个Html页面,命名为Test ...

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

    本帖是延续的:C# Unity游戏开发——Excel中的数据是如何到游戏中的 (一) 上个帖子主要是讲了如何读取Excel,本帖主要是讲述读取的Excel数据是如何序列化成二进制的,考虑到现在在手游中 ...

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

    本帖是延续的:C# Unity游戏开发——Excel中的数据是如何到游戏中的 (二) 前几天有点事情所以没有继续更新,今天我们接着说.上个帖子中我们看到已经把Excel数据生成了.bin的文件,不过其 ...

  6. C# Unity游戏开发——Excel中的数据是如何到游戏中的 (四)2018.4.3更新

    本帖是延续的:C# Unity游戏开发--Excel中的数据是如何到游戏中的 (三) 最近项目不算太忙,终于有时间更新博客了.关于数据处理这个主题前面的(一)(二)(三)基本上算是一个完整的静态数据处 ...

  7. C# 结构体和List<T>类型数据转Json数据保存和读取

    C#  结构体和List<T>类型数据转Json数据保存和读取 一.结构体转Json public struct FaceLibrary { public string face_name ...

  8. Unity 3D 之通过序列化来存档游戏数据

    我们在使用u3d开发一些单机游戏的过程中,都会涉及到游戏数据的存单和加载.一般情况下,如果存储的数据不复杂,我们就可以用PlayerPrefs,但有时涉及到的数据更加复杂,使用PlayerPrefs难 ...

  9. unity中数据的持久化存储

    unity 提供了PlayerPrefs这个类用于存储游戏数据到电脑硬盘中. 这个类有10个函数可以使用 Class Functions类函数 SetInt Sets the value of the ...

随机推荐

  1. Kafka 消息存储及检索(作者:杜亦舒)

    Kafka 消息存储及检索 原创 2016-02-29 杜亦舒 性能与架构 Kafka是一个分布式的消息队列系统,消息存储在集群服务器的硬盘Kafka中可以创建多个消息队列,称为topic,消息的生产 ...

  2. git tag推送小分析

    一个推送可以用三条命令 -[deleted]-git push origin --tags git push origin master --follow-tags git push --follow ...

  3. HMM隐马尔科夫模型

    这是一个非常重要的模型,凡是学统计学.机器学习.数据挖掘的人都应该彻底搞懂. python包: hmmlearn 0.2.0 https://github.com/hmmlearn/hmmlearn ...

  4. 比对工具之 BWA 使用方法

    BWA算法简介: BWA-bactrack BWA-SW BWA-MEM BWA安装: # installing BWA .tar.bz2 -C /opt/biosoft/ cd /opt/bioso ...

  5. Eclipse 配置Tomcat

    1.Eclipse EE 配置Tomcat Eclipse EE 主要用于Java Web开发和J2EE项目开发.Eclipse EE中配置Tomcat比较简单,新建一个Tomcat Server即可 ...

  6. CentOS报错:Could not retrieve mirrorlist http://mirrorlist.centos.org/?release=7&arch=x86_64&repo=os&infra=stock32 error was 14: curl#6 - "Could not resolve host: mirrorlist.centos.org; Unknown error"

    今天安装完带图形界面的CentOS 7后,在Terminal中运行yum安装命令时报了以下错误: Could not retrieve mirrorlist http://mirrorlist.cen ...

  7. python中cPickle的用法

    import cPickle as p f = file('data.txt' , 'w') data = (1 , 'A' , "hello") p.dump(data , f) ...

  8. hdu 1695 GCD(莫比乌斯反演)

    GCD Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

  9. IOS开发设计思路

    我在做 iOS 开发的时候,发现自己在写程序的时候,常常处于两种状态的切换,我把这两种状态称为软件开发的上帝模式与农民模式.我先给大家介绍一下这两种模式的特点. 上帝模式 处于上帝模式时,我需要构思整 ...

  10. 数据库索引<一> 索引结构表结构

    有很长时间没有更新博客了,再过几天都2月分了,如果再不更新一篇,我1月分都没有更新,保持连续,今天更新一篇. 最近没有什么看技术方面的东西,游戏,画画搞这些去了.我发现我每年一到年底就是搞这些东西,其 ...