我们在使用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(); } }
接下来我们来看看文件结构(因为涉及到加载路径)
运行效果:
手机端的显示效果也一样,都可以实现游戏数据的存储和加载。
对于这次的文章,写的很简单,不够详细,多多见谅。