开始场景——音效数据逻辑
从这里开始到后面的三小节我们都将干一件很重要的事——数据存储,只有实现了数据存储才能在再次进入游戏时保持游戏数据不被丢失。
类图分析:数据管理类是一个大类,它其中关联了两个类(这两个类都是数据结构类,只存在字段):一个是音效数据类;另一个是排行榜数据类。其中的排行榜数据类又由排行榜单条数据类聚合而成,而数据管理类又会提供一系列函数给外部进行数据存储。
音效数据类
数据管理类
单例模式
初始化音效数据
当第一次进入游戏时对音效的初始化
先在MusicData脚本中加一个字段以判断是否是第一次加载数据
然后再在数据管理类中进行判断,如果是第一次,那就直接手动进行初始化。
每一次打开音乐设置面板,就要将其数据进行一次更新,在SettingPanel脚本中编写此逻辑。
更新数据的函数
重写虚函数
数据管理类中的成员方法
1.开关背景音乐
2.开关音效
3.改变背景音乐的大小
4.改变背景音效的大小
在SettingPanel中添加事件
直到当前MusicData、GameDataMgr、SettingPanel的代码如下
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MusicData
{
//是否开启背景音乐
public bool isOpenBK;
//是否开启音效
public bool isOpenSound;
//音乐大小
public float bkValue;
//音效大小
public float soundValue;
//是否是第一次进入游戏
public bool notFirst;
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class GameDataMgr
{
private static GameDataMgr instance = new GameDataMgr();
public static GameDataMgr Instance
{
get { return instance; }
}
public MusicData musicData;
private GameDataMgr()
{
//初始化数据
musicData = PlayerPrefsDataMgr.Instance.LoadData(typeof(MusicData), "Music") as MusicData;
rankData = PlayerPrefsDataMgr.Instance.LoadData(typeof(RankList), "Music") as RankList;
//判断是否是第一次进入游戏,如果是第一次,那么就通过代码来手动初始化数据
if (!musicData.notFirst)
{
musicData.notFirst = true;
musicData.isOpenBK = true;
musicData.isOpenSound = true;
musicData.bkValue = 1;
musicData.soundValue = 1;
//储存数据
PlayerPrefsDataMgr.Instance.SaveData(musicData, "Music");
}
}
//以下是提供给外部用于注册事件的函数
//开关背景音乐
public void OpenOrCloseBKMisic(bool isOpen)
{
musicData.isOpenBK = isOpen;
BKMusic.Instance.ChangeOpen(isOpen);
PlayerPrefsDataMgr.Instance.SaveData(musicData, "Music");
}
//开关音效
public void OpenOrCloseSound(bool isOpen)
{
musicData.isOpenSound = isOpen;
PlayerPrefsDataMgr.Instance.SaveData(musicData, "Music");
}
//改变背景音乐的大小
public void ChangeBKValue(float value)
{
musicData.bkValue = value;
BKMusic.Instance.ChangeValue(value);
PlayerPrefsDataMgr.Instance.SaveData(musicData, "Music");
}
//改变背景音效的大小
public void ChangeSoundValue(float value)
{
musicData.soundValue = value;
PlayerPrefsDataMgr.Instance.SaveData(musicData, "Music");
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
public class SettingPanel : BasePanel<SettingPanel>
{
//关联的各按钮控件
public CustomGUISlider sliderMusic;
public CustomGUISlider sliderSound;
public CustomGUIToggle toggleMusic;
public CustomGUIToggle toggleSound;
public CustomGUIButton btnExit;
void Start()
{
//事件监听
sliderMusic.changeValue += (value) => GameDataMgr.Instance.ChangeBKValue(value);
sliderSound.changeValue += (value) => GameDataMgr.Instance.ChangeSoundValue(value);
toggleMusic.changeValue += (value) => GameDataMgr.Instance.OpenOrCloseBKMisic(value);
toggleSound.changeValue += (value) => GameDataMgr.Instance.OpenOrCloseSound(value);
btnExit.clickEvent += () =>
{
HideMe();
if (SceneManager.GetActiveScene().name == "BeginScene")
{
BeginPanle.Instance.ShowMe();
}
};
HideMe();
}
//数据更新函数
public void UpdatePanelInfo()
{
//获得musicData这个变量的信息
MusicData data = GameDataMgr.Instance.musicData;
//对自己的变量进行赋值
sliderMusic.nowValue = data.bkValue;
sliderSound.nowValue = data.soundValue;
toggleMusic.isSel = data.isOpenBK;
toggleSound.isSel = data.isOpenSound;
}
//重写虚函数
public override void ShowMe()
{
base.ShowMe();
//在每次显示面板时就要更新数据
UpdatePanelInfo();
}
}