分享

Unity3D 游戏引擎之游戏场景的切换与持久化简单数据的储存(十四)

 奔跑的瓦力 2015-04-27

 Unity3D 游戏引擎之游戏场景的切换与持久化简单数据的储存


 


 


 


 


  持久化简单的数据储存在Unity3D 中提供了一个简单有效的方法,如果之前的你做过Android的开发你会发现在Unity3D中持久化数据的储存和Android非常的想象。那么下面MOMO 将用一个简单有效的例子向大家介绍Unity3D中持久化数据。


首先我们须要熟悉一下Unity3D中的PlayerPrefs这个类。这个类中一共帮助我们封装了9个方法,用来数据的储存与读取。





举一个例子


 


  1. PlayerPrefs.SetString("key""value");   
  2. string str = PlayerPrefs.GetString("key""defaule"));   

 


我们发现它是以键值对的形式进行储存与读取,每一个Key对应一个Value,储存过后通过Key可以得到之前储存的Value。这里说一下GetString()方法中的第二个参数, 它代表默认值。意思是如果通过第一个参数的Key没有找到对应的Value的话GetString()方法就会返回我们写的第二个参数的默认值。怎么样?很简单吧~ 感觉和Android完全一样哈。





Unity3D默认的字体的 size 只有 16 ,这就意味了放在iPhone4 (960 X 640)上 字体会显示的非常小。字体的来源有很多,大家可以在互联网上下载,或者从自己的电脑中拷贝,在Mac电脑下字体放在 Finder -> 资源库 -> Fonts


 


















 


我们可以看见电脑中存在了很多字体,我这里随便选一个,将 华文仿宋.ttf 用鼠标拖动到Project中。





选中: 华文仿宋


FontSize 30 :毫无疑问是字体的大小,这里写30让字体几乎放大1倍。


Character:  设置字体的文字编码 Unicode  ASCLL 编码


Style:设置字体的风格,粗体 斜体


 








 












 


点击Cretae ->GUISkin 创建一个GUI的皮肤,将 华文仿宋 拖动到箭头所指向的方向。发现下面存在很多GUI皮肤相关控件设置的,可以在这里设置每一个高级控件~大家可以手动的修改一下看看效果哈。









 


 


 


 


游戏场景在游戏制作中是一个非常重要的部分,因为任何一款游戏都是由若干的场景组成,Unity3D的游戏场景做的非常贴心。





创建2个游戏场景,一个是scene0 一个是scene1 ,本章的目标是在第一个游戏场景中保存一些基本游戏数据,然后切换到第二个场景中显示第一个场景中保存的数据,实现场景的切换已经数据的储存。





在scene0中创建一个c# 脚本名称为Scene0Main.cs 将它绑定在摄像头中。


 


Scene0Main.cs


 


  1. using UnityEngine;   
  2. using System.Collections;   
  3.    
  4. public class Scene0Main : MonoBehaviour {   
  5.    
  6.     //储存数据的显示   
  7.     public string testStr;   
  8.     public string testInt;   
  9.     public string testFloat;   
  10.        
  11.     //GUI皮肤 为上面我们添加的皮肤   
  12.     //在外面用鼠标拖动上为它赋值   
  13.     public GUISkin fontSkin;   
  14.     //显示的图片   
  15.     public Texture Imagetexture;   
  16.         
  17.     // Use this for initialization   
  18.     void Start () {   
  19.         //读取key的值   
  20.         testStr = PlayerPrefs.GetString("testStr""default");   
  21.         testInt = PlayerPrefs.GetInt("testInt", 0).ToString();   
  22.         testFloat = PlayerPrefs.GetFloat("testFloat", 0).ToString();   
  23.            
  24.     }   
  25.        
  26.     // Update is called once per frame   
  27.     void Update () {   
  28.        
  29.     }   
  30.        
  31.        
  32.     void OnGUI() {   
  33.            
  34.         //将GUI的皮肤设置为我们创建的皮肤   
  35.         GUI.skin = fontSkin;   
  36.            
  37.         //贴上图片   
  38.         GUI.DrawTexture(new Rect((Screen.width - Imagetexture.width) >>1, 10, 120, 120), Imagetexture);   
  39.            
  40.         //添加输入框让用户输入信息,这里面我没有捕获异常,因为用户有可能输入一个不合法的数值   
  41.         testStr = GUI.TextField (new Rect(10, 200, 200, 50), testStr, 50);   
  42.         testInt = GUI.TextField (new Rect(10, 250, 200, 50), testInt, 50);   
  43.         testFloat = GUI.TextField (new Rect(10, 300, 200, 50), testFloat, 50);   
  44.            
  45.         //点击按钮保存所有数据   
  46.         if (GUI.Button(new Rect(220, 200, 150, 100), "commit all"))   
  47.         {   
  48.                
  49.             PlayerPrefs.SetString("testStr", testStr);   
  50.             PlayerPrefs.SetInt("testInt"int.Parse(testInt));   
  51.             PlayerPrefs.SetFloat("testFloat"float.Parse(testFloat));   
  52.             //切换场景到scene1   
  53.             Application.LoadLevel("scene1");   
  54.         }   
  55.     }   
  56.        
  57.        
  58. }   

 


 


 


Scene1Main.cs


 


  1. using UnityEngine;   
  2. using System.Collections;   
  3.    
  4. public class scene1Main : MonoBehaviour {   
  5.    
  6.     public string testStr;   
  7.     public string testInt;   
  8.     public string testFloat;   
  9.        
  10.     public GUISkin fontSkin;   
  11.     public Texture Imagetexture;   
  12.         
  13.     // Use this for initialization   
  14.     void Start () {   
  15.         testStr = PlayerPrefs.GetString("testStr""default");   
  16.         testInt = PlayerPrefs.GetInt("testInt", 0).ToString();   
  17.         testFloat = PlayerPrefs.GetFloat("testFloat", 0).ToString();   
  18.            
  19.     }   
  20.        
  21.        
  22.     void OnGUI() {   
  23.         GUI.skin = fontSkin;   
  24.            
  25.         GUI.DrawTexture(new Rect((Screen.width - Imagetexture.width) >>1, 10, 120, 120), Imagetexture);   
  26.            
  27.         //显示label   
  28.         GUI.Label(new Rect(10,150,300,50),"testStr = "+ testStr);   
  29.         GUI.Label(new Rect(10,200,300,50),"testInt = "+ testInt);   
  30.         GUI.Label(new Rect(10,250,300,50),"testFloat = "+ testFloat);   
  31.            
  32.         if (GUI.Button(new Rect(220, 200, 150, 100), "clean all"))   
  33.         {   
  34.             //删除所有键值   
  35.             PlayerPrefs.DeleteAll();   
  36.             // 返回场景0   
  37.             Application.LoadLevel("scene0");   
  38.         }   
  39.            
  40.         if (GUI.Button(new Rect(220, 320, 150, 100), "only return"))   
  41.         {   
  42.             // 返回场景0   
  43.             Application.LoadLevel("scene0");   
  44.         }   
  45.     }   
  46. }   

 


 


 


File -> Build Settings 点击Add Current添加场景,这一步很重要,如果不添加的话在代码中切换场景会抛异常,盆友们还得注意一下~


 


 















build and run 导出运行项目,如下图所示我分别输入string int float 三种类型的数据,然后点击commit all ,将所有数据全部保存下来,游戏场景切换到scene1场景中。


















 


切换到scene1中可以正常的显示scene0中储存的数值,点击clean all 将清空储存的所有信息后返回场景scene0,点击only return 直接返回场景scene0。


 












 





另外两个重要的方法


 





       
  1. //删除 PlayerPrefs 中某一个key的值  

  2.    
  3. PlayerPrefs. DeleteKey (“key”);  

  4.    
  5.   

  6.    
  7. //判断 PlayerPrefs中是否存在这个key  

  8.    
  9. bool b = PlayerPrefs.HasKey(“key”);  



 














最后欢迎各位盆友可以和MOMO一起讨论Unity3D游戏开发,总的来说这一章还是比较简单的,哇咔咔~~~ 附上Unity3D工程的下载地址,Xcode项目我就不上传了,须要的自己导出。





下载地址:http://down.51cto.com/data/283562




本文出自 “雨松MOMO的程序世界” 博客,请务必保留此出处http://xys289187120.blog.51cto.com/3361352/717337


     

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多