Дебажный менеджер музыки
This commit is contained in:
1 parent
0f8a629e4b
commit
b13cf8cfc0
96 files changed
+4042
-817
No files matched your search
@@ -0,0 +1,52 @@
|
||||
using System;
|
||||
using Code.Configs;
|
||||
using Cysharp.Threading.Tasks;
|
||||
using UnityEngine.AddressableAssets;
|
||||
using UnityEngine.Audio;
|
||||
using Object = UnityEngine.Object;
|
||||
|
||||
namespace Code.Audio
|
||||
{
|
||||
public class AudioFactory : IAudioFactory
|
||||
{
|
||||
private AssetReference _audioMixerPrefab;
|
||||
|
||||
private AssetReference[] _peacefulSoundtrack;
|
||||
private AssetReference[] _actionSoundtrack;
|
||||
private AssetReference[] _SFX;
|
||||
private AssetReference[] _enemies;
|
||||
private AssetReference[] _dispatcher;
|
||||
private AssetReference[] _character;
|
||||
|
||||
public AudioFactory(AudioMixerConfig audioMixerConfig,
|
||||
SoundtrackListConfig soundtrackListConfig,
|
||||
SFXListConfig sfxListConfig,
|
||||
EnemiesSoundListConfig enemiesSoundListConfig,
|
||||
DispatcherSoundListConfig dispatcherSoundListConfig,
|
||||
CharacterSoundListConfig characterSoundListConfig)
|
||||
{
|
||||
_audioMixerPrefab = audioMixerConfig.audioMixerPrefab;
|
||||
|
||||
_peacefulSoundtrack = soundtrackListConfig.peacefulSoundtrack;
|
||||
_actionSoundtrack = soundtrackListConfig.actionSoundtrack;
|
||||
_SFX = sfxListConfig.SFX;
|
||||
_enemies = enemiesSoundListConfig.enemies;
|
||||
_dispatcher = dispatcherSoundListConfig.dispatcher;
|
||||
_character = characterSoundListConfig.character;
|
||||
}
|
||||
public async UniTask<AudioMixer> CreateCanvas()
|
||||
{
|
||||
AudioMixer audioMixer = (await Addressables.InstantiateAsync(_audioMixerPrefab).ToUniTask()).GetComponent<AudioMixer>();
|
||||
|
||||
Object.DontDestroyOnLoad(audioMixer);
|
||||
|
||||
return audioMixer;
|
||||
}
|
||||
|
||||
public void ReleaseMixer()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 5a4b48740d194d4dafa1732f96d71687
|
||||
timeCreated: 1762626915
|
||||
@@ -0,0 +1,57 @@
|
||||
using System;
|
||||
using Code.Configs;
|
||||
using Code.Constants;
|
||||
using Unity.VisualScripting;
|
||||
using UnityEngine.AddressableAssets;
|
||||
using UnityEngine.Audio;
|
||||
|
||||
namespace Code.Audio
|
||||
{
|
||||
public class AudioService : IAudioService, IDisposable
|
||||
{
|
||||
private IAudioFactory _audioFactory;
|
||||
|
||||
private AudioMixer _mixer;
|
||||
|
||||
private AudioMixerGroup _masterGroup,
|
||||
_musicGroup,
|
||||
_actionMusicGroup,
|
||||
_peacefulMusicGroup,
|
||||
_SFXGroup,
|
||||
_creaturesGroup,
|
||||
_dispatcherGroup,
|
||||
_courierGroup,
|
||||
_enemiesGroup;
|
||||
|
||||
public AudioService(AudioFactory audioFactory)
|
||||
{
|
||||
_audioFactory = audioFactory;
|
||||
}
|
||||
|
||||
public async void Initialize(Action callback)
|
||||
{
|
||||
_mixer = await _audioFactory.CreateCanvas();
|
||||
|
||||
MixerCreated();
|
||||
|
||||
callback?.Invoke();
|
||||
}
|
||||
|
||||
private void MixerCreated()
|
||||
{
|
||||
_masterGroup = _mixer.FindMatchingGroups(AudioGroups.MasterGroup)[0];
|
||||
_actionMusicGroup = _mixer.FindMatchingGroups(AudioGroups.ActionMusicGroup)[0];
|
||||
_peacefulMusicGroup = _mixer.FindMatchingGroups(AudioGroups.PeacefulMusicGroup)[0];
|
||||
_SFXGroup = _mixer.FindMatchingGroups(AudioGroups.SFXGroup)[0];
|
||||
_musicGroup = _mixer.FindMatchingGroups(AudioGroups.MusicGroup)[0];
|
||||
_creaturesGroup = _mixer.FindMatchingGroups(AudioGroups.CreaturesGroup)[0];
|
||||
_dispatcherGroup = _mixer.FindMatchingGroups(AudioGroups.DispatcherMusicGroup)[0];
|
||||
_courierGroup = _mixer.FindMatchingGroups(AudioGroups.CourierMusicGroup)[0];
|
||||
_enemiesGroup = _mixer.FindMatchingGroups(AudioGroups.EnemiesMusicGroup)[0];
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: bf44cb051308463494bd930f2a3d31e4
|
||||
timeCreated: 1762625073
|
||||
@@ -0,0 +1,139 @@
|
||||
using System.Collections.Generic;
|
||||
using Code.Constants;
|
||||
using UnityEngine;
|
||||
using UnityEngine.Audio;
|
||||
using UnityEngine.Serialization;
|
||||
|
||||
namespace Code.Audio
|
||||
{
|
||||
public class AudioServiceDebug : MonoBehaviour
|
||||
{
|
||||
[SerializeField] private AudioMixer mixer;
|
||||
|
||||
private AudioSource _actionMusicSource;
|
||||
private AudioSource _peacefulMusicSource;
|
||||
[SerializeField] private AudioSource prefab;
|
||||
|
||||
[SerializeField] private AudioResource[] peacefulAudio;
|
||||
[SerializeField] private AudioResource[] actionAudio;
|
||||
|
||||
private AudioMixerGroup _masterGroup,
|
||||
_musicGroup,
|
||||
_actionMusicGroup,
|
||||
_peacefulMusicGroup,
|
||||
_SFXGroup,
|
||||
_creaturesGroup,
|
||||
_dispatcherGroup,
|
||||
_courierGroup,
|
||||
_enemiesGroup;
|
||||
|
||||
private readonly AudioSourcePool _audioSourcePool = new();
|
||||
|
||||
private Dictionary<AudioSnapshotState, AudioMixerSnapshot> _snapshots = new();
|
||||
|
||||
[FormerlySerializedAs("sfxAudio")] [SerializeField] private AudioClip[] sfxAudios;
|
||||
[SerializeField] private AudioClip[] enemiesAudios;
|
||||
[SerializeField] private AudioClip[] dispatcherAudios;
|
||||
|
||||
private void MixerCreated()
|
||||
{
|
||||
_masterGroup = mixer.FindMatchingGroups(AudioGroups.MasterGroup)[0];
|
||||
_actionMusicGroup = mixer.FindMatchingGroups(AudioGroups.ActionMusicGroup)[0];
|
||||
_peacefulMusicGroup = mixer.FindMatchingGroups(AudioGroups.PeacefulMusicGroup)[0];
|
||||
_SFXGroup = mixer.FindMatchingGroups(AudioGroups.SFXGroup)[0];
|
||||
_musicGroup = mixer.FindMatchingGroups(AudioGroups.MusicGroup)[0];
|
||||
_creaturesGroup = mixer.FindMatchingGroups(AudioGroups.CreaturesGroup)[0];
|
||||
_dispatcherGroup = mixer.FindMatchingGroups(AudioGroups.DispatcherMusicGroup)[0];
|
||||
_courierGroup = mixer.FindMatchingGroups(AudioGroups.CourierMusicGroup)[0];
|
||||
_enemiesGroup = mixer.FindMatchingGroups(AudioGroups.EnemiesMusicGroup)[0];
|
||||
|
||||
_snapshots[AudioSnapshotState.Peaceful] = mixer.FindSnapshot(AudioGroups.PeacefulSnapshot);
|
||||
_snapshots[AudioSnapshotState.Action] = mixer.FindSnapshot(AudioGroups.ActionSnapshot);
|
||||
|
||||
_audioSourcePool.Initialize(10,prefab);
|
||||
|
||||
InitializeMusicSources();
|
||||
}
|
||||
|
||||
private void InitializeMusicSources()
|
||||
{
|
||||
_actionMusicSource = _audioSourcePool.GetSource();
|
||||
_actionMusicSource.outputAudioMixerGroup = _actionMusicGroup;
|
||||
_actionMusicSource.spatialBlend = 0f;
|
||||
|
||||
_peacefulMusicSource = _audioSourcePool.GetSource();
|
||||
_peacefulMusicSource.outputAudioMixerGroup = _peacefulMusicGroup;
|
||||
_peacefulMusicSource.spatialBlend = 0f;
|
||||
}
|
||||
|
||||
private void Start()
|
||||
{
|
||||
MixerCreated();
|
||||
}
|
||||
|
||||
public void PlayRandomGameplayMusic()
|
||||
{
|
||||
_peacefulMusicSource.resource = peacefulAudio[Random.Range(0, peacefulAudio.Length)];
|
||||
_actionMusicSource.resource = actionAudio[Random.Range(0, actionAudio.Length)];
|
||||
|
||||
_peacefulMusicSource.Play();
|
||||
_actionMusicSource.Play();
|
||||
}
|
||||
|
||||
public void TransitToSnapshot(AudioSnapshotState state)
|
||||
{
|
||||
_snapshots[state].TransitionTo(1f);
|
||||
}
|
||||
|
||||
#pragma warning disable CS4014 // Because this call is not awaited, execution of the current method continues before the call is completed
|
||||
public void PlaySFX(SFXSounds sfxId, Vector3 position)
|
||||
{
|
||||
_audioSourcePool.PlayOneShot(sfxAudios[(int)sfxId], position, _SFXGroup);
|
||||
}
|
||||
public void PlayDebugSFX()
|
||||
{
|
||||
_audioSourcePool.PlayOneShot(sfxAudios[(int)SFXSounds.Crowbar], transform.position, _SFXGroup);
|
||||
}
|
||||
public void PlayEnemy(EnemiesSounds enemySoundId, Vector3 position)
|
||||
{
|
||||
_audioSourcePool.PlayOneShot(enemiesAudios[(int)enemySoundId], position, _enemiesGroup);
|
||||
}
|
||||
public void PlayDebugEnemySFX()
|
||||
{
|
||||
_audioSourcePool.PlayOneShot(enemiesAudios[(int)EnemiesSounds.Bastard], transform.position, _enemiesGroup);
|
||||
}
|
||||
public void PlayDispatcher(DispatcherSounds dispatcherSoundId)
|
||||
{
|
||||
_audioSourcePool.PlayShizo(dispatcherAudios[(int)dispatcherSoundId], _dispatcherGroup);
|
||||
}
|
||||
public void PlayDebugDispatcherSFX()
|
||||
{
|
||||
_audioSourcePool.PlayShizo(dispatcherAudios[(int)DispatcherSounds.AhFreeman], _dispatcherGroup);
|
||||
}
|
||||
|
||||
#pragma warning restore CS4014 // Because this call is not awaited, execution of the current method continues before the call is completed
|
||||
}
|
||||
|
||||
public enum SFXSounds
|
||||
{
|
||||
Crowbar,
|
||||
Shot357
|
||||
}
|
||||
public enum UISounds
|
||||
{
|
||||
Crowbar
|
||||
}
|
||||
public enum EnemiesSounds
|
||||
{
|
||||
Bastard,
|
||||
Bravo
|
||||
}
|
||||
public enum DispatcherSounds
|
||||
{
|
||||
Absolutely,
|
||||
AbsolutelyNot,
|
||||
AhFreeman
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: a42cad8f28f54a53bef23d9313014abd
|
||||
timeCreated: 1762805867
|
||||
@@ -0,0 +1,8 @@
|
||||
namespace Code.Audio
|
||||
{
|
||||
public enum AudioSnapshotState
|
||||
{
|
||||
Peaceful,
|
||||
Action
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 29adaf8e912649d9b91c09735e36840a
|
||||
timeCreated: 1762808301
|
||||
@@ -0,0 +1,83 @@
|
||||
using Cysharp.Threading.Tasks;
|
||||
using UnityEngine;
|
||||
using UnityEngine.Audio;
|
||||
using UnityEngine.Pool;
|
||||
|
||||
namespace Code.Audio
|
||||
{
|
||||
public class AudioSourcePool
|
||||
{
|
||||
// The pool holds plain GameObjects (you can swap this for any component type).
|
||||
private IObjectPool<AudioSource> _pool;
|
||||
private AudioSource _sourcePrefab;
|
||||
|
||||
public void Initialize(int count, AudioSource sourcePrefab)
|
||||
{
|
||||
_sourcePrefab = sourcePrefab;
|
||||
|
||||
// Create a pool with the four core callbacks.
|
||||
_pool = new ObjectPool<AudioSource>(
|
||||
createFunc: CreateItem,
|
||||
// actionOnGet: OnGet,
|
||||
// actionOnRelease: OnRelease,
|
||||
actionOnDestroy: OnDestroyItem,
|
||||
collectionCheck: true, // helps catch double-release mistakes
|
||||
defaultCapacity: count,
|
||||
maxSize: 20
|
||||
);
|
||||
}
|
||||
|
||||
// Creates a new pooled GameObject the first time (and whenever the pool needs more).
|
||||
private AudioSource CreateItem()
|
||||
{
|
||||
AudioSource audioSource = Object.Instantiate(_sourcePrefab);
|
||||
audioSource.name = "PooledAudioSource";
|
||||
Object.DontDestroyOnLoad(audioSource);
|
||||
return audioSource;
|
||||
}
|
||||
|
||||
// Called when an item is taken from the pool.
|
||||
private void OnGet(AudioSource source)
|
||||
{
|
||||
//source.gameObject.SetActive(true);
|
||||
}
|
||||
|
||||
// Called when an item is returned to the pool.
|
||||
private void OnRelease(AudioSource source)
|
||||
{
|
||||
//source.gameObject.SetActive(false);
|
||||
}
|
||||
|
||||
// Called when the pool decides to destroy an item (e.g., above max size).
|
||||
private void OnDestroyItem(AudioSource source)
|
||||
{
|
||||
Object.Destroy(source.gameObject);
|
||||
}
|
||||
|
||||
public async UniTaskVoid PlayOneShot(AudioClip clip, Vector3 position, AudioMixerGroup audioMixerGroup)
|
||||
{
|
||||
AudioSource source = _pool.Get();
|
||||
source.PlayOneShot(clip);
|
||||
source.spatialBlend = 1f;
|
||||
source.transform.position = position;
|
||||
source.outputAudioMixerGroup = audioMixerGroup;
|
||||
|
||||
await UniTask.WaitUntilValueChanged(source, x => x.isPlaying);
|
||||
|
||||
_pool.Release(source);
|
||||
}
|
||||
public async UniTaskVoid PlayShizo(AudioClip clip, AudioMixerGroup audioMixerGroup)
|
||||
{
|
||||
AudioSource source = _pool.Get();
|
||||
source.PlayOneShot(clip);
|
||||
source.spatialBlend = 0f;
|
||||
source.outputAudioMixerGroup = audioMixerGroup;
|
||||
|
||||
await UniTask.WaitUntilValueChanged(source, x => x.isPlaying);
|
||||
|
||||
_pool.Release(source);
|
||||
}
|
||||
public AudioSource GetSource() => _pool.Get();
|
||||
public void ReleaseSource(AudioSource source) => _pool.Release(source);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 370b6a43a74744ff9d90a99991b104f7
|
||||
timeCreated: 1762852042
|
||||
@@ -0,0 +1,10 @@
|
||||
using Cysharp.Threading.Tasks;
|
||||
using UnityEngine.Audio;
|
||||
|
||||
namespace Code.Audio
|
||||
{
|
||||
public interface IAudioFactory
|
||||
{
|
||||
UniTask<AudioMixer> CreateCanvas();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: ea837e1ca08a4846b7f4ce2df771bf65
|
||||
timeCreated: 1762804793
|
||||
@@ -0,0 +1,9 @@
|
||||
using System;
|
||||
|
||||
namespace Code.Audio
|
||||
{
|
||||
public interface IAudioService
|
||||
{
|
||||
void Initialize(Action callback);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 30521fadcce84848ae88363e915bceb4
|
||||
timeCreated: 1762804728
|
||||
Reference in new issue
Block a user