riversong code showcase
This commit is contained in:
82
Source/Riversong/Game/Audio/BackgroundMusicSystem.cs
Normal file
82
Source/Riversong/Game/Audio/BackgroundMusicSystem.cs
Normal file
@@ -0,0 +1,82 @@
|
||||
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();
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user