官方说明:提供管理声音和声音组的功能,用户可以自定义一个声音的音量、是 2D 声音还是 3D 声音,甚至是直接绑定到某个实体上跟随实体移动。
混音器
如图,AudioMixer混音器Groups面板下的每一个物体都是一个group分组,每个group组的音量由其本身音量以及所有父层级分组的音量决定。
如图,每个音频资源都添加了混音器下的group组。当前分组为0,我们可以理解为Master是主音量分组,可以控制整体调节所有分组的音量。Music、Sound、UISound则是二级分组,可分别调整UI按钮音量,背景音量,以及音效音量。主音量分组的调整会影响到其下二级分组的音量。
我们先了解混音器的音量管理方式,这里以框架学习为主。
组件配置
组件需配置添加混音器
混音器里的分组需要和sound组件的分组名称一一对应,如果不对应会找不到,找不到则使用Master分组。
Sound Groups的属性如下:
AvoidBeingReplacedBySamePriority:声音组中的声音是否避免被同优先级声音替换
Mute:声音组是否静音
Volume:声音组音量
AgentHelperCount:声音代理辅助器数量
Sound Groups组里有一个AvoidBeingReplacedBySamePriority的属性,判断是否被同一优先级的声音替换,但是分组里面并没有优先级。
Demo中有三类声音,UI点击、游戏过程特效音、背景音。
对应的有三张配表,其中特效音和UI音有优先级,背景音没有优先级
接下来再看一下代码,SoundExtension类里面有三种调用不同声音类别的方法,背景音固定优先级给的64,其他两个则是根据读表获取。
public static int? PlayMusic(this SoundComponent soundComponent, int musicId, object userData = null)
{
soundComponent.StopMusic();
IDataTable<DRMusic> dtMusic = GameEntry.DataTable.GetDataTable<DRMusic>();
DRMusic drMusic = dtMusic.GetDataRow(musicId);
if (drMusic == null)
{
Log.Warning("Can not load music '{0}' from data table.", musicId.ToString());
return null;
}
PlaySoundParams playSoundParams = PlaySoundParams.Create();
playSoundParams.Priority = 64;
playSoundParams.Loop = true;
playSoundParams.VolumeInSoundGroup = 1f;
playSoundParams.FadeInSeconds = FadeVolumeDuration;
playSoundParams.SpatialBlend = 0f;
s_MusicSerialId = soundComponent.PlaySound(AssetUtility.GetMusicAsset(drMusic.AssetName), "MusicT", Constant.AssetPriority.MusicAsset, playSoundParams, null, userData);
return s_MusicSerialId;
}
调用接口
读表的方式参考数据表即可,下面看一下怎么播放声音、设置音量及相关的接口。
已下部分接口在SoundExtension扩展组件里面做了封装,部分是在SoundComponent里面,有特定需求可自己封装。
播放三种类型音乐:(记得需传入音乐ID)
播放背景音乐:GameEntry.Sound.PlayMusic(1);
播放特效音乐:GameEntry.Sound.PlaySound(m_AircraftData.DeadSoundId);
播放UI音乐:GameEntry.Sound.PlayUISound(uiSoundId);
停止音乐:
停止背景音乐:GameEntry.Sound.StopMusic();
通用停止音乐:GameEntry.Sound.StopSound(serialId);
设置音量:
GameEntry.Sound.SetVolume(“Sound”, volume);
获取音量:
GameEntry.Sound.GetVolume(“Sound”);
停止所有声音:
GameEntry.Sound.StopAllLoadedSounds(fadeOutSeconds);//声音淡出时间
GameEntry.Sound.StopAllLoadingSounds();
暂停:
GameEntry.Sound.PauseSound(serialId, fadeOutSeconds);
恢复:
GameEntry.Sound.ResumeSound(serialId, fadeOutSeconds);
静音:
GameEntry.Sound.Mute(soundGroupName, true);
是否静音:
GameEntry.Sound.IsMuted(soundGroupName);