Unity3D游戏开发数据持久化PlayerPrefs的用法详解
作者:laozhang 发布时间:2022-11-11 23:16:00
小编今天研究了在Unity3D中的数据持久化问题。数据持久化在任何一个开发领域都是一个值得关注的问题,小到一个应用中配置文件的读写,大到数据库的管理维护,都可以看到数据持久化的身影。小编在《C#基于Linq和反射实现数据持久化框架Xml4DB》这篇文章中曾介绍了博主在寒假期间开发的Xml4DB框架,这是一个基于Xml的轻量级数据持久化框架,可以采用面向对象的方式来处理数据。数据持久化从某种意义上来说,就是序列化和反序列化化的过程。在.NET中我们可以将对象序列化为Xml、Json、二进制。然后通过反序列化重新获得对象。同样,在Android中我们可以通过使用Preferences来存储键值型数据来实现数据持久化(当然还有其它的方式,这里只是为了强调键值型数据)。那么,在Unity3D中如何实现数据持久化呢?请大家跟随我一起走进今天的文章:[Unity3D]Unity3D游戏开发之数据持久化PlayerPrefs的使用
首先我们来看两段Unity3D中实现数据读写的简单代码吧:
//保存数据
PlayerPrefs.SetString("Name",mName);
PlayerPrefs.SetInt("Age",mAge);
PlayerPrefs.SetFloat("Grade",mGrade)
//读取数据
mName=PlayerPrefs.GetString("Name","DefaultValue");
mAge=PlayerPrefs.GetInt("Age",0);
mGrade=PlayerPrefs.GetFloat("Grade",0F);
通过上面两段代码,我们可以发现两点:
1、Unity3D中的数据持久化是以键值的形式存储的,可以看作是一个字典。
2、Unity3D中值是通过键名来读取的,当值不存在时,返回默认值。
目前,在Unity3D中只支持int、string、float三种数据类型的读取,所以我们可以使用这三种数据类型来存储简单的数据。目前Unity3D中用于数据持久化的类为layerPrefs,主要的类方法有:
static function DeleteAll(): void
描述:从设置文件中移除所有键和值,谨慎的使用它们。
static function DeleteKey(key: string): void
描述:从设置文件中移除key和它对应的值。
static function GetFloat(key: string, defaultValue: float=OF): float
描述:如果存在,返回设置文件中key对应的值.如果不存在,它将返回defaultValue。
static function GetInt(key: string, defaultValue: int): int
描述:返回设置文件中key对应的值,如果存在.如果不存在,它将返回defaultValue。
static function GetString(key: string, defaultValue: string=**): string
描述:返回设置文件中key对应的值,如果存在.如果不存在,它将返回defaultValue.
static function HasKey(key: string): bool
描述:在设置文件如果存在key则返回真.
static function SetFloat(key: string, value: float): void
描述:设置由key确定的值.
static function SetInt(key: string, value: int): void
描述:设置由key确定的值.
static function SetString(key: string, value: string): void
描述:设置由key确定的值.
好了,在了解layerPrefs的主要方法后,我们以一个具体的例子来学习Unity3D中数据持久化的实现,我们希望实现在一个场景中输入信息以便在新场景中读取信息。我们直接创建两个场景,分别命名为Scene0、Scene1(据说程序员数数都是从0开始的,哈哈),场景中保留主摄像机即可。接下来我们分别为两个场景编写脚本:
第一个场景的脚本:
using UnityEngine;
using System.Collections;
public class Scene1Script : MonoBehaviour {
//姓名
private string mName="路人甲";
//年龄
private int mAge=20;
//成绩
private float mGrade=75.5F;
void OnGUI()
{
GUILayout.Label("Unity3D数据存储示例程序",GUILayout.Height(25));
//姓名
GUILayout.Label("请输入姓名:",GUILayout.Height(25));
mName=GUILayout.TextField(mName,GUILayout.Height(25));
//年龄
GUILayout.Label("请输入年龄:",GUILayout.Height(25));
mAge=int.Parse(GUILayout.TextField(mAge.ToString(),GUILayout.Height(25)));
//成绩
GUILayout.Label("请输入成绩:",GUILayout.Height(25));
mGrade=float.Parse(GUILayout.TextField(mGrade.ToString(),GUILayout.Height(25)));
//提交数据
if(GUILayout.Button("提交数据",GUILayout.Height(25)))
{
//保存数据
PlayerPrefs.SetString("Name",mName);
PlayerPrefs.SetInt("Age",mAge);
PlayerPrefs.SetFloat("Grade",mGrade);
//切换到新场景
Application.LoadLevel("Scene1");
}
}
}
第二个场景的脚本:
using UnityEngine;
using System.Collections;
public class Scene2Script : MonoBehaviour {
private string mName;
private int mAge;
private float mGrade;
void Start ()
{
//读取数据
mName=PlayerPrefs.GetString("Name","DefaultValue");
mAge=PlayerPrefs.GetInt("Age",0);
mGrade=PlayerPrefs.GetFloat("Grade",0F);
}
void OnGUI()
{
GUILayout.Label("Unity3D数据存储示例程序",GUILayout.Height(25));
//姓名
GUILayout.Label("姓名:"+mName,GUILayout.Height(25));
//年龄
GUILayout.Label("年龄:"+mAge,GUILayout.Height(25));
//成绩
GUILayout.Label("成绩:"+mGrade,GUILayout.Height(25));
//删除数据
if(GUILayout.Button("清除数据",GUILayout.Height(25)))
{
PlayerPrefs.DeleteAll();
}
//返回Scene0
if(GUILayout.Button("返回场景",GUILayout.Height(25)))
{
Application.LoadLevel("Scene0");
}
}
}
我们这里直接将脚本绑定到摄像机上,然后将项目编译,注意将两个场景放入编译序列,我们运行程序:
来源:https://blog.csdn.net/qinyuanpei/article/details/24195977


猜你喜欢
- 一、开发前准备1. Docker的安装可以参考https://docs.docker.com/install/2. 配置docker远程连接
- private string CheckCidInfo(string cid) &
- 做直播,音视频通讯。经常需要通过rtp协议封装音视频数据来发送。网上找到的基本都是c或c++版本的,没有JAVA版本的。就算千辛万苦找到一篇
- 前言今天的文章从下面这张图片开始,这张图片Java开发们应该很熟悉了我们都知道无锁状态是对象头是有位置存储hashcode的,而变为偏向锁状
- 对于之前最火的无外乎集五福了,而五福除了加十个好友获得外,最直接的途径就是支付宝的咻一咻了。那么咻一咻具体有哪些实现方式呢?下面我们将一一介
- 引言♀ 小AD:明哥,我终于出了这口恶气了。♂ 明世隐:打爽了是吧。♀ 小AD:那必须的,打十盘我赢九盘,我随意。♂ 明世隐:那小朋友不是搞
- 一、可变参数方法的定义首先看下可变参数方法在代码上是如何定义的,如下所示:public static void method1(Intege
- 前言Quarkus和RESTEasy团队非常高兴地宣布了Quarkus中的RESTEasy Reactive集成已进入master分支,并将
- 1.包1.包的三大作用区分相同名字的类当类很多时,可方便管理控制访问范围2.包的基本语法package abc.www;3.包的本质实际上就
- 一、前言前面我们介绍了运算符的一部分运算符,现在我们把剩余的他介绍完全来二、运算符赋值运算符所谓赋值,就是一个等于号连接的两个如int a=
- web采集的数据为 %u6B63%u5F0F%u4EBA%u5458,需要读取并转换为python对象,想了下不调用Javascript去e
- 进入到Android-sdk中platform-tools目录在命令行中执行以下命令adb shell dumpsys activity&g
- 本文实例讲述了Java操作Mongodb数据库实现数据的增删查改功能。分享给大家供大家参考,具体如下:首先,我们在windows下安装mon
- 最近开发的时候,偶尔遇到在线上稳定运行的webview内嵌的h5页面加载不出来,一直定位不到具体原因(因为我们自己做的兼容性测试上不重现),
- 即刻点赞展示点赞的数字增加和减少并不是整个替换,而是差异化替换。再加上动画效果就看的很舒服。自己如何实现这种数字切换呢?下面用一张图来展示我
- Java 如何将String转化为Int在 Java 中要将 String 类型转化为 int 类型时,需要使用 Integer 类中的 p
- 本文实例讲述了Android获取手机电池电量用法。分享给大家供大家参考。具体如下:原理概述:手机电池电量的获取在应用程序的开发中也很常用,A
- 一、NIOjava.nio全称java non-blocking IO,是指jdk1.4 及以上版本里提供的新api(New IO) ,为所
- 本文实例讲述了C#使用文件流读取文件的方法。分享给大家供大家参考。具体如下:using System;using System.IO;nam
- 很多情况下sql不好解决的多表查询,临时表分组,排序,尽量用java8新特性stream进行处理使用java8新特性,下面先来点基础的Lis