10.开始场景-音效数据逻辑
10.1 知识点
理清音效数据类要做存储的值
- 背景音乐是否开启
- 音效是否开启
- 背景音乐大小
- 音效音量
- 是否是第一次加载数据的标识
创建音效数据类型
/// <summary>
/// 音效数据类 用于存储音乐设置相关的信息
/// </summary>
public class MusicData
{
//背景音乐是否开启
public bool isOpenBK;
//音效是否开启
public bool isOpenSound;
//背景音乐大小
public float bkValue;
//音效音量
public float soundValue;
//加一个是否是第一次加载数据的标识
public bool notFirst;
}
理清游戏数据管理类的作用
游戏数据管理类用于管理游戏中的数据,包括读取、保存和更新数据,确保数据在游戏中正确地传递和使用。
创建游戏数据管理类,不继承 MonoBehaviour,实现游戏数据管理类单例,并在构造函数初始化读取音效数据,假如是否是首次进入游戏的逻辑
/// <summary>
/// 这个是游戏数据管理类 是一个单例模式对象
/// </summary>
public class GameDataMgr
{
//实现单例
private static GameDataMgr instance = new GameDataMgr();
public static GameDataMgr Instance { get => instance; }
//音效数据对象
public MusicData musicData;
//私有构造函数
private GameDataMgr()
{
//初始化游戏数据
//传入唯一key读取音效数据
musicData = PlayerPrefsDataMgr.Instance.LoadData(typeof(MusicData), "Music") as MusicData;
//如果第一次进入游戏 没有音效数据 那么所有的数据要不是false 要不是0 不太符合基本游戏需求 改成默认开 音量音效拉满
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 UpdatePanelInfo()
{
//我们面板上的信息都是根据 音效数据 更新的
MusicData data = GameDataMgr.Instance.musicData;
//设置面板内容
sliderMusic.nowValue = data.bkValue;
sliderSound.nowValue = data.soundValue;
togMusic.isSel = data.isOpenBK;
togSound.isSel = data.isOpenSound;
}
重写设置界面的显示面板函数,每次显示的时候更新音效数据
public override void ShowMe()
{
base.ShowMe();
//每次显示 面板时 顺便 把面板上的内容也更新了
UpdatePanelInfo();
}
在数据管理类里提供一些方法给外部使用,方便数据的改变存储
//开启或者关闭背景音乐
public void OpenOrCloseBKMusic(bool isOpen)
{
musicData.isOpenBK = 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;
//在这里控制场景上的背景音乐大小
//存储改变后的数据
PlayerPrefsDataMgr.Instance.SaveData(musicData, "Music");
}
//改变音效大小
public void ChangeSoundValue(float value)
{
musicData.soundValue = value;
//存储改变后的数据
PlayerPrefsDataMgr.Instance.SaveData(musicData, "Music");
}
在设置界面实现监听的具体逻辑
//监听对应的事件 处理逻辑
//处理音乐的变化
sliderMusic.changeValue += (value) => GameDataMgr.Instance.ChangeBKValue(value);
//处理音效的变化
sliderSound.changeValue += (value) => GameDataMgr.Instance.ChangeSoundValue(value);
//处理音乐开关
togMusic.changeValue += (value) => GameDataMgr.Instance.OpenOrCloseBKMusic(value);
//处理音效开关
togSound.changeValue += (value) => GameDataMgr.Instance.OpenOrCloseSound(value);
10.2 知识点代码
MusicData
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// 音效数据类 用于存储音乐设置相关的信息
/// </summary>
public class MusicData
{
//背景音乐是否开启
public bool isOpenBK;
//音效是否开启
public bool isOpenSound;
//背景音乐大小
public float bkValue;
//音效音量
public float soundValue;
//加一个是否是第一次加载数据的标识
public bool notFirst;
}
GameDataMgr
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// 这个是游戏数据管理类 是一个单例模式对象
/// </summary>
public class GameDataMgr
{
//实现单例
private static GameDataMgr instance = new GameDataMgr();
public static GameDataMgr Instance { get => instance; }
//音效数据对象
public MusicData musicData;
//排行榜数据对象
public RankList rankData;
//私有构造函数
private GameDataMgr()
{
//初始化游戏数据
//传入唯一key读取音效数据
musicData = PlayerPrefsDataMgr.Instance.LoadData(typeof(MusicData), "Music") as MusicData;
//如果第一次进入游戏 没有音效数据 那么所有的数据要不是false 要不是0 不太符合基本游戏需求 改成默认开 音量音效拉满
if( !musicData.notFirst )
{
musicData.notFirst = true;
musicData.isOpenBK = true;
musicData.isOpenSound = true;
musicData.bkValue = 1;
musicData.soundValue = 1;
//存储音效数据
PlayerPrefsDataMgr.Instance.SaveData(musicData, "Music");
}
//初始化 读取 排行榜数据
rankData = PlayerPrefsDataMgr.Instance.LoadData(typeof(RankList), "Rank") as RankList;
}
//提供一些方法给外部使用 方便数据的改变存储
//提供一个在排行榜中添加数据的方法
public void AddRankInfo(string name, int score, float time)
{
//添加单条数据
rankData.list.Add(new RankInfo(name, score, time));
//排序
rankData.list.Sort((a, b) => a.time < b.time ? -1 : 1);
//排序过后 移除10条以外的数据
//从尾部往前遍历 移除每一条
for (int i = rankData.list.Count - 1; i >= 10; i--)
{
rankData.list.RemoveAt(i);
}
//存储
PlayerPrefsDataMgr.Instance.SaveData(rankData, "Rank");
}
//开启或者关闭背景音乐
public void OpenOrCloseBKMusic(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");
}
}
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com