This commit is contained in:
DESKTOP-5RP3AKU\Jisol
2024-10-14 03:07:34 +08:00
parent edafe4a058
commit d56c133a75
5989 changed files with 8767 additions and 441137 deletions

View File

@@ -0,0 +1,474 @@
using UnityEngine;
using UnityEngine.Audio;
using YooAsset;
namespace SHFrame
{
public class AudioData : MemoryObject
{
public AssetHandle AssetOperationHandle { private set; get; }
public bool InPool { private set; get; } = false;
public override void InitFromPool()
{
}
public override void RecycleToPool()
{
if (!InPool)
{
AssetOperationHandle.Dispose();
}
InPool = false;
AssetOperationHandle = null;
}
internal static AudioData Alloc(AssetHandle assetOperationHandle, bool inPool)
{
AudioData ret = ReferencePool.Acquire<AudioData>();
ret.AssetOperationHandle = assetOperationHandle;
ret.InPool = inPool;
ret.InitFromPool();
return ret;
}
internal static void DeAlloc(AudioData audioData)
{
if (audioData != null)
{
ReferencePool.Release(audioData);
audioData.RecycleToPool();
}
}
}
/// <summary>
/// 音频代理辅助器。
/// </summary>
public class AudioAgent
{
private int _instanceId;
private AudioSource _source;
private AudioData _audioData;
private AudioModuleImp _audioModuleImp;
private Transform _transform;
float _volume = 1.0f;
float _duration;
private float _fadeoutTimer;
private const float FadeoutDuration = 0.2f;
private bool _inPool;
private Transform _bindTransform;
/// <summary>
/// 音频代理辅助器运行时状态。
/// </summary>
AudioAgentRuntimeState _audioAgentRuntimeState = AudioAgentRuntimeState.None;
/// <summary>
/// 音频代理加载请求。
/// </summary>
class LoadRequest
{
public string Path;
public bool BAsync;
public bool BInPool;
public Transform BindTransform;
}
/// <summary>
/// 音频代理加载请求。
/// </summary>
LoadRequest _pendingLoad = null;
/// <summary>
/// AudioSource实例化Id
/// </summary>
public int InstanceId => _instanceId;
/// <summary>
/// 资源操作句柄。
/// </summary>
public AudioData AudioData => _audioData;
/// <summary>
/// 音频代理辅助器音频大小。
/// </summary>
public float Volume
{
set
{
if (_source != null)
{
_volume = value;
_source.volume = _volume;
}
}
get => _volume;
}
/// <summary>
/// 音频代理辅助器当前是否空闲。
/// </summary>
public bool IsFree
{
get
{
if (_source != null)
{
return _audioAgentRuntimeState == AudioAgentRuntimeState.End;
}
else
{
return true;
}
}
}
/// <summary>
/// 音频代理辅助器播放秒数。
/// </summary>
public float Duration => _duration;
/// <summary>
/// 音频代理辅助器当前音频长度。
/// </summary>
public float Length
{
get
{
if (_source != null && _source.clip != null)
{
return _source.clip.length;
}
return 0;
}
}
/// <summary>
/// 音频代理辅助器实例位置。
/// </summary>
public Vector3 Position
{
get => _transform.position;
set => _transform.position = value;
}
/// <summary>
/// 音频代理辅助器是否循环。
/// </summary>
public bool IsLoop
{
get
{
if (_source != null)
{
return _source.loop;
}
else
{
return false;
}
}
set
{
if (_source != null)
{
_source.loop = value;
}
}
}
/// <summary>
/// 音频代理辅助器是否正在播放。
/// </summary>
internal bool IsPlaying
{
get
{
if (_source != null && _source.isPlaying)
{
return true;
}
else
{
return false;
}
}
}
/// <summary>
/// 音频代理辅助器获取当前声源。
/// </summary>
/// <returns></returns>
public AudioSource AudioResource()
{
return _source;
}
/// <summary>
/// 创建音频代理辅助器。
/// </summary>
/// <param name="path">生效路径。</param>
/// <param name="bAsync">是否异步。</param>
/// <param name="audioCategory">音频轨道(类别)。</param>
/// <param name="bInPool">是否池化。</param>
/// <param name="bindTransform"></param>
/// <returns>音频代理辅助器。</returns>
public static AudioAgent Create(string path, bool bAsync, AudioCategory audioCategory, bool bInPool = false, Transform bindTransform = null)
{
AudioAgent audioAgent = new AudioAgent();
audioAgent.Init(audioCategory);
audioAgent.Load(path, bAsync, bInPool, bindTransform);
return audioAgent;
}
/// <summary>
/// 初始化音频代理辅助器。
/// </summary>
/// <param name="audioCategory">音频轨道(类别)。</param>
/// <param name="index">音频代理辅助器编号。</param>
public void Init(AudioCategory audioCategory, int index = 0)
{
_audioModuleImp = ModuleImpSystem.GetModule<AudioModuleImp>();
GameObject host = new GameObject(Utility.Text.Format("Audio Agent Helper - {0} - {1}", audioCategory.AudioMixerGroup.name, index));
host.transform.SetParent(audioCategory.InstanceRoot);
host.transform.localPosition = Vector3.zero;
_transform = host.transform;
_source = host.AddComponent<AudioSource>();
_source.playOnAwake = false;
AudioMixerGroup[] audioMixerGroups;
if (audioCategory.AudioMixerGroup.name == "Sound")
{
audioMixerGroups = audioCategory.AudioMixer.FindMatchingGroups(Utility.Text.Format("Master/{0}/{1}", audioCategory.AudioMixerGroup.name,
$"{audioCategory.AudioMixerGroup.name} - {index % 4}"));
_source.spatialBlend = 1;
_source.spread = 180f;
}
else
{
audioMixerGroups = audioCategory.AudioMixer.FindMatchingGroups(Utility.Text.Format("Master/{0}/{1}", audioCategory.AudioMixerGroup.name,
$"{audioCategory.AudioMixerGroup.name} - {index}"));
}
_source.outputAudioMixerGroup = audioMixerGroups.Length > 0 ? audioMixerGroups[0] : audioCategory.AudioMixerGroup;
_source.rolloffMode = audioCategory.AudioGroupConfig.audioRolloffMode;
_source.minDistance = audioCategory.AudioGroupConfig.minDistance;
_source.maxDistance = audioCategory.AudioGroupConfig.maxDistance;
_instanceId = _source.GetInstanceID();
_bindTransform = null;
}
/// <summary>
/// 加载音频代理辅助器。
/// </summary>
/// <param name="path">资源路径。</param>
/// <param name="bAsync">是否异步。</param>
/// <param name="bInPool">是否池化。</param>
/// <param name="bindTransform"></param>
public void Load(string path, bool bAsync, bool bInPool = false, Transform bindTransform = null)
{
_inPool = bInPool;
_bindTransform = bindTransform;
if (_audioAgentRuntimeState == AudioAgentRuntimeState.None || _audioAgentRuntimeState == AudioAgentRuntimeState.End)
{
_duration = 0;
if (!string.IsNullOrEmpty(path))
{
if (bInPool && _audioModuleImp.AudioClipPool.TryGetValue(path, out var operationHandle))
{
OnAssetLoadComplete(operationHandle);
return;
}
if (bAsync)
{
_audioAgentRuntimeState = AudioAgentRuntimeState.Loading;
AssetHandle handle = YooAssets.LoadAssetAsync<AudioClip>(path);
handle.Completed += OnAssetLoadComplete;
}
else
{
AssetHandle handle = YooAssets.LoadAssetSync<AudioClip>(path);
OnAssetLoadComplete(handle);
}
}
}
else
{
_pendingLoad = new LoadRequest { Path = path, BAsync = bAsync, BInPool = bInPool, BindTransform = bindTransform };
if (_audioAgentRuntimeState == AudioAgentRuntimeState.Playing)
{
Stop(true);
}
}
}
/// <summary>
/// 停止播放音频代理辅助器。
/// </summary>
/// <param name="fadeout">是否渐出。</param>
public void Stop(bool fadeout = false)
{
if (_source != null)
{
if (fadeout)
{
_fadeoutTimer = FadeoutDuration;
_audioAgentRuntimeState = AudioAgentRuntimeState.FadingOut;
}
else
{
_source.Stop();
_audioAgentRuntimeState = AudioAgentRuntimeState.End;
}
}
}
/// <summary>
/// 暂停音频代理辅助器。
/// </summary>
public void Pause()
{
if (_source != null)
{
_source.Pause();
}
}
/// <summary>
/// 取消暂停音频代理辅助器。
/// </summary>
public void UnPause()
{
if (_source != null)
{
_source.UnPause();
}
}
/// <summary>
/// 资源加载完成。
/// </summary>
/// <param name="handle">资源操作句柄。</param>
void OnAssetLoadComplete(AssetHandle handle)
{
if (handle != null)
{
if (_inPool)
{
_audioModuleImp.AudioClipPool.TryAdd(handle.GetAssetInfo().Address, handle);
}
}
if (_pendingLoad != null)
{
if (!_inPool && handle != null)
{
handle.Dispose();
}
_audioAgentRuntimeState = AudioAgentRuntimeState.End;
string path = _pendingLoad.Path;
bool bAsync = _pendingLoad.BAsync;
bool bInPool = _pendingLoad.BInPool;
Transform bindTransform = _pendingLoad.BindTransform;
_pendingLoad = null;
Load(path, bAsync, bInPool, bindTransform);
}
else if (handle != null)
{
if (_audioData != null)
{
AudioData.DeAlloc(_audioData);
_audioData = null;
}
_audioData = AudioData.Alloc(handle, _inPool);
_source.clip = handle.AssetObject as AudioClip;
if (_source.clip != null)
{
_source.Play();
_audioAgentRuntimeState = AudioAgentRuntimeState.Playing;
}
else
{
_audioAgentRuntimeState = AudioAgentRuntimeState.End;
}
}
else
{
_audioAgentRuntimeState = AudioAgentRuntimeState.End;
}
}
/// <summary>
/// 轮询音频代理辅助器。
/// </summary>
/// <param name="elapseSeconds">逻辑流逝时间,以秒为单位。</param>
public void Update(float elapseSeconds)
{
if (_audioAgentRuntimeState == AudioAgentRuntimeState.Playing)
{
if (_bindTransform != null)
{
_transform.position = _bindTransform.position;
}
if (!_source.isPlaying)
{
_audioAgentRuntimeState = AudioAgentRuntimeState.End;
}
}
else if (_audioAgentRuntimeState == AudioAgentRuntimeState.FadingOut)
{
if (_fadeoutTimer > 0f)
{
_fadeoutTimer -= elapseSeconds;
_source.volume = _volume * _fadeoutTimer / FadeoutDuration;
}
else
{
Stop();
if (_pendingLoad != null)
{
string path = _pendingLoad.Path;
bool bAsync = _pendingLoad.BAsync;
bool bInPool = _pendingLoad.BInPool;
Transform bindTransform = _pendingLoad.BindTransform;
_pendingLoad = null;
Load(path, bAsync, bInPool, bindTransform);
}
_source.volume = _volume;
}
}
_duration += elapseSeconds;
}
/// <summary>
/// 销毁音频代理辅助器。
/// </summary>
public void Destroy()
{
if (_transform != null)
{
Object.Destroy(_transform.gameObject);
}
if (_audioData != null)
{
AudioData.DeAlloc(_audioData);
}
_bindTransform = null;
}
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 6d4824a14181a0d4d921eb98fec100fe
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,33 @@
namespace SHFrame
{
/// <summary>
/// 音频代理辅助器运行时状态枚举。
/// </summary>
public enum AudioAgentRuntimeState
{
/// <summary>
/// 无状态。
/// </summary>
None,
/// <summary>
/// 加载中状态。
/// </summary>
Loading,
/// <summary>
/// 播放中状态。
/// </summary>
Playing,
/// <summary>
/// 渐渐消失状态。
/// </summary>
FadingOut,
/// <summary>
/// 结束状态。
/// </summary>
End,
};
}

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: f4ad4b8dc4cf4ecd813e58ec37406ba0
timeCreated: 1694849619

View File

@@ -0,0 +1,193 @@
using System;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Audio;
namespace SHFrame
{
/// <summary>
/// 音频轨道(类别)。
/// </summary>
[Serializable]
public class AudioCategory
{
[SerializeField] private AudioMixer audioMixer = null;
public List<AudioAgent> AudioAgents;
private readonly AudioMixerGroup _audioMixerGroup;
private AudioGroupConfig _audioGroupConfig;
private int _maxChannel;
private bool _bEnable = true;
/// <summary>
/// 音频混响器。
/// </summary>
public AudioMixer AudioMixer => audioMixer;
/// <summary>
/// 音频混响器组。
/// </summary>
public AudioMixerGroup AudioMixerGroup => _audioMixerGroup;
/// <summary>
/// 音频组配置。
/// </summary>
public AudioGroupConfig AudioGroupConfig => _audioGroupConfig;
/// <summary>
/// 实例化根节点。
/// </summary>
public Transform InstanceRoot { private set; get; }
/// <summary>
/// 音频轨道是否启用。
/// </summary>
public bool Enable
{
get => _bEnable;
set
{
if (_bEnable != value)
{
_bEnable = value;
if (!_bEnable)
{
foreach (var audioAgent in AudioAgents)
{
if (audioAgent != null)
{
audioAgent.Stop();
}
}
}
}
}
}
/// <summary>
/// 音频轨道构造函数。
/// </summary>
/// <param name="maxChannel">最大Channel。</param>
/// <param name="audioMixer">音频混响器。</param>
/// <param name="audioGroupConfig">音频轨道组配置。</param>
public AudioCategory(int maxChannel, AudioMixer audioMixer, AudioGroupConfig audioGroupConfig)
{
this.audioMixer = audioMixer;
_maxChannel = maxChannel;
_audioGroupConfig = audioGroupConfig;
AudioMixerGroup[] audioMixerGroups = audioMixer.FindMatchingGroups(Utility.Text.Format("Master/{0}", audioGroupConfig.AudioType.ToString()));
if (audioMixerGroups.Length > 0)
{
_audioMixerGroup = audioMixerGroups[0];
}
else
{
_audioMixerGroup = audioMixer.FindMatchingGroups("Master")[0];
}
AudioAgents = new List<AudioAgent>(32);
InstanceRoot = new GameObject(Utility.Text.Format("Audio Category - {0}", _audioMixerGroup.name)).transform;
InstanceRoot.SetParent(GameModule.Audio.InstanceRoot);
for (int index = 0; index < _maxChannel; index++)
{
AudioAgent audioAgent = new AudioAgent();
audioAgent.Init(this, index);
AudioAgents.Add(audioAgent);
}
}
/// <summary>
/// 增加音频。
/// </summary>
/// <param name="num"></param>
public void AddAudio(int num)
{
_maxChannel += num;
for (int i = 0; i < num; i++)
{
AudioAgents.Add(null);
}
}
/// <summary>
/// 播放音频。
/// </summary>
/// <param name="path"></param>
/// <param name="bAsync"></param>
/// <param name="bInPool"></param>
/// <param name="bindTransform"></param>
/// <returns></returns>
public AudioAgent Play(string path, bool bAsync, bool bInPool = false, Transform bindTransform = null)
{
if (!_bEnable)
{
return null;
}
int freeChannel = -1;
float duration = -1;
for (int i = 0; i < AudioAgents.Count; i++)
{
if (AudioAgents[i].AudioData?.AssetOperationHandle == null || AudioAgents[i].IsFree)
{
freeChannel = i;
break;
}
else if (AudioAgents[i].Duration > duration)
{
duration = AudioAgents[i].Duration;
freeChannel = i;
}
}
if (freeChannel >= 0)
{
if (AudioAgents[freeChannel] == null)
{
AudioAgents[freeChannel] = AudioAgent.Create(path, bAsync, this, bInPool, bindTransform);
}
else
{
AudioAgents[freeChannel].Load(path, bAsync, bInPool, bindTransform);
}
return AudioAgents[freeChannel];
}
else
{
Log.Error($"Here is no channel to play audio {path}");
return null;
}
}
/// <summary>
/// 暂停音频。
/// </summary>
/// <param name="fadeout">是否渐出</param>
public void Stop(bool fadeout)
{
for (int i = 0; i < AudioAgents.Count; ++i)
{
if (AudioAgents[i] != null)
{
AudioAgents[i].Stop(fadeout);
}
}
}
/// <summary>
/// 音频轨道轮询。
/// </summary>
/// <param name="elapseSeconds">逻辑流逝时间,以秒为单位。</param>
public void Update(float elapseSeconds)
{
for (int i = 0; i < AudioAgents.Count; ++i)
{
if (AudioAgents[i] != null)
{
AudioAgents[i].Update(elapseSeconds);
}
}
}
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 6aefbd5a06fe1784590d373a93d1cf8a
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,48 @@
using System;
using UnityEngine;
namespace SHFrame
{
/// <summary>
/// 音频轨道组配置。
/// </summary>
[Serializable]
public sealed class AudioGroupConfig
{
[SerializeField] private string m_Name = null;
[SerializeField] private bool m_Mute = false;
[SerializeField, Range(0f, 1f)] private float m_Volume = 1f;
[SerializeField] private int m_AgentHelperCount = 1;
public AudioType AudioType;
public AudioRolloffMode audioRolloffMode = AudioRolloffMode.Logarithmic;
public float minDistance = 1f;
public float maxDistance = 500f;
public string Name
{
get { return m_Name; }
}
public bool Mute
{
get { return m_Mute; }
}
public float Volume
{
get { return m_Volume; }
}
public int AgentHelperCount
{
get { return m_AgentHelperCount; }
}
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 067935df275fd1340a935f81e7f3a768
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,217 @@
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Audio;
namespace SHFrame
{
/// <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>
/// <param name="bindTransform"></param>
public AudioAgent Play(AudioType type, string path, bool bLoop = false, float volume = 1.0f, bool bAsync = false, bool bInPool = false, Transform bindTransform = null)
{
return AudioModuleImp.Play(type, path, bLoop, volume, bAsync, bInPool, bindTransform);
}
/// <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();
}
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 7d0b3cff83fd3874394b1b456bb54dab
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,561 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using UnityEngine;
using UnityEngine.Audio;
using YooAsset;
namespace SHFrame
{
[UpdateModule]
internal class AudioModuleImp : ModuleImp, IAudioModule
{
private AudioMixer _audioMixer;
private Transform _instanceRoot = null;
private AudioGroupConfig[] _audioGroupConfigs = null;
private float _volume = 1f;
private bool _enable = true;
private readonly AudioCategory[] _audioCategories = new AudioCategory[(int)AudioType.Max];
private readonly float[] _categoriesVolume = new float[(int)AudioType.Max];
public readonly Dictionary<string, AssetHandle> AudioClipPool = new Dictionary<string, AssetHandle>();
private bool _bUnityAudioDisabled = false;
#region Public Propreties
/// <summary>
/// 音频混响器。
/// </summary>
public AudioMixer AudioMixer => _audioMixer;
/// <summary>
/// 实例化根节点。
/// </summary>
public Transform InstanceRoot => _instanceRoot;
/// <summary>
/// 总音量控制。
/// </summary>
public float Volume
{
get
{
if (_bUnityAudioDisabled)
{
return 0.0f;
}
return _volume;
}
set
{
if (_bUnityAudioDisabled)
{
return;
}
_volume = value;
AudioListener.volume = _volume;
}
}
/// <summary>
/// 总开关。
/// </summary>
public bool Enable
{
get
{
if (_bUnityAudioDisabled)
{
return false;
}
return _enable;
}
set
{
if (_bUnityAudioDisabled)
{
return;
}
_enable = value;
AudioListener.volume = _enable ? _volume : 0f;
}
}
/// <summary>
/// 音乐音量。
/// </summary>
public float MusicVolume
{
get
{
if (_bUnityAudioDisabled)
{
return 0.0f;
}
return _categoriesVolume[(int)AudioType.Music];
}
set
{
if (_bUnityAudioDisabled)
{
return;
}
float volume = Mathf.Clamp(value, 0.0001f, 1.0f);
_categoriesVolume[(int)AudioType.Music] = volume;
_audioMixer.SetFloat("MusicVolume", Mathf.Log10(volume) * 20f);
}
}
/// <summary>
/// 音效音量。
/// </summary>
public float SoundVolume
{
get
{
if (_bUnityAudioDisabled)
{
return 0.0f;
}
return _categoriesVolume[(int)AudioType.Sound];
}
set
{
if (_bUnityAudioDisabled)
{
return;
}
float volume = Mathf.Clamp(value, 0.0001f, 1.0f);
_categoriesVolume[(int)AudioType.Sound] = volume;
_audioMixer.SetFloat("SoundVolume", Mathf.Log10(volume) * 20f);
}
}
/// <summary>
/// UI音效音量。
/// </summary>
public float UISoundVolume
{
get
{
if (_bUnityAudioDisabled)
{
return 0.0f;
}
return _categoriesVolume[(int)AudioType.UISound];
}
set
{
if (_bUnityAudioDisabled)
{
return;
}
float volume = Mathf.Clamp(value, 0.0001f, 1.0f);
_categoriesVolume[(int)AudioType.UISound] = volume;
_audioMixer.SetFloat("UISoundVolume", Mathf.Log10(volume) * 20f);
}
}
/// <summary>
/// 语音音量。
/// </summary>
public float VoiceVolume
{
get
{
if (_bUnityAudioDisabled)
{
return 0.0f;
}
return _categoriesVolume[(int)AudioType.Voice];
}
set
{
if (_bUnityAudioDisabled)
{
return;
}
float volume = Mathf.Clamp(value, 0.0001f, 1.0f);
_categoriesVolume[(int)AudioType.Voice] = volume;
_audioMixer.SetFloat("VoiceVolume", Mathf.Log10(volume) * 20f);
}
}
/// <summary>
/// 音乐开关
/// </summary>
public bool MusicEnable
{
get
{
if (_bUnityAudioDisabled)
{
return false;
}
if (_audioMixer.GetFloat("MusicVolume", out var db))
{
return db > -80f;
}
else
{
return false;
}
}
set
{
if (_bUnityAudioDisabled)
{
return;
}
_audioCategories[(int)AudioType.Music].Enable = value;
// 音乐采用0音量方式避免恢复播放时的复杂逻辑
if (value)
{
_audioMixer.SetFloat("MusicVolume", Mathf.Log10(_categoriesVolume[(int)AudioType.Music]) * 20f);
}
else
{
_audioMixer.SetFloat("MusicVolume", -80f);
}
}
}
/// <summary>
/// 音效开关。
/// </summary>
public bool SoundEnable
{
get
{
if (_bUnityAudioDisabled)
{
return false;
}
return _audioCategories[(int)AudioType.Sound].Enable;
}
set
{
if (_bUnityAudioDisabled)
{
return;
}
_audioCategories[(int)AudioType.Sound].Enable = value;
}
}
/// <summary>
/// UI音效开关。
/// </summary>
public bool UISoundEnable
{
get
{
if (_bUnityAudioDisabled)
{
return false;
}
return _audioCategories[(int)AudioType.UISound].Enable;
}
set
{
if (_bUnityAudioDisabled)
{
return;
}
_audioCategories[(int)AudioType.UISound].Enable = value;
}
}
/// <summary>
/// 语音开关。
/// </summary>
public bool VoiceEnable
{
get
{
if (_bUnityAudioDisabled)
{
return false;
}
return _audioCategories[(int)AudioType.Voice].Enable;
}
set
{
if (_bUnityAudioDisabled)
{
return;
}
_audioCategories[(int)AudioType.Voice].Enable = value;
}
}
#endregion
internal override void Shutdown()
{
StopAll(fadeout: false);
CleanSoundPool();
}
/// <summary>
/// 初始化音频模块。
/// </summary>
/// <param name="audioGroupConfigs">音频轨道组配置。</param>
/// <param name="instanceRoot">实例化根节点。</param>
/// <param name="audioMixer">音频混响器。</param>
/// <exception cref="GameFrameworkException"></exception>
public void Initialize(AudioGroupConfig[] audioGroupConfigs, Transform instanceRoot = null, AudioMixer audioMixer = null)
{
if (_instanceRoot == null)
{
_instanceRoot = instanceRoot;
}
if (audioGroupConfigs == null)
{
throw new GameFrameworkException("AudioGroupConfig[] is invalid.");
}
_audioGroupConfigs = audioGroupConfigs;
if (_instanceRoot == null)
{
_instanceRoot = new GameObject("AudioModule Instances").transform;
_instanceRoot.SetParent(GameModule.Audio.transform);
_instanceRoot.localScale = Vector3.one;
GameModule.Audio.InstanceRoot = _instanceRoot;
}
try
{
#if UNITY_EDITOR
TypeInfo typeInfo = typeof(AudioSettings).GetTypeInfo();
PropertyInfo propertyInfo = typeInfo.GetDeclaredProperty("unityAudioDisabled");
_bUnityAudioDisabled = (bool)propertyInfo.GetValue(null);
if (_bUnityAudioDisabled)
{
return;
}
#endif
}
catch (Exception e)
{
Log.Error(e.ToString());
}
if (audioMixer != null)
{
_audioMixer = audioMixer;
}
if (_audioMixer == null)
{
_audioMixer = Resources.Load<AudioMixer>("AudioMixer");
}
for (int index = 0; index < (int)AudioType.Max; ++index)
{
AudioType audioType = (AudioType)index;
AudioGroupConfig audioGroupConfig = _audioGroupConfigs.First(t => t.AudioType == audioType);
_audioCategories[index] = new AudioCategory(audioGroupConfig.AgentHelperCount, _audioMixer, audioGroupConfig);
_categoriesVolume[index] = audioGroupConfig.Volume;
}
}
/// <summary>
/// 重启音频模块。
/// </summary>
public void Restart()
{
if (_bUnityAudioDisabled)
{
return;
}
CleanSoundPool();
for (int i = 0; i < (int)AudioType.Max; ++i)
{
var audioCategory = _audioCategories[i];
if (audioCategory != null)
{
for (int j = 0; j < audioCategory.AudioAgents.Count; ++j)
{
var audioAgent = audioCategory.AudioAgents[j];
if (audioAgent != null)
{
audioAgent.Destroy();
audioAgent = null;
}
}
}
audioCategory = null;
}
Initialize(_audioGroupConfigs);
}
/// <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>
/// <param name="bindTransform"></param>
public AudioAgent Play(AudioType type, string path, bool bLoop = false, float volume = 1.0f, bool bAsync = false, bool bInPool = false, Transform bindTransform = null)
{
if (_bUnityAudioDisabled)
{
return null;
}
AudioAgent audioAgent = _audioCategories[(int)type].Play(path, bAsync, bInPool, bindTransform);
{
if (audioAgent != null)
{
audioAgent.IsLoop = bLoop;
audioAgent.Volume = volume;
}
return audioAgent;
}
}
/// <summary>
/// 停止某类声音播放。
/// </summary>
/// <param name="type">声音类型。</param>
/// <param name="fadeout">是否渐消。</param>
public void Stop(AudioType type, bool fadeout)
{
if (_bUnityAudioDisabled)
{
return;
}
_audioCategories[(int)type].Stop(fadeout);
}
/// <summary>
/// 停止所有声音。
/// </summary>
/// <param name="fadeout">是否渐消。</param>
public void StopAll(bool fadeout)
{
if (_bUnityAudioDisabled)
{
return;
}
for (int i = 0; i < (int)AudioType.Max; ++i)
{
if (_audioCategories[i] != null)
{
_audioCategories[i].Stop(fadeout);
}
}
}
/// <summary>
/// 预先加载AudioClip并放入对象池。
/// </summary>
/// <param name="list">AudioClip的AssetPath集合。</param>
public void PutInAudioPool(List<string> list)
{
if (_bUnityAudioDisabled)
{
return;
}
foreach (string path in list)
{
if (AudioClipPool != null && !AudioClipPool.ContainsKey(path))
{
AssetHandle assetData = YooAssets.LoadAssetSync<AudioClip>(path);
AudioClipPool?.Add(path, assetData);
}
}
}
/// <summary>
/// 将部分AudioClip从对象池移出。
/// </summary>
/// <param name="list">AudioClip的AssetPath集合。</param>
public void RemoveClipFromPool(List<string> list)
{
if (_bUnityAudioDisabled)
{
return;
}
foreach (string path in list)
{
if (AudioClipPool.ContainsKey(path))
{
AudioClipPool[path].Dispose();
AudioClipPool.Remove(path);
}
}
}
/// <summary>
/// 清空AudioClip的对象池。
/// </summary>
public void CleanSoundPool()
{
if (_bUnityAudioDisabled)
{
return;
}
foreach (var dic in AudioClipPool)
{
dic.Value.Dispose();
}
AudioClipPool.Clear();
}
/// <summary>
/// 音频模块轮询。
/// </summary>
/// <param name="elapseSeconds">逻辑流逝时间,以秒为单位。</param>
/// <param name="realElapseSeconds">真实流逝时间,以秒为单位。</param>
internal override void Update(float elapseSeconds, float realElapseSeconds)
{
foreach (var audioCategory in _audioCategories)
{
if (audioCategory != null)
{
audioCategory.Update(elapseSeconds);
}
}
}
}
}

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: c35bbf6a82844c72b71b9bbe44f44a1e
timeCreated: 1694847017

View File

@@ -0,0 +1,34 @@
namespace SHFrame
{
/// <summary>
/// 音效分类,可分别关闭/开启对应分类音效。
/// </summary>
/// <remarks>命名与AudioMixer中分类名保持一致。</remarks>
public enum AudioType
{
/// <summary>
/// 声音音效。
/// </summary>
Sound,
/// <summary>
/// UI声效。
/// </summary>
UISound,
/// <summary>
/// 背景音乐音效。
/// </summary>
Music,
/// <summary>
/// 人声音效。
/// </summary>
Voice,
/// <summary>
/// 最大。
/// </summary>
Max
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: b4b86f93180273b4996d4f8c428def09
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,116 @@
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Audio;
namespace SHFrame
{
public interface IAudioModule
{
/// <summary>
/// 总音量控制。
/// </summary>
public float Volume { get; set; }
/// <summary>
/// 总开关。
/// </summary>
public bool Enable { get; set; }
/// <summary>
/// 音乐音量
/// </summary>
public float MusicVolume { get; set; }
/// <summary>
/// 音效音量。
/// </summary>
public float SoundVolume { get; set; }
/// <summary>
/// UI音效音量。
/// </summary>
public float UISoundVolume { get; set; }
/// <summary>
/// 语音音量。
/// </summary>
public float VoiceVolume { get; set; }
/// <summary>
/// 音乐开关。
/// </summary>
public bool MusicEnable { get; set; }
/// <summary>
/// 音效开关。
/// </summary>
public bool SoundEnable { get; set; }
/// <summary>
/// UI音效开关。
/// </summary>
public bool UISoundEnable { get; set; }
/// <summary>
/// 语音开关。
/// </summary>
public bool VoiceEnable { get; set; }
/// <summary>
/// 初始化音频模块。
/// </summary>
/// <param name="audioGroupConfigs">音频轨道组配置。</param>
/// <param name="instanceRoot">实例化根节点。</param>
/// <param name="audioMixer">音频混响器。</param>
/// <exception cref="GameFrameworkException"></exception>
public void Initialize(AudioGroupConfig[] audioGroupConfigs, Transform instanceRoot = null, AudioMixer audioMixer = null);
/// <summary>
/// 重启音频模块。
/// </summary>
public void Restart();
/// <summary>
/// 播放音频接口。
/// </summary>
/// <remarks>如果超过最大发声数采用fadeout的方式复用最久播放的AudioSource。</remarks>
/// <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>
/// <param name="bindTransform"></param>
public AudioAgent Play(AudioType type, string path, bool bLoop = false, float volume = 1.0f, bool bAsync = false, bool bInPool = false, Transform bindTransform = null);
/// <summary>
/// 停止某类声音播放。
/// </summary>
/// <param name="type">声音类型。</param>
/// <param name="fadeout">是否渐消。</param>
public void Stop(AudioType type, bool fadeout);
/// <summary>
/// 停止所有声音。
/// </summary>
/// <param name="fadeout">是否渐消。</param>
public void StopAll(bool fadeout);
/// <summary>
/// 预先加载AudioClip并放入对象池。
/// </summary>
/// <param name="list">AudioClip的AssetPath集合。</param>
public void PutInAudioPool(List<string> list);
/// <summary>
/// 将部分AudioClip从对象池移出。
/// </summary>
/// <param name="list">AudioClip的AssetPath集合。</param>
public void RemoveClipFromPool(List<string> list);
/// <summary>
/// 清空AudioClip的对象池。
/// </summary>
public void CleanSoundPool();
}
}

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: f2a332020228453d8546d5d74aa60f9c
timeCreated: 1694847151

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 64a654fc0d761c24e9676a185ea4df8e
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,708 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!244 &-8255999005317483048
AudioMixerEffectController:
m_ObjectHideFlags: 3
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name:
m_EffectID: 5256fbc85eb3f884eb780f730c8da825
m_EffectName: Attenuation
m_MixLevel: 989fcb1cc28d4de4ea6e56c14101e674
m_Parameters: []
m_SendTarget: {fileID: 0}
m_EnableWetMix: 0
m_Bypass: 0
--- !u!244 &-8165904320333843496
AudioMixerEffectController:
m_ObjectHideFlags: 3
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name:
m_EffectID: 6b8ac75d99b7e57489701e084ea19b1f
m_EffectName: Attenuation
m_MixLevel: b19e64315aff6dc4a81ae36b22fc0492
m_Parameters: []
m_SendTarget: {fileID: 0}
m_EnableWetMix: 0
m_Bypass: 0
--- !u!244 &-7861682458482441818
AudioMixerEffectController:
m_ObjectHideFlags: 3
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name:
m_EffectID: dcc48474d251d554e9f6f95668853a39
m_EffectName: Receive
m_MixLevel: e6248274fab455749bc046d72eace6de
m_Parameters: []
m_SendTarget: {fileID: 0}
m_EnableWetMix: 0
m_Bypass: 0
--- !u!243 &-7758028812591520460
AudioMixerGroupController:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: Sound - 2
m_AudioMixer: {fileID: 24100000}
m_GroupID: 039cd795affa7134a8d5f5d43d3b659d
m_Children: []
m_Volume: 2a8ce0f3383c3f0468a04fa3fc5e317d
m_Pitch: b47f0c73299cd9b4fba9896e70683903
m_Send: 00000000000000000000000000000000
m_Effects:
- {fileID: -3825599753161013374}
m_UserColorIndex: 2
m_Mute: 0
m_Solo: 0
m_BypassEffects: 0
--- !u!243 &-6280614258348125054
AudioMixerGroupController:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: Sound - 1
m_AudioMixer: {fileID: 24100000}
m_GroupID: c0d40106c2ffb1a44bd48f50b210ee20
m_Children: []
m_Volume: f62a8b3fe89df00409532af739ee4e02
m_Pitch: 77212647508232a458ac7d48fb55d037
m_Send: 00000000000000000000000000000000
m_Effects:
- {fileID: -1890011256548497850}
m_UserColorIndex: 2
m_Mute: 0
m_Solo: 0
m_BypassEffects: 0
--- !u!244 &-4958177229083455073
AudioMixerEffectController:
m_ObjectHideFlags: 3
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name:
m_EffectID: 104113b95764fe344a5d25469377c800
m_EffectName: Attenuation
m_MixLevel: 9ef29befaad178d4386e9d5ac022f964
m_Parameters: []
m_SendTarget: {fileID: 0}
m_EnableWetMix: 0
m_Bypass: 0
--- !u!243 &-4372808504093502661
AudioMixerGroupController:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: Sound - 3
m_AudioMixer: {fileID: 24100000}
m_GroupID: 5f20d1b8f9ac1914dac8beae718e7d40
m_Children: []
m_Volume: e54edf7c1bf7ee44297e65adce5b10b7
m_Pitch: 8542b6bfd7b7bfc4d9b961ba97edf0d2
m_Send: 00000000000000000000000000000000
m_Effects:
- {fileID: 6637688299338053042}
m_UserColorIndex: 2
m_Mute: 0
m_Solo: 0
m_BypassEffects: 0
--- !u!243 &-4209890294574411305
AudioMixerGroupController:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: Music
m_AudioMixer: {fileID: 24100000}
m_GroupID: efe8591c00084024187b9df78858c0af
m_Children:
- {fileID: 1543978434442340687}
m_Volume: 6d4c2b8bc0ef38d44b2fbff2b3298ab4
m_Pitch: 862389c428a73854ab442dd043008729
m_Send: 00000000000000000000000000000000
m_Effects:
- {fileID: 246003612463095956}
m_UserColorIndex: 1
m_Mute: 0
m_Solo: 0
m_BypassEffects: 0
--- !u!244 &-3825599753161013374
AudioMixerEffectController:
m_ObjectHideFlags: 3
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name:
m_EffectID: d1bbcc7cbe0a53c459c9064925118e41
m_EffectName: Attenuation
m_MixLevel: e43bb5de098a2ec49807913fa5fdd2f7
m_Parameters: []
m_SendTarget: {fileID: 0}
m_EnableWetMix: 0
m_Bypass: 0
--- !u!243 &-3720557753501792270
AudioMixerGroupController:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: UISound - 1
m_AudioMixer: {fileID: 24100000}
m_GroupID: e012b6d2e0501df43a88eb6beff8ae07
m_Children: []
m_Volume: 265eaf7c8910ab842a845c7bb5e570c4
m_Pitch: bf3ca9b57c9a67b40944a59839b12f62
m_Send: 00000000000000000000000000000000
m_Effects:
- {fileID: 5734415080786067514}
m_UserColorIndex: 3
m_Mute: 0
m_Solo: 0
m_BypassEffects: 0
--- !u!243 &-3395020342500439107
AudioMixerGroupController:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: Voice
m_AudioMixer: {fileID: 24100000}
m_GroupID: 5117f9b5a365ec049a9d5891c563b893
m_Children:
- {fileID: -1649243360580130678}
m_Volume: fe15a1b40c14ea646a13dacb15b6a73b
m_Pitch: 3398197a464677a4186e0cecd66bb13c
m_Send: 00000000000000000000000000000000
m_Effects:
- {fileID: -8165904320333843496}
m_UserColorIndex: 6
m_Mute: 0
m_Solo: 0
m_BypassEffects: 0
--- !u!243 &-2659745067392564156
AudioMixerGroupController:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: Sound - 0
m_AudioMixer: {fileID: 24100000}
m_GroupID: 71c50c6b966d1f548a63193919ebfbad
m_Children: []
m_Volume: 7835f2c4248cb3e43a1a773bab1f8b9d
m_Pitch: 30975daa872456b41bc18e0277e301e6
m_Send: 00000000000000000000000000000000
m_Effects:
- {fileID: -284252157345190109}
m_UserColorIndex: 2
m_Mute: 0
m_Solo: 0
m_BypassEffects: 0
--- !u!244 &-1890011256548497850
AudioMixerEffectController:
m_ObjectHideFlags: 3
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name:
m_EffectID: 520975c71ea21c249b3cdf1f22032e57
m_EffectName: Attenuation
m_MixLevel: 932e3e893621c5b46bff3c368017e689
m_Parameters: []
m_SendTarget: {fileID: 0}
m_EnableWetMix: 0
m_Bypass: 0
--- !u!243 &-1649243360580130678
AudioMixerGroupController:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: Voice - 0
m_AudioMixer: {fileID: 24100000}
m_GroupID: f46651e8ad3c6034b8764fd635dda3fd
m_Children: []
m_Volume: 0bc64c1c6cebbeb40ba2f724fdcaa257
m_Pitch: fff252bdd985513469f8607e016fc594
m_Send: 00000000000000000000000000000000
m_Effects:
- {fileID: -890847686165078200}
m_UserColorIndex: 6
m_Mute: 0
m_Solo: 0
m_BypassEffects: 0
--- !u!244 &-998299258853400712
AudioMixerEffectController:
m_ObjectHideFlags: 3
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name:
m_EffectID: d7d19927abbe5584080506164cb4e644
m_EffectName: Attenuation
m_MixLevel: 0b4264524e3eafc49b2daba7fba2ce97
m_Parameters: []
m_SendTarget: {fileID: 0}
m_EnableWetMix: 0
m_Bypass: 0
--- !u!244 &-890847686165078200
AudioMixerEffectController:
m_ObjectHideFlags: 3
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name:
m_EffectID: 4b41d8aa7a7944041a8b9428add83eff
m_EffectName: Attenuation
m_MixLevel: 73b7a9825978be245a1962a1001b0212
m_Parameters: []
m_SendTarget: {fileID: 0}
m_EnableWetMix: 0
m_Bypass: 0
--- !u!244 &-284252157345190109
AudioMixerEffectController:
m_ObjectHideFlags: 3
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name:
m_EffectID: 15668b74147caee41a72f695c3a2de56
m_EffectName: Attenuation
m_MixLevel: f71e84fb9a62ff24cad690a0a86cc47e
m_Parameters: []
m_SendTarget: {fileID: 0}
m_EnableWetMix: 0
m_Bypass: 0
--- !u!244 &-21257493329335984
AudioMixerEffectController:
m_ObjectHideFlags: 3
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name:
m_EffectID: c9a6f7a9214534644bf2e6d83ff86569
m_EffectName: Distortion
m_MixLevel: 3f356cddae5dba949a6e8f4d20564d3e
m_Parameters:
- m_ParameterName: Level
m_GUID: 080be1914d960974481df4bebe2a2d77
m_SendTarget: {fileID: 0}
m_EnableWetMix: 0
m_Bypass: 0
--- !u!241 &24100000
AudioMixerController:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: AudioMixer
m_OutputGroup: {fileID: 0}
m_MasterGroup: {fileID: 24300002}
m_Snapshots:
- {fileID: 24500006}
m_StartSnapshot: {fileID: 24500006}
m_SuspendThreshold: -80
m_EnableSuspend: 1
m_UpdateMode: 0
m_ExposedParameters:
- guid: 7835f2c4248cb3e43a1a773bab1f8b9d
name: SoundVolume0
- guid: 41591fd4a32f4034f880ecbc14ee69f1
name: MusicVolume0
- guid: 6e0d1a5935a802d41b27d9e2fad3ba2f
name: UISoundVolume0
- guid: 0bc64c1c6cebbeb40ba2f724fdcaa257
name: VoiceVolume0
- guid: f62a8b3fe89df00409532af739ee4e02
name: SoundVolume1
- guid: 265eaf7c8910ab842a845c7bb5e570c4
name: UISoundVolume1
- guid: 2a8ce0f3383c3f0468a04fa3fc5e317d
name: SoundVolume2
- guid: e83be6d6c4ae85142a51f584159c4ff6
name: UISoundVolume2
- guid: e54edf7c1bf7ee44297e65adce5b10b7
name: SoundVolume3
- guid: 2dd26f9dadf160f4bbd77f307c3f4f2e
name: UISoundVolume3
- guid: ba83e724007d7e9459f157db3a54a741
name: MasterVolume
- guid: 6d4c2b8bc0ef38d44b2fbff2b3298ab4
name: MusicVolume
- guid: 3bbd22597ed32714eb271cf06b098c63
name: SoundVolume
- guid: 7d1c7ed015f5dba4f934c33ef330c5eb
name: UISoundVolume
- guid: fe15a1b40c14ea646a13dacb15b6a73b
name: VoiceVolume
m_AudioMixerGroupViews:
- guids:
- 72c1e77b100e3274fbfb88ca2ca12c4d
- efe8591c00084024187b9df78858c0af
- 648e49a020cf83346a9220d606e4ff39
- 5117f9b5a365ec049a9d5891c563b893
- f46651e8ad3c6034b8764fd635dda3fd
- 1cf576bd46399874d9494863d6502d94
- 71c50c6b966d1f548a63193919ebfbad
- df986418fa3e4ae448a1909ffbb633fb
- 29257697b1e6be546aa0558e342a15a6
- c0d40106c2ffb1a44bd48f50b210ee20
- 039cd795affa7134a8d5f5d43d3b659d
- 5f20d1b8f9ac1914dac8beae718e7d40
- e012b6d2e0501df43a88eb6beff8ae07
- e84c25a476798ea43a2f6de217af7dba
- 98657376d4096a947953ee04d82830c1
name: View
m_CurrentViewIndex: 0
m_TargetSnapshot: {fileID: 24500006}
--- !u!243 &24300002
AudioMixerGroupController:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: Master
m_AudioMixer: {fileID: 24100000}
m_GroupID: 72c1e77b100e3274fbfb88ca2ca12c4d
m_Children:
- {fileID: -4209890294574411305}
- {fileID: 7235523536312936115}
- {fileID: 7185772616558441635}
- {fileID: -3395020342500439107}
m_Volume: ba83e724007d7e9459f157db3a54a741
m_Pitch: a2d2b77391464bb4887f0bcd3835015b
m_Send: 00000000000000000000000000000000
m_Effects:
- {fileID: 24400004}
m_UserColorIndex: 8
m_Mute: 0
m_Solo: 0
m_BypassEffects: 0
--- !u!244 &24400004
AudioMixerEffectController:
m_ObjectHideFlags: 3
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name:
m_EffectID: ce944d90cb57ee4418426132d391d900
m_EffectName: Attenuation
m_MixLevel: 891c3ec10e0ae1b42a95c83727d411f1
m_Parameters: []
m_SendTarget: {fileID: 0}
m_EnableWetMix: 0
m_Bypass: 0
--- !u!245 &24500006
AudioMixerSnapshotController:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: Snapshot
m_AudioMixer: {fileID: 24100000}
m_SnapshotID: 91dee90f8902c804c9da7728ea355157
m_FloatValues:
b47f0c73299cd9b4fba9896e70683903: 1
ba83e724007d7e9459f157db3a54a741: 0
fe15a1b40c14ea646a13dacb15b6a73b: 0
77212647508232a458ac7d48fb55d037: 1
3bbd22597ed32714eb271cf06b098c63: 0
30975daa872456b41bc18e0277e301e6: 1
6d4c2b8bc0ef38d44b2fbff2b3298ab4: -0.03
8542b6bfd7b7bfc4d9b961ba97edf0d2: 1
m_TransitionOverrides: {}
--- !u!244 &246003612463095956
AudioMixerEffectController:
m_ObjectHideFlags: 3
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name:
m_EffectID: 860c45ba06e3cbd4794061eaefe970a3
m_EffectName: Attenuation
m_MixLevel: bb4c221c9e3208941b1a2107831692ab
m_Parameters: []
m_SendTarget: {fileID: 0}
m_EnableWetMix: 0
m_Bypass: 0
--- !u!244 &281287199725387719
AudioMixerEffectController:
m_ObjectHideFlags: 3
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name:
m_EffectID: 812fbfe4555eb1641aeaeee69a13b4a6
m_EffectName: Lowpass Simple
m_MixLevel: 391139084347578409e42387008bd110
m_Parameters:
- m_ParameterName: Cutoff freq
m_GUID: b19756871f24b194d87c7d1fce3159e9
m_SendTarget: {fileID: 0}
m_EnableWetMix: 0
m_Bypass: 0
--- !u!244 &1413273517213151576
AudioMixerEffectController:
m_ObjectHideFlags: 3
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name:
m_EffectID: ce0c93d89826c7349a19b232116484db
m_EffectName: Attenuation
m_MixLevel: 7625365898787684c9bce9298a96f044
m_Parameters: []
m_SendTarget: {fileID: 0}
m_EnableWetMix: 0
m_Bypass: 0
--- !u!243 &1543978434442340687
AudioMixerGroupController:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: Music - 0
m_AudioMixer: {fileID: 24100000}
m_GroupID: 1cf576bd46399874d9494863d6502d94
m_Children: []
m_Volume: 41591fd4a32f4034f880ecbc14ee69f1
m_Pitch: 9ad7e859a0cd1f142b59ffc659be28a7
m_Send: 00000000000000000000000000000000
m_Effects:
- {fileID: -8255999005317483048}
m_UserColorIndex: 1
m_Mute: 0
m_Solo: 0
m_BypassEffects: 0
--- !u!243 &1601410790413250045
AudioMixerGroupController:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: UISound - 3
m_AudioMixer: {fileID: 24100000}
m_GroupID: 98657376d4096a947953ee04d82830c1
m_Children: []
m_Volume: 2dd26f9dadf160f4bbd77f307c3f4f2e
m_Pitch: 5627fa8b0176a344bbb4e59ac5e648d3
m_Send: 00000000000000000000000000000000
m_Effects:
- {fileID: 1413273517213151576}
m_UserColorIndex: 3
m_Mute: 0
m_Solo: 0
m_BypassEffects: 0
--- !u!244 &2567082640316932351
AudioMixerEffectController:
m_ObjectHideFlags: 3
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name:
m_EffectID: a7394d86e1e2a1e4389182f0aec98773
m_EffectName: Attenuation
m_MixLevel: cb8b6dfd682072d4fb81143ba077bc3f
m_Parameters: []
m_SendTarget: {fileID: 0}
m_EnableWetMix: 0
m_Bypass: 0
--- !u!243 &3865010338301366421
AudioMixerGroupController:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: UISound - 2
m_AudioMixer: {fileID: 24100000}
m_GroupID: e84c25a476798ea43a2f6de217af7dba
m_Children: []
m_Volume: e83be6d6c4ae85142a51f584159c4ff6
m_Pitch: c45439925e1cfd547894fd886160a11c
m_Send: 00000000000000000000000000000000
m_Effects:
- {fileID: 7834155774142160187}
m_UserColorIndex: 3
m_Mute: 0
m_Solo: 0
m_BypassEffects: 0
--- !u!244 &5734415080786067514
AudioMixerEffectController:
m_ObjectHideFlags: 3
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name:
m_EffectID: 20eac414948135e49b2b54a89235f15e
m_EffectName: Attenuation
m_MixLevel: d087be8c429707c4db724a61186f67f6
m_Parameters: []
m_SendTarget: {fileID: 0}
m_EnableWetMix: 0
m_Bypass: 0
--- !u!244 &5954042604037024145
AudioMixerEffectController:
m_ObjectHideFlags: 3
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name:
m_EffectID: ba434c984ec3c4442bfe3a399c11572b
m_EffectName: Echo
m_MixLevel: 0323002ce01f29a4abebc242337ea816
m_Parameters:
- m_ParameterName: Delay
m_GUID: f4cc548867353f843bc36a61722c6cbf
- m_ParameterName: Decay
m_GUID: e67c7b4426842f948a83f3dada794a99
- m_ParameterName: Max channels
m_GUID: 75c7951a8373f4644a44979a8c5776ed
- m_ParameterName: Drymix
m_GUID: 4d26b3b7a84b31d499176a7879734ba1
- m_ParameterName: Wetmix
m_GUID: 6efaeec45de20b045a4d560994684cba
m_SendTarget: {fileID: 0}
m_EnableWetMix: 0
m_Bypass: 0
--- !u!244 &6255340296135181231
AudioMixerEffectController:
m_ObjectHideFlags: 3
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name:
m_EffectID: 3a251f2e65751b349bb255f73f0caeaf
m_EffectName: Duck Volume
m_MixLevel: 58cfdd03ab24c874cbe074238d636208
m_Parameters:
- m_ParameterName: Threshold
m_GUID: b1b5c57689fc533408e6195c0a9e26a9
- m_ParameterName: Ratio
m_GUID: dc9c2c635bce58746bd68c7dffb99ca0
- m_ParameterName: Attack Time
m_GUID: 078ff252301e4594c880cd5754b8a563
- m_ParameterName: Release Time
m_GUID: b3918efd0a966ea4882714c0f9edd40b
- m_ParameterName: Make-up Gain
m_GUID: 3cf881ca64b7cdb46b35d3593ff2cbe9
- m_ParameterName: Knee
m_GUID: 31ea47a78d927ab4abf12f854bd4c626
- m_ParameterName: Sidechain Mix
m_GUID: 468d86503d3572541a33c33bb9693dfd
m_SendTarget: {fileID: 0}
m_EnableWetMix: 0
m_Bypass: 0
--- !u!244 &6554641470784401750
AudioMixerEffectController:
m_ObjectHideFlags: 3
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name:
m_EffectID: 4499c94d696ee5741a71370ed7431e12
m_EffectName: Send
m_MixLevel: f01b57f2509f26f4b8f2772993c2b8c6
m_Parameters: []
m_SendTarget: {fileID: 0}
m_EnableWetMix: 0
m_Bypass: 0
--- !u!244 &6637688299338053042
AudioMixerEffectController:
m_ObjectHideFlags: 3
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name:
m_EffectID: e84926aaeedf4074698e7d7f7f36b78b
m_EffectName: Attenuation
m_MixLevel: 8141a348079ee934686d3569f4758582
m_Parameters: []
m_SendTarget: {fileID: 0}
m_EnableWetMix: 0
m_Bypass: 0
--- !u!243 &7040861873718444651
AudioMixerGroupController:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: UISound - 0
m_AudioMixer: {fileID: 24100000}
m_GroupID: 29257697b1e6be546aa0558e342a15a6
m_Children: []
m_Volume: 6e0d1a5935a802d41b27d9e2fad3ba2f
m_Pitch: 7d01f3677fe8c5b41a877b64cc509766
m_Send: 00000000000000000000000000000000
m_Effects:
- {fileID: -4958177229083455073}
m_UserColorIndex: 3
m_Mute: 0
m_Solo: 0
m_BypassEffects: 0
--- !u!243 &7185772616558441635
AudioMixerGroupController:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: UISound
m_AudioMixer: {fileID: 24100000}
m_GroupID: df986418fa3e4ae448a1909ffbb633fb
m_Children:
- {fileID: 7040861873718444651}
- {fileID: -3720557753501792270}
- {fileID: 3865010338301366421}
- {fileID: 1601410790413250045}
m_Volume: 7d1c7ed015f5dba4f934c33ef330c5eb
m_Pitch: 611d9d89c8a65b548b591e852596c35d
m_Send: 00000000000000000000000000000000
m_Effects:
- {fileID: -998299258853400712}
m_UserColorIndex: 3
m_Mute: 0
m_Solo: 0
m_BypassEffects: 0
--- !u!243 &7235523536312936115
AudioMixerGroupController:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: Sound
m_AudioMixer: {fileID: 24100000}
m_GroupID: 648e49a020cf83346a9220d606e4ff39
m_Children:
- {fileID: -2659745067392564156}
- {fileID: -6280614258348125054}
- {fileID: -7758028812591520460}
- {fileID: -4372808504093502661}
m_Volume: 3bbd22597ed32714eb271cf06b098c63
m_Pitch: 7f8a6510dd472ff4db8b07c5079a2013
m_Send: 00000000000000000000000000000000
m_Effects:
- {fileID: 2567082640316932351}
m_UserColorIndex: 2
m_Mute: 0
m_Solo: 0
m_BypassEffects: 0
--- !u!244 &7834155774142160187
AudioMixerEffectController:
m_ObjectHideFlags: 3
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name:
m_EffectID: 09e809d6183106b4a804ff08ca8ff9ed
m_EffectName: Attenuation
m_MixLevel: 92339d91519b09543844a84cea03aed3
m_Parameters: []
m_SendTarget: {fileID: 0}
m_EnableWetMix: 0
m_Bypass: 0

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 1af7a1b121ae17541a1967d430cef006
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 0
userData:
assetBundleName:
assetBundleVariant: