10.游戏数据管理器和音效数据逻辑

10.开始场景-音效数据逻辑


10.1 知识点

理清音效数据类要做存储的值

  1. 背景音乐是否开启
  2. 音效是否开启
  3. 背景音乐大小
  4. 音效音量
  5. 是否是第一次加载数据的标识

创建音效数据类型

/// <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

×

喜欢就点赞,疼爱就打赏