本文最后更新于 2024-06-15T17:56:07+08:00
Audio模块 学习音频模块可以先去了解一下setting存档模块,不过存档也不难,直接看本文也是可以的。
Audio模块是用AudioMixer来管理音频并给音频分组的,其组件面板如下图所示。
能够看到AudioGroupConfigs可以音频配置数据,不过这里有一个误区,就是这个配置只影响TE框架内部,并不会帮你修改Unity中AudioMixer里的音量,所以要修改音量建议还是使用GameModule.Audio.MusicVolume和setting存档系统来搭配使用。
Audio在框架内的流程 在启动框架时有两个地方会配置音频,一个是ProcedureLaunch流程里,一个是AudioModule模块里。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 using TEngine;using YooAsset;using ProcedureOwner = TEngine.IFsm<TEngine.IProcedureManager>;namespace GameMain { public class ProcedureLaunch : ProcedureBase { public override bool UseNativeDialog => true ; protected override void OnEnter (ProcedureOwner procedureOwner ) { base .OnEnter(procedureOwner); UILoadMgr.Initialize(); InitLanguageSettings(); InitSoundSettings(); } protected override void OnUpdate (ProcedureOwner procedureOwner, float elapseSeconds, float realElapseSeconds ) { base .OnUpdate(procedureOwner, elapseSeconds, realElapseSeconds); ChangeState<ProcedureSplash>(procedureOwner); } private void InitLanguageSettings () { if (GameModule.Resource.PlayMode == EPlayMode.EditorSimulateMode && GameModule.Base.EditorLanguage == TEngineLanguage.Unspecified) { return ; } TEngineLanguage language = GameModule.Localization.Language; if (GameModule.Setting.HasSetting(Constant.Setting.Language)) { try { string languageString = GameModule.Setting.GetString(Constant.Setting.Language); language = (TEngineLanguage)System.Enum.Parse(typeof (TEngineLanguage), languageString); } catch (System.Exception exception) { Log.Error("Init language error, reason {0}" ,exception.ToString()); } } if (language != TEngineLanguage.English && language != TEngineLanguage.ChineseSimplified && language != TEngineLanguage.ChineseTraditional) { language = TEngineLanguage.English; GameModule.Setting.SetString(Constant.Setting.Language, language.ToString()); GameModule.Setting.Save(); } GameModule.Localization.Language = language; Log.Info("Init language settings complete, current language is '{0}'." , language.ToString()); } private void InitSoundSettings () { GameModule.Audio.MusicEnable = !GameModule.Setting.GetBool(Constant.Setting.MusicMuted, false ); GameModule.Audio.MusicVolume = GameModule.Setting.GetFloat(Constant.Setting.MusicVolume, 1f ); GameModule.Audio.SoundEnable = !GameModule.Setting.GetBool(Constant.Setting.SoundMuted, false ); GameModule.Audio.SoundVolume = GameModule.Setting.GetFloat(Constant.Setting.SoundVolume, 1f ); GameModule.Audio.UISoundEnable = !GameModule.Setting.GetBool(Constant.Setting.UISoundMuted, false ); GameModule.Audio.UISoundVolume = GameModule.Setting.GetFloat(Constant.Setting.UISoundVolume, 1f ); Log.Info("Init sound settings complete." ); } } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 using System.Collections.Generic;using UnityEngine;using UnityEngine.Audio;namespace TEngine { public class AudioModule : Module { [SerializeField ] private AudioMixer m_AudioMixer; [SerializeField ] private Transform m_InstanceRoot = null ; [SerializeField ] private AudioGroupConfig[] m_AudioGroupConfigs = null ; public IAudioModule AudioModuleImp; #region Public Propreties public AudioMixer MAudioMixer => m_AudioMixer; public Transform InstanceRoot { get => m_InstanceRoot; set => m_InstanceRoot = value ; } public float Volume { get => AudioModuleImp.Volume; set => AudioModuleImp.Volume = value ; } public bool Enable { get => AudioModuleImp.Enable; set => AudioModuleImp.Enable = value ; } public float MusicVolume { get => AudioModuleImp.MusicVolume; set => AudioModuleImp.MusicVolume = value ; } public float SoundVolume { get => AudioModuleImp.SoundVolume; set => AudioModuleImp.SoundVolume = value ; } public float UISoundVolume { get => AudioModuleImp.UISoundVolume; set => AudioModuleImp.UISoundVolume = value ; } public float VoiceVolume { get => AudioModuleImp.VoiceVolume; set => AudioModuleImp.VoiceVolume = value ; } public bool MusicEnable { get => AudioModuleImp.MusicEnable; set => AudioModuleImp.MusicEnable = value ; } public bool SoundEnable { get => AudioModuleImp.SoundEnable; set => AudioModuleImp.SoundEnable = value ; } public bool UISoundEnable { get => AudioModuleImp.UISoundEnable; set => AudioModuleImp.UISoundEnable = value ; } public bool VoiceEnable { get => AudioModuleImp.VoiceEnable; set => AudioModuleImp.VoiceEnable = value ; } #endregion void Start () { if (AudioModuleImp == null ) { AudioModuleImp = ModuleImpSystem.GetModule<AudioModuleImp>(); } if (m_InstanceRoot == null ) { m_InstanceRoot = new GameObject("AudioModule Instances" ).transform; m_InstanceRoot.SetParent(gameObject.transform); m_InstanceRoot.localScale = Vector3.one; } AudioModuleImp.Initialize(m_AudioGroupConfigs, m_InstanceRoot, m_AudioMixer); } public void Restart () { AudioModuleImp.Restart(); } public AudioAgent Play (AudioType type, string path, bool bLoop = false , float volume = 1.0f , bool bAsync = false , bool bInPool = false ) { return AudioModuleImp.Play(type, path, bLoop, volume, bAsync, bInPool); } public void Stop (AudioType type, bool fadeout ) { AudioModuleImp.Stop(type, fadeout); } public void StopAll (bool fadeout ) { AudioModuleImp.StopAll(fadeout); } public void PutInAudioPool (List<string > list ) { AudioModuleImp.PutInAudioPool(list); } public void RemoveClipFromPool (List<string > list ) { AudioModuleImp.RemoveClipFromPool(list); } public void CleanSoundPool () { AudioModuleImp.CleanSoundPool(); } } }
顺序是先AudioModule里配置AudioGroupConfigs数据给TE框架
然后再ProcedureLaunch流程里修改AudioMixer的音量和TE框架里的音频开关,并将修改存档
Audio类图 类图里虽然有很多内容,但我做了一个简单的分类,上半部分主要是管理音频的方法,下半部分主要是负责音频的一些数据