Files
riversong-code-showcase/Source/Riversong/Game/Audio/BackgroundMusicSystem.cs
2026-05-21 16:04:49 +02:00

82 lines
2.5 KiB
C#

using System;
using Cysharp.Threading.Tasks;
using PrimeTween;
using UnityEngine;
namespace DanieleMarotta.RiversongCodeShowcase
{
[GameSystemGroup(typeof(AudioSystemGroup))]
public class BackgroundMusicSystem : GameSystem, IInitializable, IDisposable
{
[InjectService]
private GameConfig _config;
[InjectService]
private IScene _scene;
[InjectService]
private ISignalBus _signalBus;
private AudioSource _audioSource;
private AudioClip _mainThemeClip;
private AudioClip _gameplayClip;
public BackgroundMusicSystem(IServiceLocator serviceLocator) : base(serviceLocator)
{
}
public async UniTask InitializeAsync()
{
_audioSource = new GameObject("BGM").AddComponent<AudioSource>();
_audioSource.transform.SetParent(_scene.SceneFolders.AudioSources);
_audioSource.playOnAwake = false;
_audioSource.loop = true;
_mainThemeClip = await _config.Audio.MainThemeClip.LoadAssetAsync<AudioClip>();
_gameplayClip = await _config.Audio.GameplayClip.LoadAssetAsync<AudioClip>();
_signalBus.Subscribe<GameInitializationCompletedSignal>(OnGameInitializationCompleted);
_signalBus.Subscribe<GameStartedSignal>(OnGameStarted);
_signalBus.Subscribe<WorldReadySignal>(OnWorldReady);
}
public void Dispose()
{
_signalBus.Unsubscribe<GameInitializationCompletedSignal>(OnGameInitializationCompleted);
_signalBus.Unsubscribe<GameStartedSignal>(OnGameStarted);
_signalBus.Unsubscribe<WorldReadySignal>(OnWorldReady);
}
private void OnGameInitializationCompleted(GameInitializationCompletedSignal signal)
{
Play(_mainThemeClip, _config.Audio.MainThemeVolume);
}
private void OnGameStarted(GameStartedSignal signal)
{
_ = FadeOutAsync(2);
}
private async UniTask FadeOutAsync(float duration)
{
await Tween.Custom(_audioSource.volume, 0, duration, value => _audioSource.volume = value, Ease.Linear);
}
private void OnWorldReady(WorldReadySignal signal)
{
Play(_gameplayClip, _config.Audio.GameplayVolume);
}
private void Play(AudioClip clip, float volume)
{
_audioSource.Stop();
_audioSource.clip = clip;
_audioSource.volume = volume;
_audioSource.Play();
}
}
}