TEngine--Audio模块

Audio模块

学习音频模块可以先去了解一下setting存档模块,不过存档也不难,直接看本文也是可以的。

Audio模块是用AudioMixer来管理音频并给音频分组的,其组件面板如下图所示。

Audio模块

能够看到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
{
/// <summary>
/// 流程 => 启动器。
/// </summary>
public class ProcedureLaunch : ProcedureBase
{
public override bool UseNativeDialog => true;

protected override void OnEnter(ProcedureOwner procedureOwner)
{
base.OnEnter(procedureOwner);

//热更新UI初始化
UILoadMgr.Initialize();

// 语言配置:设置当前使用的语言,如果不设置,则默认使用操作系统语言
InitLanguageSettings();

// 声音配置:根据用户配置数据,设置即将使用的声音选项
InitSoundSettings();
}

protected override void OnUpdate(ProcedureOwner procedureOwner, float elapseSeconds, float realElapseSeconds)
{
base.OnUpdate(procedureOwner, elapseSeconds, realElapseSeconds);

// 运行一帧即切换到 Splash 展示流程
ChangeState<ProcedureSplash>(procedureOwner);
}

private void InitLanguageSettings()
{
if (GameModule.Resource.PlayMode == EPlayMode.EditorSimulateMode && GameModule.Base.EditorLanguage == TEngineLanguage.Unspecified)
{
// 编辑器资源模式直接使用 Inspector 上设置的语言
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
{
/// <summary>
/// 音效管理,为游戏提供统一的音效播放接口。
/// </summary>
/// <remarks>场景3D音效挂到场景物件、技能3D音效挂到技能特效上,并在AudioSource的Output上设置对应分类的AudioMixerGroup</remarks>
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

/// <summary>
/// 音频混响器。
/// </summary>
public AudioMixer MAudioMixer => m_AudioMixer;

/// <summary>
/// 实例化根节点。
/// </summary>
public Transform InstanceRoot
{
get => m_InstanceRoot;
set => m_InstanceRoot = value;
}

/// <summary>
/// 总音量控制。
/// </summary>
public float Volume
{
get => AudioModuleImp.Volume;
set => AudioModuleImp.Volume = value;
}

/// <summary>
/// 总开关。
/// </summary>
public bool Enable
{
get => AudioModuleImp.Enable;
set => AudioModuleImp.Enable = value;
}

/// <summary>
/// 音乐音量。
/// </summary>
public float MusicVolume
{
get => AudioModuleImp.MusicVolume;
set => AudioModuleImp.MusicVolume = value;
}

/// <summary>
/// 音效音量。
/// </summary>
public float SoundVolume
{
get => AudioModuleImp.SoundVolume;
set => AudioModuleImp.SoundVolume = value;
}

/// <summary>
/// UI音效音量。
/// </summary>
public float UISoundVolume
{
get => AudioModuleImp.UISoundVolume;
set => AudioModuleImp.UISoundVolume = value;
}

/// <summary>
/// 语音音量。
/// </summary>
public float VoiceVolume
{
get => AudioModuleImp.VoiceVolume;
set => AudioModuleImp.VoiceVolume = value;
}

/// <summary>
/// 音乐开关
/// </summary>
public bool MusicEnable
{
get => AudioModuleImp.MusicEnable;
set => AudioModuleImp.MusicEnable = value;
}

/// <summary>
/// 音效开关。
/// </summary>
public bool SoundEnable
{
get => AudioModuleImp.SoundEnable;
set => AudioModuleImp.SoundEnable = value;
}

/// <summary>
/// UI音效开关。
/// </summary>
public bool UISoundEnable
{
get => AudioModuleImp.UISoundEnable;
set => AudioModuleImp.UISoundEnable = value;
}

/// <summary>
/// 语音开关。
/// </summary>
public bool VoiceEnable
{
get => AudioModuleImp.VoiceEnable;
set => AudioModuleImp.VoiceEnable = value;
}

#endregion

/// <summary>
/// 初始化音频模块。
/// </summary>
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);
}

/// <summary>
/// 重启音频模块。
/// </summary>
public void Restart()
{
AudioModuleImp.Restart();
}

/// <summary>
/// 播放,如果超过最大发声数采用fadeout的方式复用最久播放的AudioSource。
/// </summary>
/// <param name="type">声音类型</param>
/// <param name="path">声音文件路径</param>
/// <param name="bLoop">是否循环播放</param>>
/// <param name="volume">音量(0-1.0)</param>
/// <param name="bAsync">是否异步加载</param>
/// <param name="bInPool">是否支持资源池</param>
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);
}

/// <summary>
/// 停止某类声音播放。
/// </summary>
/// <param name="type">声音类型。</param>
/// <param name="fadeout">是否渐消。</param>
public void Stop(AudioType type, bool fadeout)
{
AudioModuleImp.Stop(type, fadeout);
}

/// <summary>
/// 停止所有声音。
/// </summary>
/// <param name="fadeout">是否渐消。</param>
public void StopAll(bool fadeout)
{
AudioModuleImp.StopAll(fadeout);
}

/// <summary>
/// 预先加载AudioClip,并放入对象池。
/// </summary>
/// <param name="list">AudioClip的AssetPath集合。</param>
public void PutInAudioPool(List<string> list)
{
AudioModuleImp.PutInAudioPool(list);
}

/// <summary>
/// 将部分AudioClip从对象池移出。
/// </summary>
/// <param name="list">AudioClip的AssetPath集合。</param>
public void RemoveClipFromPool(List<string> list)
{
AudioModuleImp.RemoveClipFromPool(list);
}

/// <summary>
/// 清空AudioClip的对象池。
/// </summary>
public void CleanSoundPool()
{
AudioModuleImp.CleanSoundPool();
}
}
}

顺序是先AudioModule里配置AudioGroupConfigs数据给TE框架

然后再ProcedureLaunch流程里修改AudioMixer的音量和TE框架里的音频开关,并将修改存档

Audio类图

Audio类图
类图里虽然有很多内容,但我做了一个简单的分类,上半部分主要是管理音频的方法,下半部分主要是负责音频的一些数据


TEngine--Audio模块
https://www.liu2dream.fun/post/TEngine--Audio模块/
作者
刘老师 MrLiu
发布于
2024年6月5日
许可协议