Unity游戏开发学习之路——数据持久化

数据持久化

  谈到数据持久化,在Unity的游戏开发中十分重要的,不管是是在本地和服务器端,数据持久化都是我们学习的难点,数据持久化的技术有很多种,这里只选取几种,目前也是我所学到的,在接下来的时间里会陆续整理到这里。

Part1:PlayerPrefs类

  这是unity圣典中给出的,

PlayerPrefs 游戏存档
Description 描述

在游戏会话中储存和访问游戏存档。这个是持久化数据储存,比如保存游戏记录。

Editor/Standalone 编辑器 / 桌面平台

Mac OS

在Mac OS X上PlayerPrefs是存储在~/Library/Preferences文件夹,名为unity.[company name].[product name].plist,其中company name和product name名是在Project Setting中设置,.plist文件可用于编辑器和桌面平台运行。 (打开Find,按住Option键,点击“前往 →“资源库”,就可以找到Preferences文件夹。)

Windows

在Windows平台下,PlayerPrefs被存储在注册表的 HKEY_CURRENT_USER\Software\[company name]\[product name]键下(打开“运行”输入regedit打开注册表),其中company name和product name名是在Project Setting中设置。

Linux

在Linux,PlayerPrefs是储存在~/.config/unity3d/[CompanyName]/[ProductName]。其中CompanyName和ProductName名是在Project Setting中设置

Windows Store

在Windows Store,PlayerPrefs是储存在%userprofile%\AppData\Local\Packages\[ProductPackageId]>\LocalState\playerprefs.dat。

Windows Phone

在Windows Phone 8,PlayerPrefs是储存在应用自己的文件夹,参见:Windows.Directory.localFolder

WebPlayer 网页

在网页平台,PlayerPrefs是储存在二进制文件,看下面的对应的各平台位置:

Mac OS X: ~/Library/Preferences/Unity/WebPlayerPrefs

Windows: %APPDATA%\Unity\WebPlayerPrefs

一个游戏存档文件对应一个web播放器URL并且文件大小被限制为1MB。如果超出这个限制,SetInt、SetFloat和SetString将不会存储值并抛出一个PlayerPrefsException异常。

Static Functions 静态函数

DeleteAll	Removes all keys and values from the preferences. Use with caution.
从游戏存档中删除所有key。请谨慎使用。
DeleteKey	Removes key and its corresponding value from the preferences.
从游戏存档中删除key和它对应的值。
GetFloat	Returns the value corresponding to key in the preference file if it exists.
如果存在,返回游戏存档文件中key对应的浮点数值。
GetInt	Returns the value corresponding to key in the preference file if it exists.
如果存在,返回游戏存档文件中key对应的整数值。
GetString	Returns the value corresponding to key in the preference file if it exists.
如果存在,返回游戏存档文件中key对应的字符串值。
HasKey	Returns true if key exists in the preferences.
如果key在游戏存档中存在,返回true。
Save	Writes all modified preferences to disk.
写入所有修改参数到硬盘。
SetFloat	Sets the value of the preference identified by key.
设置由key确定的浮点数值。
SetInt	Sets the value of the preference identified by key.
设置由key键确定的整数值。
SetString	Sets the value of the preference identified by key.
设置由key确定的字符串值。

  下面我通过写的一小段代码呈现一下怎么使用:

    

public class Person
{
    /// <summary>
    /// 用于存储名字
    /// </summary>
    private string name;

    /// <summary>
    /// 运用属性的特征去存储一个变量到PlayerPrefs中,数据持久化
    /// </summary>
    /// <value>The name.</value>
    public string Name
    {
        get{
            return PlayerPrefs.GetString ("Name");
        }

        set{
            PlayerPrefs.SetString ("Name", value);
            PlayerPrefs.Save ();
        }
    }

    /// <summary>
    /// 返回年龄
    /// </summary>
    private int age;

    public int Age{
        get{
            return PlayerPrefs.GetInt ("Age");
        }

        set{
            PlayerPrefs.SetInt ("Age", value);
            PlayerPrefs.Save ();
        }
    }

    /// <summary>
    /// 无参数的构造函数
    /// </summary>
    public Person()
    {

    }

    /// <summary>
    /// 有参数的构造函数
    /// </summary>
    /// <param name="_name">Name.</param>
    /// <param name="_age">Age.</param>
    public Person(string _name,int _age)
    {
        this.Name = _name;
        this.Age = _age;
    }

    public override string ToString ()
    {
        return string.Format ("[Person: Name={0}, Age={1}]", Name, Age);
    }
}

将数据存储到属性中,也是一个不错的方法。这里需要注意的是设置了值后,调用Save()方法。

Part2:Json数据持久化

  首先需要用到一个json的动态链接库,JsonFx,网上可以找到,这里给出一个百度盘的连接链接: https://pan.baidu.com/s/1kVmc4Qz 密码: kqg2

然后就是把这个动态链接库导入到我们的工程的Plugins目录下面,引用即可。以下是代码部分

  这个是要用json 转化的目标类,

using System.Collections;
using System.Collections.Generic;

public class Body
 {

    public string name;
    public int age;

    public Body()
    {

    }

    public Body(string _name,int _age)
    {
        this.name = _name;
        this.age = _age;
    }

    public override string ToString ()
    {
        return string.Format ("[Body:name:{0},age:{1}]",name,age);
    }
}

下面这个类是用于转化的的测试类:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using JsonFx.Json;
using System.IO;

public class TestJson : MonoBehaviour
 {

    /// <summary>
    /// 静态字段保存路径
    /// </summary>
    static string pathdata="/data.txt";

    void Start()
    {
        Debug.Log(Application.dataPath);

        Write ();
        Read ();

    }

    /// <summary>
    /// 写入json数据,将类序列化
    /// </summary>
    public static void  Write()
    {
        Body body=new Body ("zhangsan",25);

        string text = JsonWriter.Serialize (body);

        File.WriteAllText (DataPathTest.GetDataPath ()+pathdata, text);
    }

    /// <summary>
    /// 将文本反序列化为一个类
    /// </summary>
    public static void Read()
    {
        string str = File.ReadAllText (DataPathTest.GetDataPath () +pathdata);

        Body bd = JsonReader.Deserialize<Body> (str);

        Debug.Log (bd.ToString());
    }

}

下面这个只是写个类用于获取路径,(有点多余)

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class DataPathTest
 {

    public static string GetDataPath()
    {
        if (Application.platform == RuntimePlatform.IPhonePlayer) {
            string path = Application.dataPath.Substring (0, Application.dataPath.Length - 5);
            return path + "/Dcoument";
        } else if (Application.platform == RuntimePlatform.Android) {
            return Application.persistentDataPath + "/";
        } else {
            return Application.dataPath;
        }
    }
}

     最后补充一个易错的点,就是我起先在用JsonFx转化的时候出现的一些问题,先将body 对象转化为json 字符串,让后在转化为body的过程中出现的报错,后来百度找到了原因,具体可以参考这篇文章:http://www.cnblogs.com/zhuhongjongy/p/4974473.html

今天就写到这里,

待续。。。。

时间: 2025-01-31 12:31:31

Unity游戏开发学习之路——数据持久化的相关文章

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游戏开发——Excel中的数据是如何到游戏中的 (一)

引言 现在做游戏开发的没有几个不用Excel的,用的最多的就是策划.尤其是数值策划,Excel为用户提供强大的工具,各种快捷键,各种插件,各种函数.但是作为程序来说其实管住的不是Excel而是它最终形成的数据,而在程序中数据其实就是二进制,比如说一个int型就是4个byte,一个字母占2个byte.但是游戏中不可能把excel文件放进去(因为Excel本身就会占一部分额外的空间),也不可能把处理Excel的类库打包到程序,所以现在大多是对Excel进行读取然后将数据进行序列化并写入文件再打包,程

android开发学习之路——连连看之游戏逻辑(五)

GameService组件则是整个游戏逻辑实现的核心,而且GameService是一个可以复用的业务逻辑类. (一)定义GameService组件接口 根据前面程序对GameService组件的依赖,程序需要GameService组件包含如下方法.   ·start():初始化游戏状态,开始游戏的方法.     ·Piece[][] getPieces():返回表示游戏状态的Piece[][]数组.     ·boolean hasPieces():判断Pieces[][]数组中是否还剩Piec

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

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

Android开发学习之路--网络编程之xml、json

一般网络数据通过http来get,post,那么其中的数据不可能杂乱无章,比如我要post一段数据,肯定是要有一定的格式,协议的.常用的就是xml和json了.在此先要搭建个简单的服务器吧,首先呢下载xampp,然后安装之类的就不再多讲了,参考http://cnbin.github.io/blog/2015/06/05/mac-an-zhuang-he-shi-yong-xampp/.安装好后,启动xampp,之后在浏览器输入localhost或者127.0.0.1就可以看到如下所示了: 这个就

Android开发学习之路-RecyclerView滑动删除和拖动排序

Android开发学习之路-RecyclerView使用初探 Android开发学习之路-RecyclerView的Item自定义动画及DefaultItemAnimator源码分析 Android开发学习之路-下拉刷新怎么做? 本篇是接着上面三篇之后的一个对RecyclerView的介绍,这里多说两句,如果你还在使用ListView的话,可以放弃掉ListView了.RecyclerView自动帮我们缓存Item视图(ViewHolder),允许我们自定义各种动作的动画和分割线,允许我们对It

Unity 游戏开发技巧集锦之材质的应用的创建反射材质

Unity 游戏开发技巧集锦之材质的应用的创建反射材质 Unity中材质的应用 游戏中,大多数材质的应用都离不开纹理,而纹理本身是图片.所以,在学习本章时,最好在电脑上安装一个可以编辑图片的功能强大的软件,如Photoshop和GIMP.本章使用的是前者.另外,有些纹理需要包含Transparents通道,所以图片最好保存成可以存储相应信息的格式,例如,PSD和TGA. unity中创建反射材质 生活中,反射材质(reflective material)的实例有很多.例如,水面.光滑的金属.镜子

Unity 游戏开发技巧集锦之创建部分光滑部分粗糙的材质

Unity 游戏开发技巧集锦之创建部分光滑部分粗糙的材质 创建部分光滑部分粗糙的材质 生活中,有类物体的表面既有光滑的部分,又有粗糙的部分,例如丽江的石板路,如图3-17所示,石板的表面本来是粗糙的,但是在石板上面走的人多了,石板的一部分就变得光滑了.有时,游戏为了显得更加逼真,就需要模拟这样一种材质. 图3-17  兼具光滑和粗糙表面的丽江石板路 要制作部分光滑部分粗糙的材质,需要用到两种资源:拥有镜面着色器的材质和模拟了现实状况的纹理. Unity中创建并配置材质 在Project视图里,创