Unity类银河战士恶魔城学习总结(P156 Audio Settings音频设置)

【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili

教程源地址:https://www.udemy.com/course/2d-rpg-alexdev/

本章节实现了音频的大小设置与保存加载

音频管理器

UI_VolumeSlider.cs

定义了 UI_VolumeSlider 类,用于处理与音频设置相关的 UI 滑块(Slider)交互。

  1. 音量调整

    • SliderValue(float _value) 方法根据滑块的值调整音量,利用 audioMixer.SetFloat 设置音频混音器中指定参数(parametr)的值。使用 Mathf.Log10(_value) * multiplier 将滑块值转化为对数刻度,以平滑音量变化。
  2. 加载保存的音量设置

    • LoadSlider(float _value) 方法将加载的音量值(如果值大于 0.001)应用到滑块上,避免音量翻转。
  3. 成员变量

    • slider:关联的 UI 滑块。
    • parametr:音频混音器中的参数名称。
    • audioMixer:用于音频混合的 AudioMixer 实例。
    • multiplier:用于音量计算的乘数。
cs 复制代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Audio;
using UnityEngine.UI;

//2024.12.2 from summer to winter
public class UI_VolumeSlider : MonoBehaviour
{
    public Slider slider;//滑块
    public string parametr;//音频混合器的参数

    [SerializeField] private AudioMixer audioMixer;//音频混合器
    [SerializeField] private float multiplier;//音量的倍数

    public void SliderValue(float _value) => audioMixer.SetFloat(parametr, Mathf.Log10(_value) * multiplier);//设置音量

    public void LoadSlider(float _value)//加载音量
    {
        if(_value >= 0.001f)//防止翻转
            slider.value = _value;
    }

}

UI.cs

添加的部分!!!

这段代码包含了两个方法:LoadDataSaveData,用于加载和保存游戏中的音量设置。它们的主要功能是处理音量设置的保存和加载机制,将音量设置保存在 GameData 对象中并能够恢复。

1. LoadData(GameData _data):

  • 功能:加载音量设置并应用到 UI 滑块。
  • 逻辑
    1. 遍历传入的 GameData 对象中的 volumeSettings 字典,字典存储了音量设置的参数名和相应的值(如 "masterVolume", "musicVolume" 等)。
    2. 对每一个音量设置项(KeyValuePair<string, float>),遍历 volumeSettings(UI 控件中的 UI_VolumeSlider 实例),检查每个 UI_VolumeSliderparametr(音频参数名称)是否与保存的音量设置的参数名称相匹配。
    3. 如果匹配,就调用 UI_VolumeSliderLoadSlider 方法,将保存的音量值应用到相应的 UI 滑块上。

2. SaveData(ref GameData _data):

  • 功能 :保存当前的音量设置到 GameData 中。
  • 逻辑
    1. 清空 GameData 对象中的 volumeSettings 字典,以确保旧的音量设置不被遗留。
    2. 遍历 volumeSettings(UI 控件中的 UI_VolumeSlider 实例),获取每个滑块的值,并将其添加到 volumeSettings 字典中。
    3. 每个滑块的 parametr(音频参数名称)作为字典的键,slider.value(滑块当前的值)作为字典的值,保存到 GameData 中。
cs 复制代码
    public void LoadData(GameData _data)
    {
        foreach(KeyValuePair<string,float> pair in _data.volumeSettings)//遍历音量设置
        {
            foreach (UI_VolumeSlider item in volumeSettings)
            {
                if (item.parametr == pair.Key)//如果音量设置的参数和保存的参数一致
                    item.LoadSlider(pair.Value);
            }
        }
    }



    public void SaveData(ref GameData _data)
    {
        _data.volumeSettings.Clear();//清空音量设置

        foreach (UI_VolumeSlider item in volumeSettings)//遍历音量设置
        {
            _data.volumeSettings.Add(item.parametr,item.slider.value);//保存音量设置
        }
    }
cs 复制代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class UI : MonoBehaviour,ISaveManager
{
    [Header("End screens")]
    [SerializeField] private UI_FadeScreen fadeScreen;
    [SerializeField] private GameObject endText;
    [SerializeField] private GameObject restartButton;
    [Space]

    [SerializeField] private GameObject characterUI;
    [SerializeField] private GameObject skillTreeUI;
    [SerializeField] private GameObject craftUI;
    [SerializeField] private GameObject optionsUI;
    [SerializeField] private GameObject inGameUI;

    //物品提示框和状态提示框
    public UI_SkillToolTip skillToolTip;
    public UI_ItemTooltip itemToolTip;
    public UI_StatToolTip statToolTip;
    public UI_CraftWindow craftWindow;

    [SerializeField] private UI_VolumeSlider[] volumeSettings;

    private void Awake()
    {
        SwitchTo(skillTreeUI);//2024年11月22日,P138 Skill Tree Hot Fix,启动时默认显示技能树界面
        fadeScreen.gameObject.SetActive(true);
    }


    void Start()
    {
        SwitchTo(inGameUI);

        itemToolTip.gameObject.SetActive(false);//戏启动时隐藏物品提示框和状态提示框
        statToolTip.gameObject.SetActive(false);
    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.C))
            SwitchWithKeyTo(characterUI);

        if (Input.GetKeyDown(KeyCode.B))
            SwitchWithKeyTo(craftUI);

        if (Input.GetKeyDown(KeyCode.K))
            SwitchWithKeyTo(skillTreeUI);

        if (Input.GetKeyDown(KeyCode.O))
            SwitchWithKeyTo(optionsUI);

    }

    public void SwitchTo(GameObject _menu)// 该方法用于切换到指定的UI界面
    {

        for (int i = 0; i < transform.childCount; i++)//遍历当前UI对象的所有子物体
        {
            bool fadeScreen = transform.GetChild(i).GetComponent<UI_FadeScreen>() != null;//检查UI界面是否有FadeScreens

            if (fadeScreen==false)
                transform.GetChild(i).gameObject.SetActive(false);//遍历并隐藏所有子元素,确保了在显示新的UI界面时,所有其他的UI界面都会被隐藏
               
        }


        if (_menu != null)//传入的菜单不为空
        {
            _menu.SetActive(true);//显示
        }
    }


    public void SwitchWithKeyTo(GameObject _menu)//处理切换UI的逻辑
    {
        if (_menu != null && _menu.activeSelf)// UI界面已经显示,隐藏, 如果目标UI界面未显示,调用 SwitchTo 显示。
        {
            _menu.SetActive(false);
            CheckForInGameUI();
            return;
        }

        SwitchTo(_menu);
    }



    private void CheckForInGameUI()//关闭其他UI都会回到InGameUI
    {
        for (int i = 0; i < transform.childCount; i++)//
        {
            //p152修复切换到其他UI时,InGameUI关闭的问题
            if (transform.GetChild(i).gameObject.activeSelf && transform.GetChild(i).GetComponent<UI_FadeScreen>() == null)//其他的UI全部关闭并且淡入淡出关闭
                return;
        }

        SwitchTo(inGameUI);
    }


    public void SwitchOnEndScreen()
    {

        fadeScreen.FadeOut();
        StartCoroutine(EndScreenCorutione());

    }

    IEnumerator EndScreenCorutione()
    {
        yield return new WaitForSeconds(1);
        endText.SetActive(true);
        yield return new WaitForSeconds(1.7f);
        restartButton.SetActive(true);
    }

    public void RestartGameButton() => GameManager.instance.RestartScene();

    public void LoadData(GameData _data)
    {
        foreach(KeyValuePair<string,float> pair in _data.volumeSettings)//遍历音量设置
        {
            foreach (UI_VolumeSlider item in volumeSettings)
            {
                if (item.parametr == pair.Key)//如果音量设置的参数和保存的参数一致
                    item.LoadSlider(pair.Value);
            }
        }
    }



    public void SaveData(ref GameData _data)
    {
        _data.volumeSettings.Clear();//清空音量设置

        foreach (UI_VolumeSlider item in volumeSettings)//遍历音量设置
        {
            _data.volumeSettings.Add(item.parametr,item.slider.value);//保存音量设置
        }
    }
}
相关推荐
码农老张Zy1 小时前
【PHP小课堂】学习PHP中的变量处理相关操作
android·开发语言·学习·php
IT古董1 小时前
【机器学习】机器学习的基本分类-监督学习-决策树-C4.5 算法
人工智能·学习·算法·决策树·机器学习·分类
IT古董1 小时前
【机器学习】机器学习的基本分类-监督学习-决策树-CART(Classification and Regression Tree)
学习·决策树·机器学习·分类
吾与谁归in1 小时前
【WPF中ControlTemplate 与 DataTemplate之间的区别?】
c#·wpf·template
吃着火锅x唱着歌4 小时前
PHP7内核剖析 学习笔记 第一章 PHP基础架构
笔记·学习·php
yngsqq5 小时前
Cad c#二次开发 常见错误
c#
测绘工程师5 小时前
[高等数学&学习记录] 泰勒公式
学习·高等数学
Lbs_gemini06037 小时前
C++研发笔记14——C语言程序设计初阶学习笔记12
c语言·开发语言·c++·笔记·学习
MC何失眠8 小时前
vulnhub靶场【哈利波特】三部曲之Fawkes
网络·python·学习·网络安全
MarisolHu8 小时前
前端学习笔记-Vue篇-02
前端·vue.js·笔记·学习