我們在使用u3d開發一些單機游戲的過程中,都會涉及到游戲數據的存單和加載。一般情況下,如果存儲的數據不復雜,我們就可以用PlayerPrefs,但有時涉及到的數據更加復雜,使用PlayerPrefs難於應付,所以可以選擇使用序列化的方式實現對游戲數據的存檔。以下我通過小案列來實現加載數據和存檔數據。
首先,我們先來建立一個腳本,這個腳本是游戲數據的載體,可以用來序列化。代碼如下:
using System; using System.Collections; using System.Collections.Generic; using System.IO; using System.Runtime.Serialization.Formatters.Binary; using UnityEngine; [System.Serializable] public class Gamedata { // 三個游戲數據 public int data1; public string data2; public bool data3; // 單例模式 private Gamedata() { data1=0; // 分值 data2 = "林洛殤"; // 昵稱 data3 = true; // 是否獲得【埃及寶石】 } // 對象 private static Gamedata gamedata; //接口1 public static Gamedata GetGamedataInstance() { if (gamedata == null ) { gamedata=new Gamedata(); } return gamedata; } //接口2 public static void SetGamedataInstance (BinaryFormatter bf,FileStream fs) { gamedata = (Gamedata) bf.Deserialize(fs); } }
下一個是用來保存、加載游戲數據和在面板上顯示游戲數據。
using System; using System.Collections; using System.Collections.Generic; using System.Net; using UnityEngine; using System.IO; using System.Runtime.Serialization.Formatters.Binary; using UnityEngine.UI; public class Gamedatasava_load : MonoBehaviour { public Text data1; public Text data2; public Text data3; private string datapath; void Start() { DontDestroyOnLoad(this); Setpath(); // 根據平台設置路徑 Loaddata(); //加載數據 } void Update() { if (Input.GetMouseButtonDown(0)) { Gamedata.GetGamedataInstance().data1++; } if (Input.GetMouseButtonDown(1)) { Gamedata.GetGamedataInstance().data3 = !Gamedata.GetGamedataInstance().data3; } if (Input.GetMouseButtonDown(2)) { Gamedata.GetGamedataInstance().data2 += "洛"; } } /// <summary> /// 將數據加載到面板上 /// </summary> public void OnGUI() { data1.text = ""+Gamedata.GetGamedataInstance().data1; data2.text = ""+Gamedata.GetGamedataInstance().data2; data3.text = ""+Gamedata.GetGamedataInstance().data3; } /// <summary> /// 保存游戲數據 /// </summary> public void Savadata() { BinaryFormatter bf=new BinaryFormatter(); if (File.Exists(datapath)) { File.Delete(datapath); } FileStream fs=new FileStream(datapath,FileMode.Create); bf.Serialize(fs,Gamedata.GetGamedataInstance()); fs.Close(); } /// <summary> /// 加載游戲數據 /// </summary> public void Loaddata() { // 判斷路徑上是否有文件 if (File.Exists(datapath)) { BinaryFormatter bf=new BinaryFormatter(); FileStream fs=new FileStream(datapath ,FileMode.Open); Gamedata.SetGamedataInstance(bf,fs); fs.Close(); } } void Setpath() { if (Application.platform == RuntimePlatform.Android) { datapath = Application.persistentDataPath + "/Gamedata.gb"; } if (Application.platform == RuntimePlatform.WindowsEditor) { datapath = Application.streamingAssetsPath + "/Gamedata.gb"; } } private void OnDestroy() { Savadata(); } }
最后一個是用來掛載在按鈕上,用於退出游戲,相當簡單。
using System; using System.Collections; using System.Collections.Generic; using UnityEngine; public class Quit : MonoBehaviour { public void Click () { Application.Quit(); } }
接下來我們來看看文件結構(因為涉及到加載路徑)
運行效果:
手機端的顯示效果也一樣,都可以實現游戲數據的存儲和加載。
對於這次的文章,寫的很簡單,不夠詳細,多多見諒。