今天给自己测试项目添加音效(音效找了好N,免费的甚少,基本收费,对于我们开发测试项目实属不便,找了几个免费的将就着用)。
音量控制类型
游戏里的设置都会有:
- 整体音量
- 背景音乐音量
- 游戏音效音量
的三种音量控制。
Unity的音效系统我也没接触过,那就边学边用吧。
百度找了一篇讲解得不错得实用教程:Unity AudioMixer 之 Mixer使用及统一管理音量
我也就按里面得方式来实现得。
需要用到得组件、类
- AudioMixer
- AudioSource
组件作用:
AudioMixer
AudioMixer创建资源,Project视图->右键->Create->Audio Mixer,如下图:
它得作用,你可以理解就时音源播放前得混合处理器,里面可以给Group添加各种Sound Effect(我没去一个一个测试,但我知道Pitch可以控制播放音源得频率,可以加快、或时减慢,从而实现降调、与升调得效果,一般汽车引擎声,可以根据速度来控制pitch实现引擎声得降调、升调效果音)
这里我就不全部说明作用,对Group重点说吧(我刚刚才用,也不熟悉):
- 先打开AudioMixer得窗口,可以从菜单栏->Window->Audio->AudioMixer,或时Ctrl + 8快捷键打开
- 选择Project视图下得AudioMixer资源,然后AudioMixer窗口将会显示该AudioMixer的编辑信息
如下图:
左边信息中,有个Group,就是我们关注的,Group就是分组的意思。
而AudioSource有个outputAudioMixerGroup,正式这个Group。
默认会有一个叫:Master的Group,不能删,也不能重命名的。
在Group栏的右上角有个"+"号,添加可以添加想要的分组。
然后命名号Group的名称,我添加了:BGM, EFF,两个,分别用于控制背景音乐、游戏音效的两个分组Group,如下图:
然后我们先选中BGM的分组,如下:
这时Inspector视图会显示该分组的各个属性,里面有一个叫:“Attenuation”(衰减)栏下,有个叫"Volume"(音量)的数据Slider控件(滑动条控件),如下图
我们鼠标右键对准这个"Volume"的标签,右键,在弹出的菜单中选择"Expose’Volume(of BGM)’ to script"(将BGM的Volume属性暴露给脚本的意思),同样的方法,我们将:Master、EFF的分组的Volume都暴露一下。
这时再回到"AudioMixer"窗口
发现右上角显示:"Exposed Parameters (3)“的选项,点击一下,会列出各个暴露出来的Volume,再右键对着你想要重命名的选项,选"Rename”,分别该未MASTER_Volume, BGM_Volume, EFF_Volume。
重点的音量设置:
这三个属性,可以在脚本(C#)中通过:AudioMixer.SetFloat(“BGM_Volume”, float);来设置值即可,float的音量范围是:-80.0f~20.0f
AudioSource
前面我们对AudioMixer有所了解了,AudioSource是对AudioClip播放得一个组件
所以我们在让AudioSource播放前,要设置好他的:AudioClip属性(就是Project中的各种:mp3,wav,ogg,等音频文件)。
这样就可以播放了。
我们这里重点时关注音量,所以AudioSource还有一个属行要重点设置一下:AudioMixerGroup,在Inspector中,叫:Output,如下图:
该AudioSource的Output属性,还是和之前说明一样,就是AudioSource在输出音频数据前,可以通过Output,处理一下,再输出,这个Output就是AudioMixerGroup(就是我们在AudioMixer窗口中给Group添加的分组)
在脚本中叫:outputAudioMixerGroup,及:AudioSource类中得:outputAudioMixerGroup。
该对象我们可以通过在:AudioMixer.FindMatchingGroups(“BGM”)[0];的API来获取我们在AudioMixer窗口下编辑添加的"BGM"Group分组。
通过下面代码就可以对一个AudioSource.outputAudioMixerGroup设置
AudioSource.outputAudioMixerGroup = AudioMixer.FindMatchingGroups("YourGroupName")[0]; // YourGroupName就是你的分组名称
这样AudioSource.Play()时就会应用上AudioMixer的Attenuation的Volume音量设置。(当然AudioSource本身也有Volume设置的,但那时针对某个文件的特殊处理,我们这里了解统一设置就好了)
好了,上面讲到了AudioMixer的Group如何设置Volume,并暴露API给AudioSource,在脚本中统一处理音量,下面我们看看完整的代码吧。
Code
using Unity.Collections;
using UnityEngine;
using UnityEngine.Audio;
/// <summary>
/// author : jave.lin
/// date : 2020.02.15
/// 音效管理
/// </summary>
public class GlobalAudioManager : MonoBehaviour
{
private static GlobalAudioManager instance;
public static GlobalAudioManager Instance() => instance;
[Header("背景音乐与音效的混合器")]
public AudioMixer Mixer;
[Header("当前正在播放的BGM")]
[SerializeField] [ReadOnly] private AudioSource playing_BGM;
[Header("Testing")]
[SerializeField] [Range(-80f, 20f)] private float master_volume = -10;
[SerializeField] [Range(-80f, 20f)] private float bgm_volume = -10;
[SerializeField] [Range(-80f, 20f)] private float eff_volume = -10;
private void Awake()
{
if (instance != null) Debug.LogError($"{GetType().Name} instance already exsit.");
instance = this;
DontDestroyOnLoad(this);
}
private void Start()
{
PlayBGM(GetComponent<AudioSource>()); // 测试用
}
// 这里做测试用,我就放到update中实时更新,正式使用可以在设置的UI面板中的音量的滑动条改动时再设置就好了
private void Update()
{
SetMASTER_Volume(master_volume);
SetBGM_Volume(bgm_volume);
SetEFF_Volume(eff_volume);
}
// 重播BGM
public void RestartBGM()
{
if (playing_BGM != null)
{
playing_BGM.time = 0;
}
}
// 播放BGM
public void PlayBGM(AudioSource bgm)
{
if (playing_BGM != null) playing_BGM.Stop();
playing_BGM = bgm;
playing_BGM.outputAudioMixerGroup = Mixer.FindMatchingGroups("BGM")[0];
playing_BGM.Play();
}
// 播放EFF
public void PlayEff(AudioSource eff)
{
eff.outputAudioMixerGroup = Mixer.FindMatchingGroups("EFF")[0];
eff.Play();
}
// 获取MASTER音量
public float GetMASTER_Volume()
{
Mixer.GetFloat("MASTER_Volume", out float value);
return value;
}
// 设置MASTER音量
public void SetMASTER_Volume(float value)
{
Mixer.SetFloat("MASTER_Volume", Mathf.Clamp(value, -80, 20));
}
// 获取BGM音量
public float GetBGM_Volume()
{
Mixer.GetFloat("BGM_Volume", out float value);
return value;
}
// 设置BGM音量
public void SetBGM_Volume(float value)
{
Mixer.SetFloat("BGM_Volume", Mathf.Clamp(value, -80, 20));
}
// 获取EFF音量
public float GetEFF_Volume()
{
Mixer.GetFloat("EFF_Volume", out float value);
return value;
}
// 设置EFF音量
public void SetEFF_Volume(float value)
{
Mixer.SetFloat("EFF_Volume", Mathf.Clamp(value, -80, 20));
}
}
最后运行,我们就可以在Inspector中,测试统一的整体音量、背景音乐音量、游戏音效音量,三个属性统一管理了