Unity本地数据存储---Sqlite和JSON
2014-05-04更新
SqliteDatabase.cs这个文件的初始方法有问题,具体是如果指定URL已经存在了DB文件,就不会重新覆盖DB文件。
这导致我们修改之后的DB文件无法产生效果。
本人的解决办法是在游戏启动的界面,通过对比本地的Resources目录下的文件A,和玩家核心数据B里面的数据库版本号,
如果A>B,则判定本地的DB文件版本较老,需要更新。
具体代码请到目录SQLite篇下下载
2014-04-30更新
剔除了使用网络上烂大街的SQLite使用方法(原因android下无法读取数据),使用libSQLite3.so,通过DLLImport,在C#代码里直接调用C接口
这种原生调用SQLite的方式,我在pc、android上亲测无误,ios没测过,但是stackoverflow上有兄弟试过,没问题。园子的朋友如果可以测IOS的,欢迎提供结果
基本思路,游戏基础配置数据,比如怪物的属性、装备模板属性、关卡怪物等,使用SQLite(Unity插件SQLiteUnityKit-GitHub地址,推荐客户端SQLite Expert Personal 3),管理方便
玩家核心数据(属性、装备、技能)使用JSON格式,加密保存在Application.persistentDataPath路径里,避免每次升级被覆盖
插件本地下载地址
准备工作
1 litJson.dll放在Plugins目录下
2 libsqlite3.so文件放到 Assets/Plugins/Android目录下
3 自定义的SQLite DB数据文件放到 Assets/StreamingAssets目录下
SQLite篇
将准备好的DB数据文件拷贝到Assets/StreamingAssets
把SQLiteUnityKit GitHub下载的压缩包里的 DataTable.cs、SqliteDatabase.cs,拷贝到项目中的任意位置
最终项目结构看起来是这样子的

SQLiteUnityKit框架用Dictionary数据结构模拟了DataTable,DataRow,因此我们执行查询语句的时候,返回的是DataTable,就像平时使用ado.net提供的查询模式一样。
调用方式
SqliteDatabase sqlDB = new SqliteDatabase(“config.db”);
string query = “INSERT INTO User(UserName) VALUES( ‘Santiago’)”;
sqlDB.ExecuteNonQuery(query);
我做了个unitypackge的例子,大家可以下载导入
Json篇
原先是使用XML格式来存储数据的,因为XML跨平台,但是Json同样也可以做到,加上有LitJson这个格式转化利器,因此,本地文件存储格式,本文以Json为例。
关于数据加密
使用c#提供的加密类即可,自己定义秘钥
using System.Security.Cryptography;
using System.Text; public class GlobalDataHelper
{
private const string DATA_ENCRYPT_KEY = "a234857890654c3678d77234567890O2";
private static RijndaelManaged _encryptAlgorithm = null; public static RijndaelManaged DataEncryptAlgorithm ()
{
_encryptAlgorithm = new RijndaelManaged ();
_encryptAlgorithm.Key = Encoding.UTF8.GetBytes (DATA_ENCRYPT_KEY);
_encryptAlgorithm.Mode = CipherMode.ECB;
_encryptAlgorithm.Padding = PaddingMode.PKCS7; return _encryptAlgorithm;
}
}
关于破解版软件
安卓机子上泛滥各种XXX破解版,关于破解版的问题,我们可以通过Unity提供的唯一机器ID,在写入玩家数据的时候,将其一并写入到数据中去,在读取数据之后,对比该ID和本机ID,如果不一致,则认为是破解版
SystemInfo.deviceUniqueIdentifier
本例子是以基础配置数据为例,因此代码中不提供该功能。
关于避免更新之后,玩家存档被覆盖
Unity提供了一个只读路径,放在该路径下的文件,不会被软件更新所影响。
Application.persistentDataPath
Json Helper类~~
using System.Security.Cryptography;
using System.Text;
using System;
using System.IO;
using LitJson; public class DataStoreProcessor
{ private static DataStoreProcessor _dataStoreProcessor = null; public static DataStoreProcessor SharedInstance {
get {
if (_dataStoreProcessor == null)
_dataStoreProcessor = new DataStoreProcessor (); return _dataStoreProcessor;
}
} /// <summary>
/// 加密数据
/// </summary>
/// <returns>The data.</returns>
/// <param name="dataToEncrypt">Data to encrypt.</param>
public string EncryptData (string dataToEncrypt)
{
//给明文加密用GetBytes
byte[] dataToEncryptArray = Encoding.UTF8.GetBytes (dataToEncrypt);
byte[] dataAfterEncryptArray = GlobalDataHelper.DataEncryptAlgorithm().CreateEncryptor ()
.TransformFinalBlock (dataToEncryptArray, , dataToEncryptArray.Length); return Convert.ToBase64String (dataAfterEncryptArray, , dataAfterEncryptArray.Length);
} /// <summary>
/// 解密数据
/// </summary>
/// <returns>The data.</returns>
/// <param name="dataToDecrypt">Data to decrypt.</param>
public string DecryptData (string dataToDecrypt)
{
//给密文解密用FromBase64String
byte[] dataToDecryptArray = Convert.FromBase64String (dataToDecrypt);
byte[] dataAfterDecryptArray = GlobalDataHelper.DataEncryptAlgorithm().CreateDecryptor ()
.TransformFinalBlock (dataToDecryptArray, , dataToDecryptArray.Length); return Encoding.UTF8.GetString (dataAfterDecryptArray);
} /// <summary>
/// 数据保存
/// </summary>
/// <param name="tobject">Tobject.</param>
/// <param name="path">Path.</param>
/// <typeparam name="T">The 1st type parameter.</typeparam>
public void Save (Object tobject, string path, bool isEncrypt=true)
{
string serializedString = JsonMapper.ToJson (tobject); using (StreamWriter sw = File.CreateText(path)) {
if (isEncrypt)
sw.Write (EncryptData (serializedString));
else
sw.Write (serializedString);
}
} /// <summary>
/// 载入数据
/// </summary>
/// <param name="path">Path.</param>
/// <typeparam name="T">The 1st type parameter.</typeparam>
public T Load<T> (string path, bool isEncrypt=true)
{
if (File.Exists (path) == false)
return default(T); using (StreamReader sr = File.OpenText(path)) {
string stringEncrypt = sr.ReadToEnd (); if (string.IsNullOrEmpty (stringEncrypt))
return default(T); if (isEncrypt)
return JsonMapper.ToObject<T> (DecryptData (stringEncrypt));
else
return JsonMapper.ToObject<T> (stringEncrypt);
}
}
}
调用方式
下面的代码将提供了一个自定义窗体,允许开发者自行定义用户在等待界面时,显示本地配置好的文字
按照道理,这种游戏基础配置类的应该使用Sql方式来进行数据交互,本文仅仅是为了进行功能的演示。
只有玩家数据,才使用本地文件存储的方式,存储在永久的路径里面
using UnityEngine;
using System.Collections.Generic;
using UnityEditor; public class LoadingDataConfigWindow : ScriptableWizard
{
public List<string> NotifyString;
//改成 Application.persistentDataPath永久存储
private readonly string LOADING_DATA_CONFIG_URL = Application.dataPath + @"/Resources/Setting/LoadNotify.data"; public LoadingDataConfigWindow()
{
NotifyString = DataStoreProcessor.SharedInstance.Load<List<string>>(LOADING_DATA_CONFIG_URL,false);
} [MenuItem ("GameObject/Data Setting/Loading text")]
static void CreateWizard ()
{
LoadingDataConfigWindow window = DisplayWizard<LoadingDataConfigWindow> ("配置登陆提示文字", "确认", "取消");
window.minSize = new Vector2(,);
} // This is called when the user clicks on the Create button.
void OnWizardCreate ()
{
DataStoreProcessor.SharedInstance.Save(NotifyString,LOADING_DATA_CONFIG_URL,false);
Debug.Log(string.Format(" 保存成功,共计录入 {0} 数据",NotifyString.Count));
} // Allows you to provide an action when the user clicks on the
// other button "Apply".
void OnWizardOtherButton ()
{
Debug.Log ("取消");
}
}
Unity本地数据存储---Sqlite和JSON的更多相关文章
- Android之ListView,AsyncTask,GridView,CardView,本地数据存储,SQLite数据库
版权声明:未经博主允许不得转载 补充 补充上一节,使用ListView是用来显示列表项的,使用ListView需要两个xml文件,一个是列表布局,一个是单个列表项的布局.如我们要在要显示系统所有app ...
- Android本地数据存储复习
Android本地数据存储复习 Android无论是应用层还是系统层都需要在本地保存一些数据,尤其在应用层中使用的就更为普遍,大体有这么几种:SharedPreference,file,sqlite数 ...
- iOS开发——数据持久化&使用NSUserDefaults来进行本地数据存储
使用NSUserDefaults来进行本地数据存储 NSUserDefaults适合存储轻量级的本地客户端数据,比如记住密码功能,要保存一个系统的用户名.密码.使用NSUserDefaults是首 ...
- iOS APP之本地数据存储(译)
最近工作中完成了项目的用户信息本地存储,查阅了一些本地存储加密方法等相关资料.期间发现了一个来自印度理工学院(IIT)的信息安全工程师的个人博客,写了大量有关iOS Application secur ...
- cocos2d-html5开发之本地数据存储
做游戏时常常须要的一个功能呢就是数据的保存了,比方游戏最高分.得到的金币数.物品的数量等等.cocos2d-html5使用了html5.所以html5的数据保存方法是对引擎可用的: html5本地数据 ...
- Android本地数据存储: Reservoir
一:前言 今天做项目,准备使用本地存储,把一些数据存在本地磁盘上,比如用户名.密码这样的.其实大家都知道,这种情况最常用的就是SharedPreferences了,我也不例外,脑子里第一个想到的就是用 ...
- [安卓安全] 01.安卓本地数据存储:Shared Preferences安全风险浅析
*:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...
- Windows 8 应用开发 - 本地数据存储
原文:Windows 8 应用开发 - 本地数据存储 在应用中通常会遇到用户主动或被动存储信息的情况,当应用关闭后这些数据仍然会存储在本地设备上,用户下次重新激活应用时会自动加载这些数据.下 ...
- iOS开发技术分享(1)— iOS本地数据存储
iOS开发技术分享(1)— iOS本地数据存储 前言: 我本是一名asp.net程序员,后来加入了iOS游戏开发队伍,到现在也有一年多的时间了.这一年来,每天都干到2.3点钟才睡觉,不为别的,只为了学 ...
随机推荐
- Linux环境下Apache配置多个虚拟主机挂载多站点同时运行
博客地址: http://blog.csdn.net/ClydeKuo/article/details/69569474 这篇博客讲的很详细,很详细.
- Effective C++ Item 10,11 Have assignment operators return a reference to *this Handle assignment to self in operator =
If you want to concatenate assignment like this int x, y, z; x = y = z = 15; The convention is to ma ...
- open() 函数以 a+ 模式打开文件
这种模式打开文件,可读可写,从文件顶部读取内容,从文件底部追加内容,文件不存在则自动创建 [root@localhost ~]$ cat 1.txt aaa bbb ccc In [1]: data ...
- 应用开发之Asp.net
本章简言 上一章中笔者讲到关于Linq和EF的用法.并以hibernate来进行讲解.那么本章笔者来讲一下C#的Asp.Net.即是在B/S模式下开发.现在企业大部分的业务都是面向B/S模式的.所以对 ...
- Masonry介绍与使用实践 - iOS移动开发周报
本文转发至 http://www.tuicool.com/articles/MRbaEnB/ 原文 http://www.infoq.com/cn/news/2014/11/masonry-intr ...
- js(jQuery)相关随笔
//获取所有name='id'.被选择的的多选框var idArr = $("input[type='checkbox'][name='id']:checked");//将这些多选 ...
- 通过chrome浏览器调试手机页面(IOS和Android)
开发PC页面的时候使用chrome浏览器的开发者工具,可以很容易的捕获到页面的dom元素,并且可以修改样式,方便调试,但是手机上却很麻烦,因为手机上没有办法直接打开开发者工具查看元素.其实可以通过将设 ...
- 快速解决:windows安装程序无法将windows配置为在此计算机的硬件上运行
用手工运行msoobe.ext启用配置的方法, 快速解决:windows安装程序无法将windows配置为在此计算机的硬件上运行 我自己安装碰到的是蓝色这个错误,下面这个也有网友说用安装驱动等方法 ...
- 初级Java面试题 - JavaSE篇
p{font-size:18px;} li{font-size:18px;} 加入我的QQ群(701974765) 获取更多好用又好玩的软件,还有不定期发放的福利呦(- ̄▽ ̄)- Java基本数据类型 ...
- 在VMWare的虚拟机中设置共享文件夹(Linux-Ubuntu系统)
1.点击菜单中的虚拟机---设置---选项---共享文件夹,选择总是开启: 2.添加主机共享的文件夹: 3.安装vmware tools: (1)打开虚拟机---安装vmware tools: (2) ...