zoukankan      html  css  js  c++  java
  • 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();
        }
    }

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

    运行效果:

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

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

  • 相关阅读:
    C#递规与分治策略
    SuperMap Objects Java & Applet
    如何提高显示速度
    系统测试
    ora01033:oracle initialization or shutdown in progress
    ORA12535: TNS:operation timed out。
    oralce01033
    hsql初体验
    创建Oracle数据源失败
    转载地图优化
  • 原文地址:https://www.cnblogs.com/spiderljx/p/10943296.html
Copyright © 2011-2022 走看看