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