目录

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);//保存音量设置
        }
    }
}
本文是转载文章,点击查看原文
如有侵权,请联系 xyy@jishuzhan.net 删除
相关推荐
Amor风信子1 小时前
【大模型微调】如何解决llamaFactory微调效果与vllm部署效果不一致如何解决
人工智能·学习·vllm
虾球xz1 小时前
游戏引擎学习第220天
c++·学习·游戏引擎
努力奋斗的小杨2 小时前
学习MySQL的第八天
数据库·笔记·学习·mysql·navicat
New个大鸭2 小时前
ATEngin开发记录_4_使用Premake5 自动化构建跨平台项目文件
c++·自动化·游戏引擎
Var_al2 小时前
Unity 设置弹窗Tips位置
游戏·unity·c#
echola_mendes3 小时前
Streamlit性能优化:缓存与状态管理实战
学习
浅陌sss3 小时前
C#容器源码分析 --- Stack<T>
c#
专注VB编程开发20年4 小时前
C#.NET模拟用户点击按钮button1.PerformClick自动化测试
开发语言·自动化测试·c#·vb.net
小鱼计算机4 小时前
【5】深入学习npm-Nodejs开发入门
前端·学习·npm·node.js
web_Hsir5 小时前
CSS 学习01 定位、阴影与伪元素
前端·css·学习