Unity3D PlayerPrefs的使用

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


    大家好,我是秦元培,歡迎大家關注我的博客,我的博客地址是blog.csdn.net/qinyuanpei

         博主今天研究了在Unity3D中的數據持久化問題。數據持久化在任何一個開發領域都是一個值得關注的問題,小到一個應用中配置文件的讀寫,大到數據庫的管理維護,都可以看到數據持久化的身影。博主在《C#基於Linq和反射實現數據持久化框架Xml4DB》這篇文章中曾介紹了博主在寒假期間開發的Xml4DB框架,這是一個基於Xml的輕量級數據持久化框架,可以採用面向對象的方式來處理數據。數據持久化從某種意義上來說,就是序列化和反序列化化的過程。在.NET中我們可以將對象序列化爲Xml、Json、二進制。然後通過反序列化重新獲得對象。同樣,在Android中我們可以通過使用Preferences來存儲鍵值型數據來實現數據持久化(當然還有其它的方式,這裏只是爲了強調鍵值型數據)。那麼,在Unity3D中如何實現數據持久化呢?請大家跟隨我一起走進今天的文章:[Unity3D]Unity3D遊戲開發之數據持久化PlayerPrefs的使用

        首先我們來看兩段Unity3D中實現數據讀寫的簡單代碼吧:

[csharp] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. //保存數據  
  2. PlayerPrefs.SetString("Name",mName);  
  3. PlayerPrefs.SetInt("Age",mAge);  
  4. PlayerPrefs.SetFloat("Grade",mGrade)  
[csharp] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. //讀取數據  
  2. mName=PlayerPrefs.GetString("Name","DefaultValue");  
  3. mAge=PlayerPrefs.GetInt("Age",0);  
  4. mGrade=PlayerPrefs.GetFloat("Grade",0F);  

       通過上面兩段代碼,我們可以發現兩點:

       1、Unity3D中的數據持久化是以鍵值的形式存儲的,可以看作是一個字典。

       2、Unity3D中值是通過鍵名來讀取的,當值不存在時,返回默認值。

       目前,在Unity3D中只支持int、string、float三種數據類型的讀取,所以我們可以使用這三種數據類型來存儲簡單的數據。目前Unity3D中用於數據持久化的類爲layerPrefs,主要的類方法有:

[csharp] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  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確定的值.  
        好了,在瞭解layerPrefs的主要方法後,我們以一個具體的例子來學習Unity3D中數據持久化的實現,我們希望實現在一個場景中輸入信息以便在新場景中讀取信息。我們直接創建兩個場景,分別命名爲Scene0、Scene1(據說程序員數數都是從0開始的,哈哈),場景中保留主攝像機即可。接下來我們分別爲兩個場景編寫腳本:

        第一個場景的腳本:

[csharp] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  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. }  
          第二個場景的腳本:

[csharp] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  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. }  
      我們這裏直接將腳本綁定到攝像機上,然後將項目編譯,注意將兩個場景放入編譯序列,我們運行程序:


        好了,這就是今天的內容了,感謝大家關注我的博客!

       喜歡我的博客請記住我的名字:秦元培,我的博客地址是:blog.csdn.net/qinyuanpe

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章