spider

导航

 

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

接下来我们来看看文件结构(因为涉及到加载路径)

运行效果:

手机端的显示效果也一样,都可以实现游戏数据的存储和加载。

对于这次的文章,写的很简单,不够详细,多多见谅。

 

posted on 2019-05-29 13:27  黑色spider  阅读(1458)  评论(0编辑  收藏  举报