这里会列举四种存档方式,并且以简单的项目展示出效果。
这里我会写的简单易懂些,希望大家学到的是存档与读档的逻辑。
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