Unity3D游戲開發(fā)數(shù)據(jù)持久化PlayerPrefs的用法詳解
小編今天研究了在Unity3D中的數(shù)據(jù)持久化問題。數(shù)據(jù)持久化在任何一個開發(fā)領域都是一個值得關注的問題,小到一個應用中配置文件的讀寫,大到數(shù)據(jù)庫的管理維護,都可以看到數(shù)據(jù)持久化的身影。小編在《C#基于Linq和反射實現(xiàn)數(shù)據(jù)持久化框架Xml4DB》這篇文章中曾介紹了博主在寒假期間開發(fā)的Xml4DB框架,這是一個基于Xml的輕量級數(shù)據(jù)持久化框架,可以采用面向對象的方式來處理數(shù)據(jù)。數(shù)據(jù)持久化從某種意義上來說,就是序列化和反序列化化的過程。在.NET中我們可以將對象序列化為Xml、Json、二進制。然后通過反序列化重新獲得對象。同樣,在Android中我們可以通過使用Preferences來存儲鍵值型數(shù)據(jù)來實現(xiàn)數(shù)據(jù)持久化(當然還有其它的方式,這里只是為了強調鍵值型數(shù)據(jù))。那么,在Unity3D中如何實現(xiàn)數(shù)據(jù)持久化呢?請大家跟隨我一起走進今天的文章:[Unity3D]Unity3D游戲開發(fā)之數(shù)據(jù)持久化PlayerPrefs的使用
首先我們來看兩段Unity3D中實現(xiàn)數(shù)據(jù)讀寫的簡單代碼吧:
//保存數(shù)據(jù) PlayerPrefs.SetString("Name",mName); PlayerPrefs.SetInt("Age",mAge); PlayerPrefs.SetFloat("Grade",mGrade)
//讀取數(shù)據(jù) mName=PlayerPrefs.GetString("Name","DefaultValue"); mAge=PlayerPrefs.GetInt("Age",0); mGrade=PlayerPrefs.GetFloat("Grade",0F);
通過上面兩段代碼,我們可以發(fā)現(xiàn)兩點:
1、Unity3D中的數(shù)據(jù)持久化是以鍵值的形式存儲的,可以看作是一個字典。
2、Unity3D中值是通過鍵名來讀取的,當值不存在時,返回默認值。
目前,在Unity3D中只支持int、string、float三種數(shù)據(jù)類型的讀取,所以我們可以使用這三種數(shù)據(jù)類型來存儲簡單的數(shù)據(jù)。目前Unity3D中用于數(shù)據(jù)持久化的類為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中數(shù)據(jù)持久化的實現(xiàn),我們希望實現(xiàn)在一個場景中輸入信息以便在新場景中讀取信息。我們直接創(chuàng)建兩個場景,分別命名為Scene0、Scene1(據(jù)說程序員數(shù)數(shù)都是從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數(shù)據(jù)存儲示例程序",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))); //提交數(shù)據(jù) if(GUILayout.Button("提交數(shù)據(jù)",GUILayout.Height(25))) { //保存數(shù)據(jù) 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 () { //讀取數(shù)據(jù) mName=PlayerPrefs.GetString("Name","DefaultValue"); mAge=PlayerPrefs.GetInt("Age",0); mGrade=PlayerPrefs.GetFloat("Grade",0F); } void OnGUI() { GUILayout.Label("Unity3D數(shù)據(jù)存儲示例程序",GUILayout.Height(25)); //姓名 GUILayout.Label("姓名:"+mName,GUILayout.Height(25)); //年齡 GUILayout.Label("年齡:"+mAge,GUILayout.Height(25)); //成績 GUILayout.Label("成績:"+mGrade,GUILayout.Height(25)); //刪除數(shù)據(jù) if(GUILayout.Button("清除數(shù)據(jù)",GUILayout.Height(25))) { PlayerPrefs.DeleteAll(); } //返回Scene0 if(GUILayout.Button("返回場景",GUILayout.Height(25))) { Application.LoadLevel("Scene0"); } } }
我們這里直接將腳本綁定到攝像機上,然后將項目編譯,注意將兩個場景放入編譯序列,我們運行程序:
相關文章
Unity的AssetPostprocessor?Model動畫函數(shù)使用案例深究
這篇文章主要介紹了Unity的AssetPostprocessor?Model動畫函數(shù)使用案例的深入解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-08-08