unity3d--PlayerPrefs 游戏存档

        Unity3D游戏开发之数据持久化PlayerPrefs的使用


             转载自 本文作者:秦元培,本文出处:http://blog.csdn.net/qinyuanpei/article/details/24195977

         博主今天研究了在Unity3D中的数据持久化问题。数据持久化在任何一个开发领域都是一个值得关注的问题,小到一个应用中配置文件的读写,大到数据库的管理维护,都可以看到数据持久化的身影。博主在《C#基于Linq和反射实现数据持久化框架Xml4DB》这篇文章中曾介绍了博主在寒假期间开发的Xml4DB框架,这是一个基于Xml的轻量级数据持久化框架,可以采用面向对象的方式来处理数据。数据持久化从某种意义上来说,就是序列化和反序列化化的过程。在.NET中我们可以将对象序列化为Xml、Json、二进制。然后通过反序列化重新获得对象。同样,在Android中我们可以通过使用Preferences来存储键值型数据来实现数据持久化(当然还有其它的方式,这里只是为了强调键值型数据)。那么,在Unity3D中如何实现数据持久化呢?请大家跟随我一起走进今天的文章:[Unity3D]Unity3D游戏开发之数据持久化PlayerPrefs的使用

        首先我们来看两段Unity3D中实现数据读写的简单代码吧:

  1. //保存数据  
  2. PlayerPrefs.SetString("Name",mName);  
  3. PlayerPrefs.SetInt("Age",mAge);  
  4. PlayerPrefs.SetFloat("Grade",mGrade)  
   //保存数据
   PlayerPrefs.SetString("Name",mName);
   PlayerPrefs.SetInt("Age",mAge);
   PlayerPrefs.SetFloat("Grade",mGrade)
  1. //读取数据  
  2. mName=PlayerPrefs.GetString("Name","DefaultValue");  
  3. mAge=PlayerPrefs.GetInt("Age",0);  
  4. mGrade=PlayerPrefs.GetFloat("Grade",0F);  
   //读取数据
   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,主要的类方法有:

  1. static function DeleteAll(): void  
  2. 描述:从设置文件中移除所有键和值,谨慎的使用它们。  
  3.   
  4. static function DeleteKey(key: string): void  
  5. 描述:从设置文件中移除key和它对应的值。  
  6.   
  7. static function GetFloat(key: string, defaultValue: float=OF): float  
  8. 描述:如果存在,返回设置文件中key对应的值.如果不存在,它将返回defaultValue。  
  9.   
  10. static function GetInt(key: string, defaultValue: int): int  
  11. 描述:返回设置文件中key对应的值,如果存在.如果不存在,它将返回defaultValue。  
  12.   
  13. static function GetString(key: string, defaultValue: string=**): string  
  14. 描述:返回设置文件中key对应的值,如果存在.如果不存在,它将返回defaultValue.  
  15.   
  16. static function HasKey(key: string): bool  
  17. 描述:在设置文件如果存在key则返回真.  
  18.   
  19. static function SetFloat(key: string, value: float): void  
  20. 描述:设置由key确定的值.  
  21.   
  22. static function SetInt(key: string, value: int): void  
  23. 描述:设置由key确定的值.  
  24.   
  25. static function SetString(key: string, value: string): void  
  26. 描述:设置由key确定的值.  
    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开始的,哈哈),场景中保留主摄像机即可。接下来我们分别为两个场景编写脚本:

        第一个场景的脚本:

  1. using UnityEngine;  
  2. using System.Collections;  
  3.   
  4. public class Scene1Script : MonoBehaviour {  
  5.       
  6.     //姓名  
  7.     private string mName="路人甲";  
  8.     //年龄  
  9.     private int mAge=20;  
  10.     //成绩  
  11.     private float mGrade=75.5F;  
  12.       
  13.     void OnGUI()  
  14.     {  
  15.         GUILayout.Label("Unity3D数据存储示例程序",GUILayout.Height(25));  
  16.         //姓名  
  17.         GUILayout.Label("请输入姓名:",GUILayout.Height(25));  
  18.         mName=GUILayout.TextField(mName,GUILayout.Height(25));  
  19.         //年龄  
  20.         GUILayout.Label("请输入年龄:",GUILayout.Height(25));  
  21.         mAge=int.Parse(GUILayout.TextField(mAge.ToString(),GUILayout.Height(25)));  
  22.         //成绩  
  23.         GUILayout.Label("请输入成绩:",GUILayout.Height(25));  
  24.         mGrade=float.Parse(GUILayout.TextField(mGrade.ToString(),GUILayout.Height(25)));  
  25.           
  26.         //提交数据  
  27.         if(GUILayout.Button("提交数据",GUILayout.Height(25)))  
  28.         {  
  29.            //保存数据  
  30.            PlayerPrefs.SetString("Name",mName);  
  31.            PlayerPrefs.SetInt("Age",mAge);  
  32.            PlayerPrefs.SetFloat("Grade",mGrade);  
  33.              
  34.            //切换到新场景  
  35.             Application.LoadLevel("Scene1");  
  36.         }  
  37.     }  
  38. }  
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");
		}
	}
}
          第二个场景的脚本:

  1. using UnityEngine;  
  2. using System.Collections;  
  3.   
  4. public class Scene2Script : MonoBehaviour {  
  5.   
  6.     private string mName;  
  7.     private int mAge;  
  8.     private float mGrade;  
  9.       
  10.     void Start ()   
  11.     {  
  12.        //读取数据  
  13.        mName=PlayerPrefs.GetString("Name","DefaultValue");  
  14.        mAge=PlayerPrefs.GetInt("Age",0);  
  15.        mGrade=PlayerPrefs.GetFloat("Grade",0F);  
  16.     }  
  17.       
  18.     void OnGUI()  
  19.     {  
  20.        GUILayout.Label("Unity3D数据存储示例程序",GUILayout.Height(25));  
  21.        //姓名  
  22.        GUILayout.Label("姓名:"+mName,GUILayout.Height(25));  
  23.        //年龄  
  24.        GUILayout.Label("年龄:"+mAge,GUILayout.Height(25));  
  25.        //成绩  
  26.        GUILayout.Label("成绩:"+mGrade,GUILayout.Height(25));  
  27.           
  28.        //删除数据  
  29.        if(GUILayout.Button("清除数据",GUILayout.Height(25)))  
  30.        {  
  31.           PlayerPrefs.DeleteAll();  
  32.        }  
  33.           
  34.        //返回Scene0  
  35.        if(GUILayout.Button("返回场景",GUILayout.Height(25)))  
  36.        {  
  37.           Application.LoadLevel("Scene0");  
  38.        }  
  39.           
  40.     }  
  41. }  
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");
	   }
		
	}
}
      我们这里直接将脚本绑定到摄像机上,然后将项目编译,注意将两个场景放入编译序列,我们运行程序:



    

  • 4
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
目前最火、最具发展前景的专业游戏引擎 Unity 3D是什么?Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。 Unity3D的PC插件安装量达到2 亿 Unity全球注册用户已经达到200万,每月 Unity编辑器活跃开发者数量达到40万, Unity的PC插件安装量达到2亿! 未来游戏市场普遍呈现3D化 以手游市场为例,3D游戏占比达到80%,虽然现在还有不少2D游戏,但随着终端设备性能的提升和客户的需求增加,游戏市场最终会进入全面的3D化时代。Unity3D课程可以使你直接进入3D游戏开发领域,成为就业市场的宠儿。同时Unity3D也推出了开发2D游戏的插件,可以使我们从现在到未来都立于不败之地。 Unity 3D为什么这么火? ---真正的跨平台目前各个平台的游戏开发几乎没有通用性,开发iPhone上的游戏需要学习Objective C,开发Android上的游戏大多用Java,开发Windows Phone上的游戏用C#,……。如何只学习一种语言就能够开发出跨越多个平台的游戏呢?Unity3D使用底层Mono技术实现了真正的跨平台,而Mono是基于.NET框架开发的。他使我们使用一种语言就可以开发出基于各种平台的游戏,包括手机游戏(iPhone、Android、Windows Phone)、PC(Windows、Mac、Linux)、网页游戏(基于各种主流浏览器)、游戏机专用游戏(Wii、Xbox360、PS3) 现在Unity 3D的攻城狮的月薪基本上都在15000元以上,这是基础班,以后我再发精英班,学完后希望大家都可以找到年薪20万的工作。 这套是比较完整的课程,并且有实例课程,并且附带源码 并非其他只有基础的课程,没有实例! C#语言基础课程课时目录: 课时1 C#基础概述 课时2 创建一个C#文件 课时3 编译运行和控制台 课时4 创建你的第一个应用程序 课时5 变量 课时6 表达式 课时7 枚举 课时8 条件判断语句 课时9 for循环语句 课时10 while循环语句 课时11 函数 课时12 事件 课时13 C#进阶 课时14 类的概念 课时15 继承 课时16 MonoBehaviour 课时17 方法重写Overriding 课时18 方法重载Overloading 课时19 代理Delegates 课时20 单例设计模式Singletons 基础入门之进入Unity的世界 课时1 Unity介绍 课时2 Unity下载和安装 课时3 Unity 破解 课时4 Unity 什么是工程 课时5 Unity 学习过程介绍 课时6 Unity中的五种视图 课时7 Unity中的资源 课时8 Unity中的游戏物体 课时9 Unity中的组件Component 课时10 Unity中的场景Scene 课时11 场景中控制工具的使用 课时12 Unity中的本地坐标和世界坐标系 课时13 场景视图中的操作 课时14 向量 课时15 小结 基础入门之Roll-a-Ball滚动小球 课时1 Roll-A-Ball游戏介绍 课时2 了解基本集合体 课时3 创建游戏环境 课时4 给世界添加光 课时5 学习相机Camera 课时6 创建游戏主角 课时7 Unity中的刚体和碰撞器 课时8 Unity中的脚本编写 课时9 控制主角的移动 课时10 控制相机跟随 课时11 Transform组件 课时12 创建游戏中的食物 课时13 认识Prefab,完善场景中的食物 课时14 认识触发器 课时15 添加捡起食物功能 课时16 日志输出和错误调试 unity经典入门课程之C#基础实例讲解(打砖块实例) 课时1 开发工具Visual Studio Tools For Unity安装和介绍 课时2 项目效果预览,创建项目和第一个C#脚本 课时3 脚本挂载,控制台使用,变量声明和赋值,在舞台添加多个对象,使用脚本初始化对象 课时4 实例化方法高级应用,使用for循环语句创建多个砖块 课时5 课下作业-添加多行砖块 课时6 组件机制,刚体介绍,类型转换,函数返回值,发射小球功能实现 课时7 条件判断语句,鼠标按下事件处理,获取水平和垂直改变数值,改变对象位置,自动销毁对象 课时8 课程小结
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值