Unity 3D 之通過序列化來存檔游戲數據


我們在使用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();
    }
}

接下來我們來看看文件結構(因為涉及到加載路徑)

運行效果:

手機端的顯示效果也一樣,都可以實現游戲數據的存儲和加載。

對於這次的文章,寫的很簡單,不夠詳細,多多見諒。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM