【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili
教程源地址:https://www.udemy.com/course/2d-rpg-alexdev/
本章节实现了音频的大小设置与保存加载
音频管理器
UI_VolumeSlider.cs
定义了 UI_VolumeSlider
类,用于处理与音频设置相关的 UI 滑块(Slider
)交互。
-
音量调整:
SliderValue(float _value)
方法根据滑块的值调整音量,利用audioMixer.SetFloat
设置音频混音器中指定参数(parametr
)的值。使用Mathf.Log10(_value) * multiplier
将滑块值转化为对数刻度,以平滑音量变化。
-
加载保存的音量设置:
LoadSlider(float _value)
方法将加载的音量值(如果值大于 0.001)应用到滑块上,避免音量翻转。
-
成员变量:
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
添加的部分!!!
这段代码包含了两个方法:LoadData
和 SaveData
,用于加载和保存游戏中的音量设置。它们的主要功能是处理音量设置的保存和加载机制,将音量设置保存在 GameData
对象中并能够恢复。
1. LoadData(GameData _data)
:
- 功能:加载音量设置并应用到 UI 滑块。
- 逻辑 :
- 遍历传入的
GameData
对象中的volumeSettings
字典,字典存储了音量设置的参数名和相应的值(如"masterVolume"
,"musicVolume"
等)。 - 对每一个音量设置项(
KeyValuePair<string, float>
),遍历volumeSettings
(UI 控件中的UI_VolumeSlider
实例),检查每个UI_VolumeSlider
的parametr
(音频参数名称)是否与保存的音量设置的参数名称相匹配。 - 如果匹配,就调用
UI_VolumeSlider
的LoadSlider
方法,将保存的音量值应用到相应的 UI 滑块上。
- 遍历传入的
2. SaveData(ref GameData _data)
:
- 功能 :保存当前的音量设置到
GameData
中。 - 逻辑 :
- 清空
GameData
对象中的volumeSettings
字典,以确保旧的音量设置不被遗留。 - 遍历
volumeSettings
(UI 控件中的UI_VolumeSlider
实例),获取每个滑块的值,并将其添加到volumeSettings
字典中。 - 每个滑块的
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);//保存音量设置
}
}
}