Pro_Unit

AreaAudioService

Jun 4th, 2025
138
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 3.26 KB | None | 0 0
  1. public class AreaAudioService : IInitializable
  2. {
  3.     private readonly AreaIDAudioClip _areaAudioClipConfig;
  4.     private readonly AudioServiceStaticConfig _config;
  5.     private AudioSource _audioSource;
  6.  
  7.     private AudioClip _currentClip;
  8.     private AssetReference _currentClipReference;
  9.  
  10.     private bool _isTransitioning;
  11.     private bool _isLoading;
  12.     private bool _isBlocked;
  13.  
  14.     public AreaAudioService(AreaIDAudioClip areaAudioClipConfig, AudioServiceStaticConfig config)
  15.     {
  16.         _areaAudioClipConfig = areaAudioClipConfig;
  17.         _config = config;
  18.     }
  19.  
  20.     public AreaID CurrentAreaId { get; private set; }
  21.  
  22.     public void Initialize()
  23.     {
  24.         _audioSource = new GameObject(nameof(AreaAudioService)).AddComponent<AudioSource>();
  25.         _audioSource.playOnAwake = false;
  26.         _audioSource.volume = 0;
  27.     }
  28.  
  29.     public async UniTask PlayAudioForArea(AreaID areaId)
  30.     {
  31.         CurrentAreaId = areaId;
  32.         if (_isBlocked || _isTransitioning || _isLoading)
  33.             return;
  34.  
  35.         AssetReference clipReference = _areaAudioClipConfig.GetValue(areaId);
  36.         if (_currentClipReference == clipReference)
  37.             return;
  38.  
  39.         UnloadCurrentClip();
  40.         _isLoading = true;
  41.  
  42.         try
  43.         {
  44.             _currentClipReference = clipReference;
  45.  
  46.             // Проверка перед загрузкой
  47.             var validate = Addressables.LoadResourceLocationsAsync(clipReference);
  48.             await validate.Task;
  49.             if (validate.Status != AsyncOperationStatus.Succeeded || validate.Result.Count == 0)
  50.             {
  51.                 Debug.LogWarning($"[AreaAudioService] Audio not found for {areaId} ({clipReference.RuntimeKey})");
  52.                 _isLoading = false;
  53.                 return;
  54.             }
  55.  
  56.             _currentClip = await _currentClipReference.LoadAssetAsync<AudioClip>();
  57.             _isLoading = false;
  58.  
  59.             await StartPlayingClip(_currentClip);
  60.         }
  61.         catch (Exception ex)
  62.         {
  63.             Debug.LogError($"Failed to load AudioClip for AreaID {areaId}: {ex.Message}");
  64.             _isLoading = false;
  65.         }
  66.     }
  67.  
  68.     private async UniTask StartPlayingClip(AudioClip clip)
  69.     {
  70.         if (clip == null) throw new ArgumentNullException(nameof(clip));
  71.  
  72.         _audioSource.clip = clip;
  73.         _audioSource.volume = 0f;
  74.         _audioSource.Play();
  75.  
  76.         _isTransitioning = true;
  77.         await _audioSource.DOFade(_config.MaxVolume, _config.FadeInDuration).AsyncWaitForCompletion();
  78.         _isTransitioning = false;
  79.     }
  80.  
  81.     public async UniTask StopCurrentAudio()
  82.     {
  83.         if (_isTransitioning) return;
  84.         _isTransitioning = true;
  85.  
  86.         await _audioSource.DOFade(0f, _config.FadeOutDuration).AsyncWaitForCompletion();
  87.         OnFadeOutComplete();
  88.     }
  89.  
  90.     private void OnFadeOutComplete()
  91.     {
  92.         UnloadCurrentClip();
  93.         _isTransitioning = false;
  94.     }
  95.  
  96.     private void UnloadCurrentClip()
  97.     {
  98.         if (_currentClipReference != null && _currentClip != null)
  99.         {
  100.             _currentClipReference.ReleaseAsset();
  101.             _currentClip = null;
  102.         }
  103.  
  104.         if (_audioSource == null) return;
  105.  
  106.         _audioSource.Stop();
  107.         _audioSource.clip = null;
  108.     }
  109. }
Advertisement
Add Comment
Please, Sign In to add comment