Unity中使用的四种存档和读档方式

这里会列举四种存档方式,并且以简单的项目展示出效果。

这里我会写的简单易懂些,希望大家学到的是存档与读档的逻辑。

1.第一种方式: Unity自带的存档方式

	       干货:PlayerPrefs:数据持久化方案。
	            采用键值对的方式对数据进行存储。
	           eg:PlayerPrefs.SetInt("Index",1); 
	            可以存储Int, Float, String类型的数据。
	           eg:PlayerPrefs.SetFloat("Height",183.5f); 
	          	  PlayerPrefs.SetString("Name","Tom");
	          	  获取数据:
	           eg:PlayerPrefs.GetInt("Index");
	           Serialization(序列化),可以用来将对象转化为字节流。
	           Deserialization(反序列化),可以用来将字节流转换为对象。

项目阐述:

       首先,我们在一个空项目中新建一个Toggle,并给Canvas添加一个 Audio Source 组件和一个脚本,脚本
名根据个人需求,(我这里是MusicManager)效果图如下:

音乐素材资源,百度网盘链接:https://pan.baidu.com/s/1201WQaMSr1NUgZcvcrzG1A
提取码:rvqq

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
代码部分:

   代码的功能就是:通过单选框是否被勾选上,从而来决定是否播放背景音乐。除此之外, 用Unity的 
PlayerPrefs 存储方案来记录我们的选择,当我们再次运行时,会展示我们上一次运行的结果。小伙伴们快点试试吧!
using UnityEngine.UI;
public class MusicManager : MonoBehaviour
{
   
    // 音乐开关单选框  和 播放背景音乐的 musicAudio 组件
    public Toggle musicToggle;
    public AudioSource musicAudio;
    private void Awake()
    {
   
      if (PlayerPrefs.HasKey("MusicOn"))
      {
   
         if (PlayerPrefs.GetInt("MusicOn") == 1)
            {
   
              //  当 单选框 勾选时, 激活 musicAudio 组件
                musicToggle.isOn = true;
                musicAudio.enabled = true;
            }
            else
            {
   
            //  当 单选框 未勾选时, 让 musicAudio 组件失活
                musicToggle.isOn = false;
                musicAudio.enabled = false;
            }
      }else
          {
   
            musicToggle.isOn = true;
          }
    }
    private void Update()
    {
   
        MusicSwitch();
    }
    private void MusicSwitch() {
   
         // 通过单选框是否被勾选上,从而来决定是否播放背景音乐
        if (musicToggle.isOn == false)
        {
   
            musicAudio.enabled = false;
            //   保存音乐开关的状态,   0代表暂停 1 代表播放
            PlayerPrefs.SetInt("MusicOn",0);  
        }
        else {
   
            musicAudio.enabled = true;
            PlayerPrefs.SetInt("MusicOn", 1);
        }
        PlayerPrefs.Save();
    }
}

最后,记得赋值:
在这里插入图片描述

2.第二种方式:二进制方法

         干货:二进制方法(Binary Formatter)
         序列化:新建或打开一个二进制文件,通过二进制格式器将对象写入该二进制文件。
         反序列化:打开待反序列化的二进制文件,通过二进制格式器将文件解析成对象。

项目阐述:

	项目百度网盘链接:链接:https://pan.baidu.com/s/1Xxn7yXTkFTEq65Vlz0tojg 提取码:9p4q 
剩余的三种方式都以该项目阐述。
参考博客:http://blog.csdn.net/y1196645376/article/details/52541882

Ps:项目百度网盘链接里面有半成品和成品,半成品没有保存和加载功能,这里不建议小伙伴们拿着半成品跟着我的博客做, 希望小伙伴们学的是一种存储的思路。
参考博客是一位大佬写的, 小伙伴们可以用Unity打开成品里面的GameManager脚本,参照着那篇博客食用。也可以接着看完。

项目介绍:

	 1.UI层面解锁:这个游戏是一个第一人称射击游戏,当我们控制鼠标发射子弹击中箱子后,射击数会增加,得分
会增加。
          1.1  当我们菜单栏显示时,即为游戏的暂停状态,游戏内的物品不可交互。不可射击,箱子不可生成。
          1.2  当我们每发射一次子弹,则发射数自增1,击中箱子后得分自增1.
     2.GameObject层面解锁:
          2.1 箱子  这里箱子用协程写了随机生成、随机生命周期(未被击中时)、击中后0.3s失活。
          2.2 箱子  这里箱子的种类有4种,红、橙、黄、绿,各个标志位之间的生成互不影响。种类编号0至3.
          2.3 箱子  这里箱子一共有5个标志位,从左至右序号为 0至4。
          2.4 枪    这里枪发射子弹的CD为1s一次,而箱子被击中后会在0.3s后消失,这就避免了每个箱子被击
中两次,从而避免了重复加分。

在这里插入图片描述

    3.逻辑层面解锁:
    	 3.1   先来给小伙们们理一下我们保存游戏的一个逻辑。
    	       当我们点击保存游戏后,比如说我们的射击数是30,得分是20,场景中第一个标志位处有一个红箱
子,最后一个标志位处有一个橙箱子。其余标准位没有箱子。
			   那么我们加载游戏时,场景中应当也是 射击数是30,得分是20  第一个标志位处有一个红箱子,
最后一个标志位处有一个橙箱子,其余标志位没有箱子。
			   这就是我们为什么给箱子设置标志位和种类的原因了,我们点击保存游戏后,存储当前箱子的标志
位和种类的具体值,(比如我们将所有的标志位放进一个数组中,让一个GameObject类型的字符持续接收该数组中已
激活的箱子,我们在用户点击保存游戏时,记录下该GameObject类型的字符)而当加载游戏被点击时,我们返回给用
户当初保存时的数据和游戏对象。

代码展示:首先是二进制方法

			   我们先是Save方法,用于存储当前游戏状态信息.
using System.Collections.Generic;

[System.Serializable]
public class Save
{
      
    public List<int> livingTargetPointions = new List<int>();
    public List<int> livingMonsterTypes = new List
  • 6
    点赞
  • 84
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值