【转】 [Unity3D]手机3D游戏开发:场景切换与数据存储(PlayerPrefs 类的介绍与使用)
http://blog.csdn.net/pleasecallmewhy/article/details/8543181
在Unity中的数据存储和iOS中字典的存储基本相同,是通过关键字实现数据存储与调用。
下面来介绍一下Unity用来存储数据的PlayerPrefs 类。
使用PlayerPrefs可以在在游戏会话中保持并访问玩家偏好设置。
在Mac OS X上PlayerPrefs存储在-/Library/PlayerPrefs文件夹,
名文unity/[companyname]\[product name].plist,这里company和product是在Project Setting中设置的,相同
的plist用于在编辑器中运行的工程和独立模式.
在Windows独立模式下,PlayerPrefs被存储在注册表的HKCU Software[companyname]\[product name]键下,这里company和product是在Project Setting中设置的.
在Web模式下,PlayerPrefs存储在Mac OS X的二进制文件-/Library/Preferences/Unity/WebPlayerPrefs中和Windows的%APPDATA%\Unity\WebPlayerPrefs中,一个偏好设置文件对应一个web播放器URL并且文件大小被限制为1兆。如果超出这个限制,SetInt,SetFloat和SetString将不会存储值并相处一个PlayerPrefsException.
类方法
◆ static function DeleteAll(): void
描述:从设置文件中移除所有键和值,谨慎的使用它们。
◆ static function DeleteKey(key: string): void
描述:从设置文件中移除key和它对应的值。
◆ static function GetFloat(key: string, defaultValue: float=OF): float
描述:如果存在,返回设置文件中key对应的值.如果不存在,它将返回defaultValue。
print(PlayerPrefs.GetFlat("Player score"));
◆ static function GetInt(key: string, defaultValue: int): int
描述:返回设置文件中key对应的值,如果存在.如果不存在,它将返回defaultValue。
print(PlayerPrefs.GetInt("Player score"));
◆ static function GetString(key: string, defaultValue: string=**): string
描述:返回设置文件中key对应的值,如果存在.如果不存在,它将返回defaultValue.
print(PlayerPrefs.GetString("Player Name"));
◆ static function HasKey(key: string): bool
描述:在设置文件如果存在key则返回真.
◆ static function SetFloat(key: string, value: float): void
描述:设置由key确定的值.
print(PlayerPrefs.SetFloat("Player Score", 10.0));
◆ static function SetInt(key: string, value: int): void
描述:设置由key确定的值.
PlayerPrefs.SetInt("Player Score", 10);
◆ static function SetString(key: string, value: string): void
描述:设置由key确定的值.
PlayerPrefs.Setstring("Player Name", "Foobar");
下面通过一个案例简单的演示一下。
首先创建两个场景用来实现场景的跳转,命名为CSDNPrefabs1和CSDNPrefabs2来做实验。
基本需求是在第一个场景中创建一些数据并且跳转到第二个场景中显示出来。
创建一个Scene1.cs脚本:
- using UnityEngine;
- using System.Collections;
- public class Scene0Main : MonoBehaviour {
- //储存数据的显示
- public string testStr;
- public string testInt;
- public string testFloat;
- //GUI皮肤 为上面我们添加的皮肤
- //在外面用鼠标拖动上为它赋值
- public GUISkin fontSkin;
- //显示的图片
- public Texture Imagetexture;
- // Use this for initialization
- void Start () {
- //读取key的值
- testStr = PlayerPrefs.GetString("testStr", "default");
- testInt = PlayerPrefs.GetInt("testInt", 0).ToString();
- testFloat = PlayerPrefs.GetFloat("testFloat", 0).ToString();
- }
- // Update is called once per frame
- void Update () {
- }
- void OnGUI() {
- //将GUI的皮肤设置为我们创建的皮肤
- GUI.skin = fontSkin;
- //贴上图片
- GUI.DrawTexture(new Rect((Screen.width - Imagetexture.width) >>1, 10, 120, 120), Imagetexture);
- //添加输入框让用户输入信息,这里面我没有捕获异常,因为用户有可能输入一个不合法的数值
- testStr = GUI.TextField (new Rect(10, 200, 200, 50), testStr, 50);
- testInt = GUI.TextField (new Rect(10, 250, 200, 50), testInt, 50);
- testFloat = GUI.TextField (new Rect(10, 300, 200, 50), testFloat, 50);
- //点击按钮保存所有数据
- if (GUI.Button(new Rect(220, 200, 150, 100), "commit all"))
- {
- PlayerPrefs.SetString("testStr", testStr);
- PlayerPrefs.SetInt("testInt", int.Parse(testInt));
- PlayerPrefs.SetFloat("testFloat", float.Parse(testFloat));
- //切换场景到scene1
- Application.LoadLevel("scene1");
- }
- }
- }
创建一个Scene2.cs脚本:
- using UnityEngine;
- using System.Collections;
- public class scene1Main : MonoBehaviour {
- public string testStr;
- public string testInt;
- public string testFloat;
- public GUISkin fontSkin;
- public Texture Imagetexture;
- // Use this for initialization
- void Start () {
- testStr = PlayerPrefs.GetString("testStr", "default");
- testInt = PlayerPrefs.GetInt("testInt", 0).ToString();
- testFloat = PlayerPrefs.GetFloat("testFloat", 0).ToString();
- }
- void OnGUI() {
- GUI.skin = fontSkin;
- GUI.DrawTexture(new Rect((Screen.width - Imagetexture.width) >>1, 10, 120, 120), Imagetexture);
- //显示label
- GUI.Label(new Rect(10,150,300,50),"testStr = "+ testStr);
- GUI.Label(new Rect(10,200,300,50),"testInt = "+ testInt);
- GUI.Label(new Rect(10,250,300,50),"testFloat = "+ testFloat);
- if (GUI.Button(new Rect(220, 200, 150, 100), "clean all"))
- {
- //删除所有键值
- PlayerPrefs.DeleteAll();
- // 返回场景0
- Application.LoadLevel("scene0");
- }
- if (GUI.Button(new Rect(220, 320, 150, 100), "only return"))
- {
- // 返回场景0
- Application.LoadLevel("scene0");
- }
- }
- }
然后添加相关贴图的GUISkin完成部署:

此时运行会报错,因为这两个场景需要Build:

这是再运行就可以看到这个简单的Demo了。
在这里输入完毕之后点击commit all:

在另一个场景中便也能显示了。
【转】 [Unity3D]手机3D游戏开发:场景切换与数据存储(PlayerPrefs 类的介绍与使用)的更多相关文章
- 手机3D游戏开发:自定义Joystick的相关设置和脚本源码
Joystick在手游开发中非常常见,也就是在手机屏幕上的虚拟操纵杆,但是Unity3D自带的Joystick贴图比较原始,所以经常有使用自定义贴图的需求. 下面就来演示一下如何实现自定义JoySti ...
- Unity3D手机斗地主游戏开发实战(04)_出牌判断大小(已完结)
之前我们实现了叫地主.玩家和电脑自动出牌主要功能,但是还有个问题,出牌的时候,没有有效性检查和比较牌力大小.比如说,出牌3,4,5,目前是可以出牌的,然后下家可以出任何牌如3,6,9. 问题1:出牌检 ...
- Unity3D手机斗地主游戏开发实战(04)_出牌判断大小
之前我们实现了叫地主.玩家和电脑自动出牌主要功能,但是还有个问题,出牌的时候,没有有效性检查和比较牌力大小.比如说,出牌3,4,5,目前是可以出牌的,然后下家可以出任何牌如3,6,9. 问题1:出牌检 ...
- Unity3D手机斗地主游戏开发实战(01)_发牌功能实现
园子荒废多年,闲来无事,用Unity3D来尝试做一个简单的小游戏,一方面是对最近研究的Unity3D有点总结,一方面跟广大的园友相互学习和提高.话不多说,进入正题~ 一.创建项目 1.创建Unity2 ...
- Unity3D手机斗地主游戏开发实战(02)_叫地主功能实现(不定期更新中~~~)
目录 Unity3D手机斗地主游戏开发实战(01)_发牌功能实现 Unity3D手机斗地主游戏开发实战(02)_叫地主功能实现 一.大体思路 前面我们实现了点击开始游戏按钮,系统依次给玩家发牌的逻辑和 ...
- Unity3D手机斗地主游戏开发实战(03)_地主牌显示和出牌逻辑(不定期更新中~~~)
Hi,之前有同学说要我把源码发出来,那我就把半成品源码的链接放在每篇文件的最后,有兴趣的话可以查阅参考,有问题可以跟我私信,也可以关注我的个人公众号,互相交流嘛.当然,代码也是在不断的持续改进中~ 上 ...
- Unity3D手机斗地主游戏开发实战(02)_叫地主功能实现
大体思路 前面我们实现了点击开始游戏按钮,系统依次给玩家发牌的逻辑和动画,并展示当前的手牌.这期我们继续实现接下来的功能--叫地主. 1.首先这两天,学习了DOTween,这是一个强大的Unity动画 ...
- Unity 4.2.0 官方最新破解版(Unity3D 最新破解版,3D游戏开发工具和游戏引擎套件)
Unity是一款跨平台的游戏开发工具,从一开始就被设计成易于使用的产品.作为一个完全集成的专业级应用,Unity还包含了价值数百万美元的功能强大的游戏引擎.Unity作为一个游戏开发工具,它的设计主旨 ...
- Unity3D ——强大的跨平台3D游戏开发工具(六)
第十一章 制作炮台的旋转 大家知道,炮台需要向四周不同的角度发射炮弹,这就需要我们将炮台设置成为会旋转的物体,接下来我们就一起制作一个会旋转的炮台. 第一步:给炮台的炮筒添加旋转函数. 给炮台的炮筒部 ...
随机推荐
- iOS解析新浪微博的@##以及URL链接并展示
最近在做一个跟微博相关的应用.其中涉及到了对微博中@.##以及URL链接的解析与展示.分享一下个人处理的方式,希望对需要的人有所帮助. 最终的展现效果: 首先,第一步是你得从纯文本中找到它们.毫无疑问 ...
- 【洛谷4009】汽车加油行驶问题(SPFA乱搞)
点此看题面 大致题意:给定一个\(N*N\)的方形网格,其中1表示这个格子有油库,0表示这个格子没油库,且汽车加满油可以行驶\(k\)条网格边.如果遇到油库必须加满油并花费\(A\)元,如果\(X\) ...
- 网络编程——网络模型和InetAddress类
第1章 网络通信协议 通过计算机网络可以使多台计算机实现连接,位于同一个网络中的计算机在进行连接和通信时需要遵守一定的规则,这就好比在道路中行驶的汽车一定要遵守交通规则一样.在计算机网络中,这些连接和 ...
- WPF中批量进行验证操作
//ref,out private void CheckTextboxNotEmpty(ref bool isOK, params TextBox[] textboxes) { foreach (Te ...
- java定义一个Circle类,包含一个double型的radius属性代表圆的半径,一个findArea()方法返回圆的面积
需求如下:(1)定义一个Circle类,包含一个double型的radius属性代表圆的半径,一个findArea()方法返回圆的面积. (2)定义一个类PassObject,在类中定义一个方法pri ...
- react与微信小程序
由组员完成 原文链接 都说react和微信小程序很像,但是像在什么部分呢,待我稍作对比. 生命周期 1.React React的生命周期在16版本以前与之后发生了重大变化,原因在于引入的React F ...
- 【php】如何配置自主域名腾讯企业邮箱
腾讯企业邮配置 protocal ssl smtp port 465 host smtp.exmail.qq.com user email account passwd email passwd
- hibernate的get() load() 和find()区别
如果找不到符合条件的纪录,get()方法将返回null.如果找不到符合条件的纪录,find()方法将返回null.如果找不到符合 条件的纪录,load()将会报出ObjectNotFoundEccep ...
- 模块numpy的用法
https://blog.csdn.net/qq351469076/article/details/78817378 机器学习三剑客之Numpy: https://www.jianshu.com/p/ ...
- libevent 信号事件实现方式
学会使用libevent,才能真正的掌握其是实现原理,我们先从一个简短的测试用例开始: #include <sys/types.h> #include <sys/stat.h> ...