AudioSourceConfig

This commit is contained in:
ThomasCharester committed 2025-11-23 01:39:08 +03:00
1 parent 35f703a8d2
commit f3a83eb909
13 files changed
+114 -18

No files matched your search

@@ -89,7 +89,8 @@ namespace Code.App
containerBuilder.AddSingleton(staticDataService.SFXListConfig, typeof(SFXListConfig)); containerBuilder.AddSingleton(staticDataService.SFXListConfig, typeof(SFXListConfig));
containerBuilder.AddSingleton(staticDataService.DispatcherSoundListConfig, typeof(DispatcherSoundListConfig)); containerBuilder.AddSingleton(staticDataService.DispatcherSoundListConfig, typeof(DispatcherSoundListConfig));
containerBuilder.AddSingleton(staticDataService.EnemiesSoundListConfig, typeof(EnemiesSoundListConfig)); containerBuilder.AddSingleton(staticDataService.EnemiesSoundListConfig, typeof(EnemiesSoundListConfig));
containerBuilder.AddSingleton(staticDataService.AudioSourceSettingsConfigs, typeof(Dictionary<AudioSourceType, AudioSourceSettingsConfig>));
containerBuilder.AddSingleton(staticDataService.OrderServiceConfig, typeof(OrderServiceConfig)); containerBuilder.AddSingleton(staticDataService.OrderServiceConfig, typeof(OrderServiceConfig));
containerBuilder.AddSingleton(staticDataService.OrderBoxConfig, typeof(OrderBoxConfig)); containerBuilder.AddSingleton(staticDataService.OrderBoxConfig, typeof(OrderBoxConfig));
} }
@@ -31,13 +31,16 @@ namespace Code.Audio
_courierGroup, _courierGroup,
_enemiesGroup; _enemiesGroup;
private readonly AudioSourcePool _audioSourcePool = new(); private readonly AudioSourcePool _audioSourcePool;
private Dictionary<AudioSnapshotState, AudioMixerSnapshot> _snapshots = new(); private Dictionary<AudioSnapshotState, AudioMixerSnapshot> _snapshots = new();
private Dictionary<AudioSourceType, AudioSourceSettingsConfig> _settings;
public AudioService(IAudioFactory audioFactory)
public AudioService(IAudioFactory audioFactory, Dictionary<AudioSourceType,AudioSourceSettingsConfig> settings)
{ {
_audioFactory = audioFactory; _audioFactory = audioFactory;
_audioSourcePool = new(settings);
_settings = settings;
} }
public async UniTask Initialize() public async UniTask Initialize()
@@ -86,7 +89,7 @@ namespace Code.Audio
if(!_musicAudioSources[musicType]) if(!_musicAudioSources[musicType])
{ {
_musicAudioSources[musicType] = _audioSourcePool.GetSource(); _musicAudioSources[musicType] = _audioSourcePool.GetSource();
_musicAudioSources[musicType].spatialBlend = 0f; _musicAudioSources[musicType].spatialBlend = _settings[AudioSourceType.NoBlend].spatialBlend;
_musicAudioSources[musicType].outputAudioMixerGroup = _musicAudioGroups[musicType]; _musicAudioSources[musicType].outputAudioMixerGroup = _musicAudioGroups[musicType];
} }
@@ -169,7 +172,7 @@ namespace Code.Audio
public void PlayDispatcher(DispatcherSounds dispatcherSoundId) public void PlayDispatcher(DispatcherSounds dispatcherSoundId)
{ {
OnDispatcherStarted?.Invoke(); OnDispatcherStarted?.Invoke();
_audioSourcePool.PlayShizo(_audioFactory.DispatcherAudios[(int)dispatcherSoundId], _dispatcherGroup, () => OnDispatcherEnded?.Invoke()); _audioSourcePool.PlayOneShot(_audioFactory.DispatcherAudios[(int)dispatcherSoundId], _dispatcherGroup, AudioSourceType.NoBlend, () => OnDispatcherEnded?.Invoke());
} }
} }
} }
@@ -1,4 +1,6 @@
using System; using System;
using System.Collections.Generic;
using Code.Configs;
using Cysharp.Threading.Tasks; using Cysharp.Threading.Tasks;
using UnityEngine; using UnityEngine;
using UnityEngine.Audio; using UnityEngine.Audio;
@@ -12,7 +14,11 @@ namespace Code.Audio
// The pool holds plain GameObjects (you can swap this for any component type). // The pool holds plain GameObjects (you can swap this for any component type).
private IObjectPool<AudioSource> _pool; private IObjectPool<AudioSource> _pool;
private GameObject _sourcePrefab; private GameObject _sourcePrefab;
private Dictionary<AudioSourceType, AudioSourceSettingsConfig> _settings;
public AudioSourcePool(Dictionary<AudioSourceType, AudioSourceSettingsConfig> settings) => _settings = settings;
public void Initialize(GameObject sourcePrefab) public void Initialize(GameObject sourcePrefab)
{ {
_sourcePrefab = sourcePrefab; _sourcePrefab = sourcePrefab;
@@ -56,12 +62,12 @@ namespace Code.Audio
{ {
Object.Destroy(source.gameObject); Object.Destroy(source.gameObject);
} }
public async UniTaskVoid PlayOneShot(AudioClip clip, Vector3 position, AudioMixerGroup audioMixerGroup, Action onComplete = null) public async UniTaskVoid PlayOneShot(AudioClip clip, Vector3 position, AudioMixerGroup audioMixerGroup, AudioSourceType audioSourceType = AudioSourceType.NoBlend, Action onComplete = null)
{ {
AudioSource source = _pool.Get(); AudioSource source = _pool.Get();
source.PlayOneShot(clip); source.PlayOneShot(clip);
source.spatialBlend = 1f; source.spatialBlend = _settings[audioSourceType].spatialBlend;
source.transform.position = position; source.transform.position = position;
source.outputAudioMixerGroup = audioMixerGroup; source.outputAudioMixerGroup = audioMixerGroup;
@@ -69,17 +75,17 @@ namespace Code.Audio
onComplete?.Invoke(); onComplete?.Invoke();
_pool.Release(source); _pool.Release(source);
} }
public async UniTaskVoid PlayShizo(AudioClip clip, AudioMixerGroup audioMixerGroup, Action onComplete = null) public async UniTaskVoid PlayOneShot(AudioClip clip, AudioMixerGroup audioMixerGroup, AudioSourceType audioSourceType = AudioSourceType.NoBlend, Action onComplete = null)
{ {
AudioSource source = _pool.Get(); AudioSource source = _pool.Get();
source.PlayOneShot(clip); source.PlayOneShot(clip);
source.spatialBlend = 0f; source.spatialBlend = _settings[audioSourceType].spatialBlend;
source.outputAudioMixerGroup = audioMixerGroup; source.outputAudioMixerGroup = audioMixerGroup;
await UniTask.WaitUntilValueChanged(source, x => x.isPlaying); await UniTask.WaitUntilValueChanged(source, x => x.isPlaying);
onComplete?.Invoke(); onComplete?.Invoke();
_pool.Release(source); _pool.Release(source);
} }
public AudioSource GetSource() => _pool.Get(); public AudioSource GetSource() => _pool.Get();
public void ReleaseSource(AudioSource source) => _pool.Release(source); public void ReleaseSource(AudioSource source) => _pool.Release(source);
} }
@@ -0,0 +1,8 @@
namespace Code.Audio
{
public enum AudioSourceType
{
Full3D,
NoBlend
}
}
@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 260bbb19b55049928b9ab4d55b32fc3f
timeCreated: 1763849966
@@ -0,0 +1,14 @@
using Code.Audio;
using UnityEngine;
namespace Code.Configs
{
[CreateAssetMenu(fileName = "AudioSourceSettingsConfig", menuName = "Audio/AudioSourceSettingsConfig")]
public class AudioSourceSettingsConfig : ScriptableObject
{
// Дополнять по мере необходимости
public float spatialBlend;
public AudioSourceType sourceType;
}
}
@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: e6406ab390b74d5ca336d7d4d0e1a732
timeCreated: 1763850008
@@ -1,6 +1,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Threading.Tasks; using System.Threading.Tasks;
using Code.Audio;
using Code.Configs; using Code.Configs;
using Code.Gameplay.Camera; using Code.Gameplay.Camera;
using Cysharp.Threading.Tasks; using Cysharp.Threading.Tasks;
@@ -25,6 +26,7 @@ namespace Code.StaticData
OrderServiceConfig OrderServiceConfig { get; } OrderServiceConfig OrderServiceConfig { get; }
OrderBoxConfig OrderBoxConfig { get; } OrderBoxConfig OrderBoxConfig { get; }
Dictionary<CameraMode, CameraSettingsConfig> CameraSettingsConfigs { get; } Dictionary<CameraMode, CameraSettingsConfig> CameraSettingsConfigs { get; }
Dictionary<AudioSourceType, AudioSourceSettingsConfig> AudioSourceSettingsConfigs { get; }
void Load(); void Load();
Task<T> InstantiateAsset<T>(AssetReference assetReference) where T : Behaviour; Task<T> InstantiateAsset<T>(AssetReference assetReference) where T : Behaviour;
} }
@@ -1,6 +1,7 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
using Code.Audio;
using Code.Configs; using Code.Configs;
using Code.Constants; using Code.Constants;
using Code.Gameplay.Camera; using Code.Gameplay.Camera;
@@ -27,7 +28,9 @@ namespace Code.StaticData
public OrderBoxConfig OrderBoxConfig { get; private set; } public OrderBoxConfig OrderBoxConfig { get; private set; }
public Dictionary<CameraMode, CameraSettingsConfig> CameraSettingsConfigs { get; private set; } = new(); public Dictionary<CameraMode, CameraSettingsConfig> CameraSettingsConfigs { get; private set; } = new();
public Dictionary<AudioSourceType, AudioSourceSettingsConfig> AudioSourceSettingsConfigs { get; private set; } = new();
public void Load() public void Load()
{ {
InputConfig = Resources.Load<InputConfig>(string.Format(StringPaths.ConfigSingle, "App", "InputConfig")); InputConfig = Resources.Load<InputConfig>(string.Format(StringPaths.ConfigSingle, "App", "InputConfig"));
@@ -37,10 +40,12 @@ namespace Code.StaticData
PlayerConfig = Resources.Load<PlayerConfig>(string.Format(StringPaths.ConfigSingle, "App", "PlayerConfig")); PlayerConfig = Resources.Load<PlayerConfig>(string.Format(StringPaths.ConfigSingle, "App", "PlayerConfig"));
OrderServiceConfig = Resources.Load<OrderServiceConfig>(string.Format(StringPaths.ConfigSingle, "Gameplay", "OrderServiceConfig")); OrderServiceConfig = Resources.Load<OrderServiceConfig>(string.Format(StringPaths.ConfigSingle, "Gameplay", "OrderServiceConfig"));
OrderBoxConfig = Resources.Load<OrderBoxConfig>(string.Format(StringPaths.ConfigSingle, "Gameplay", "OrderBoxConfig")); OrderBoxConfig = Resources.Load<OrderBoxConfig>(string.Format(StringPaths.ConfigSingle, "Gameplay", "OrderBoxConfig"));
CameraConfig = Resources.Load<CameraConfig>(string.Format(StringPaths.ConfigSingle, "Camera", "CameraConfig")); CameraConfig = Resources.Load<CameraConfig>(string.Format(StringPaths.ConfigSingle, "Camera", "CameraConfig"));
CameraSettingsConfigs = Resources.LoadAll<CameraSettingsConfig>(string.Format(StringPaths.ConfigMultiple, "Camera")).ToDictionary(x=> x.cameraMode); CameraSettingsConfigs = Resources
.LoadAll<CameraSettingsConfig>(string.Format(StringPaths.ConfigMultiple, "Camera"))
.ToDictionary(x => x.cameraMode);
LoadAudioConfigs(); LoadAudioConfigs();
} }
@@ -51,11 +56,14 @@ namespace Code.StaticData
SFXListConfig = Resources.Load<SFXListConfig>(string.Format(StringPaths.ConfigSingle, "Audio", "SFXListConfig")); SFXListConfig = Resources.Load<SFXListConfig>(string.Format(StringPaths.ConfigSingle, "Audio", "SFXListConfig"));
DispatcherSoundListConfig = Resources.Load<DispatcherSoundListConfig>(string.Format(StringPaths.ConfigSingle, "Audio", "DispatcherSoundListConfig")); DispatcherSoundListConfig = Resources.Load<DispatcherSoundListConfig>(string.Format(StringPaths.ConfigSingle, "Audio", "DispatcherSoundListConfig"));
EnemiesSoundListConfig = Resources.Load<EnemiesSoundListConfig>(string.Format(StringPaths.ConfigSingle, "Audio", "EnemiesSoundListConfig")); EnemiesSoundListConfig = Resources.Load<EnemiesSoundListConfig>(string.Format(StringPaths.ConfigSingle, "Audio", "EnemiesSoundListConfig"));
AudioSourceSettingsConfigs = Resources
.LoadAll<AudioSourceSettingsConfig>(string.Format(StringPaths.ConfigMultiple, "Audio"))
.ToDictionary(x => x.sourceType);
} }
public async Task<T> InstantiateAsset<T>(AssetReference assetReference) where T : Behaviour public async Task<T> InstantiateAsset<T>(AssetReference assetReference) where T : Behaviour
{ {
return (await Addressables.InstantiateAsync(assetReference).ToUniTask()).GetComponent<T>(); return (await Addressables.InstantiateAsync(assetReference).ToUniTask()).GetComponent<T>();
} }
} }
} }
@@ -0,0 +1,16 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: e6406ab390b74d5ca336d7d4d0e1a732, type: 3}
m_Name: Full3D
m_EditorClassIdentifier: Assembly-CSharp::Code.Configs.AudioSourceSettingsConfig
spatialBlend: 1
sourceType: 0
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 058f1d54faced1a488eff486612f38e5
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,16 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: e6406ab390b74d5ca336d7d4d0e1a732, type: 3}
m_Name: NoBlend
m_EditorClassIdentifier: Assembly-CSharp::Code.Configs.AudioSourceSettingsConfig
spatialBlend: 0
sourceType: 1
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 86857ed7de331464dacb1a95b66b970d
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant: