Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- public class AreaAudioService : IInitializable
- {
- private readonly AreaIDAudioClip _areaAudioClipConfig;
- private readonly AudioServiceStaticConfig _config;
- private AudioSource _audioSource;
- private AudioClip _currentClip;
- private AssetReference _currentClipReference;
- private bool _isTransitioning;
- private bool _isLoading;
- private bool _isBlocked;
- public AreaAudioService(AreaIDAudioClip areaAudioClipConfig, AudioServiceStaticConfig config)
- {
- _areaAudioClipConfig = areaAudioClipConfig;
- _config = config;
- }
- public AreaID CurrentAreaId { get; private set; }
- public void Initialize()
- {
- _audioSource = new GameObject(nameof(AreaAudioService)).AddComponent<AudioSource>();
- _audioSource.playOnAwake = false;
- _audioSource.volume = 0;
- }
- public async UniTask PlayAudioForArea(AreaID areaId)
- {
- CurrentAreaId = areaId;
- if (_isBlocked || _isTransitioning || _isLoading)
- return;
- AssetReference clipReference = _areaAudioClipConfig.GetValue(areaId);
- if (_currentClipReference == clipReference)
- return;
- UnloadCurrentClip();
- _isLoading = true;
- try
- {
- _currentClipReference = clipReference;
- // Проверка перед загрузкой
- var validate = Addressables.LoadResourceLocationsAsync(clipReference);
- await validate.Task;
- if (validate.Status != AsyncOperationStatus.Succeeded || validate.Result.Count == 0)
- {
- Debug.LogWarning($"[AreaAudioService] Audio not found for {areaId} ({clipReference.RuntimeKey})");
- _isLoading = false;
- return;
- }
- _currentClip = await _currentClipReference.LoadAssetAsync<AudioClip>();
- _isLoading = false;
- await StartPlayingClip(_currentClip);
- }
- catch (Exception ex)
- {
- Debug.LogError($"Failed to load AudioClip for AreaID {areaId}: {ex.Message}");
- _isLoading = false;
- }
- }
- private async UniTask StartPlayingClip(AudioClip clip)
- {
- if (clip == null) throw new ArgumentNullException(nameof(clip));
- _audioSource.clip = clip;
- _audioSource.volume = 0f;
- _audioSource.Play();
- _isTransitioning = true;
- await _audioSource.DOFade(_config.MaxVolume, _config.FadeInDuration).AsyncWaitForCompletion();
- _isTransitioning = false;
- }
- public async UniTask StopCurrentAudio()
- {
- if (_isTransitioning) return;
- _isTransitioning = true;
- await _audioSource.DOFade(0f, _config.FadeOutDuration).AsyncWaitForCompletion();
- OnFadeOutComplete();
- }
- private void OnFadeOutComplete()
- {
- UnloadCurrentClip();
- _isTransitioning = false;
- }
- private void UnloadCurrentClip()
- {
- if (_currentClipReference != null && _currentClip != null)
- {
- _currentClipReference.ReleaseAsset();
- _currentClip = null;
- }
- if (_audioSource == null) return;
- _audioSource.Stop();
- _audioSource.clip = null;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment