前段时间出的双人成行,让我和对象狗脑子差点打出来,
这不趁着对象睡着了,赶紧来分析一波这游戏的声音系统。
双人成行的音效设置里面,将所有的声音分为了两块:
并且加上了 “主音量” 选项,总的控制这两个声音的大小。
我们在做项目时,经常也会遇到控制音量的需求, 最基础的做法是查找需要控制的AudioSource,挨个去控制音量。
这样是做最通俗易懂的,但随着不同种类的AudioSource越来越多,控制会变得越来越繁琐。 那下面介绍我们今天的Unity自带工具:Audio Mixer, 来看看是不是可以方便的控制项目音效,优雅的书写代码。
我们看到双人成行的设置界面,将音效分为:
我们再拆分可以分为这几个基础部分:
那我们能否有强大的工具, 完成如下功能呢:
我们想实现上面的功能,希望上层控制下层, 一层层向下进行控制。
那树状图,向下分级、分层次的控制,是不是很好的一个解决思路? 我们来看一下根据这个思路,最终建好的AudioMixer:
MasterMixer,是所有音效组的父节点,我们可以控制它的音量,来达到控制全局音量的效果。即所有音效,都受到它自身以上所有父节点的控制,类似Unity的transform。
TalkMixer,是对话音效的组,在MasterMixer之下,受到MasterMixer的控制。
MusicMixer,是音乐组,我们看到下方Groups里有很多音效,音效最上方父物体是Master。那就意味着我们既可以单独控制每个音效的大小,也可以控制Master音量大小,达到控制这个组音量大小的目的。
下面我们来实际做一下,如何通过这样的配置,达到控制项目音效的目的。
大家也可以添加文末vx,获得源码工程。
导入我们的音乐资源。 后面我们会通过 Resources 加载播放。
我们看到上图中的MasterMixer、MusicMixer、TalkMixer,是三个AudioMixer,AudioMixer可在Assets中右键创建。
1️⃣建立AudioMixer:
Assets中AudioMixer的样子:
2️⃣调整节点位置 我们在Assets中建好后,MasterMixer作为根节点,我们要将剩下的两个作为它的子节点。
3️⃣增加Groups下音效 选中MusicMixer,我们将音效添加进去,注意节点位置!
建好了Audio Mixer,代码还不能直接操作。
就像我们的动画状态机一样,我们需要先知道里面的MusicMixer叫什么名字,才能通过代码找到它,对它进行操作。
MusicMixer:
因为我们只想控制主音效、对话音量、音乐音量, 因此我们只设置MasterMixer、MusicMixer、TalkMixer这三个音效组的参数就好了。 以MasterMixer为例:
其他两个同样的操作,完成参数暴露。
即在项目中,给这些基础部分声音创建AudioSource, 后面就在这些 AudioSource上,播放对应类别的声音。
Audio Mixer 的使用思路:
1️⃣创建基础声音播放源
因为我们将所有声音分为了对话声音、背景音乐…这五部分, 因此我们创建5个AudioSource,后面就用这些不同的AudioSource播放对应的音乐。
全部取消PlayOnAwake,取消Loop。背景音乐需勾选Loop UI效果如下:
2️⃣赋值对应的 MusicMixer
下方Assets里拖拽的,就是我们刚才创建的MusicMixer。 将它们拖到对应的位置去即可。
效果如下图所示:
下面代码用于赋值给左侧按钮,用于点击播放音效。
using UnityEngine;
using UnityEngine.UI;
public class AudioPlayCon : MonoBehaviour
{
//赋值我们创建的AudioSource
public AudioSource[] audioSources;
//赋值我们创建的Btn
public Button[] audioBtn;
void Start()
{
audioBtn[0].onClick.AddListener(() =>
{
audioSources[0].clip ??= Resources.Load<AudioClip>("myTalkMusic");
audioSources[0].Play();
});
audioBtn[1].onClick.AddListener(() =>
{
audioSources[1].clip ??= Resources.Load<AudioClip>("myBackgroundMusic");
audioSources[1].Play();
});
audioBtn[2].onClick.AddListener(() =>
{
audioSources[2].clip ??= Resources.Load<AudioClip>("myUIMusic");
audioSources[2].Play();
});
audioBtn[3].onClick.AddListener(() =>
{
audioSources[3].clip ??= Resources.Load<AudioClip>("myEntityMusic");
audioSources[3].Play();
});
audioBtn[4].onClick.AddListener(() =>
{
audioSources[4].clip ??= Resources.Load<AudioClip>("myAnimalMusic");
audioSources[4].Play();
});
}
}
现在我们运行游戏,点击左侧按钮,应该可以听到声音了。
那么接下来,我们给上面的滑动条配置代码,做到拖动滑动条,改变音量的效果。
我们的滑动条,是控制“喇叭”Audio Mixer,输入要控制的参数和数值, 做到控制音效的效果。
using UnityEngine;
using UnityEngine.Audio;
public class MixerCon : MonoBehaviour
{
public AudioMixer masterMixer;
public AudioMixer musicMixer;
public AudioMixer talkMixer;
//下方函数使用Dynamic float的方式,赋值给我们的slider
// 控制主音量大小
public void SetMasterMixerVolume(float volume)
{
// MasterVolume为我们暴露出来的Master的参数
masterMixer.SetFloat("MasterMixer", volume);
}
// 控制说话音量
public void SetTalkMixerlume(float volume)
{
talkMixer.SetFloat("TalkMixer", volume);
}
// 控制音乐音量
public void SetMusicMixerVolume(float volume)
{
musicMixer.SetFloat("MusicMixer", volume);
}
}
因为我们看到MusicMixer的声音阈值,在-80-20分贝之间, 因此我们给滑动条的MinValue和MaxValue,都设置-80、20
AudioMixer创建部分:
UI播放部分:
滑动条控制部分: 1、控制的是每个AudioMixer音量大小,即可做到控制项目不同种类音乐大小的目的。 2、子节点AudioMixer受父节点AudioMixer控制。 因为我们的拖拽关系,其余AudioMixer都是MasterMixer的子节点,因此MasterMixer可控制全局音量。 控制代码:
masterMixer.SetFloat("MasterMixer", volume);
该篇文章作为 《GameFramework》 框架的基础知识, 想提升自己,学习Unity框架的可以了解一下 《GameFramework》 ~