Component that manages background music for a 2D game. It plays menu and wind loop sounds on start, listens for ChainReactionGame start/return events to stop/start game music, and exposes methods to stop or play the menu music.
using Sandbox;
public sealed class MusicManager : Component
{
public static MusicManager Instance { get; private set; }
SoundHandle _menuMusic;
SoundHandle _windMusic;
SoundHandle _gameMusic;
protected override void OnStart()
{
Instance = this;
// Subscribe to game events
if (ChainReactionGame.Instance != null)
{
ChainReactionGame.Instance.OnGameStarted += OnGameStarted;
ChainReactionGame.Instance.OnGameReturned += OnGameReturned;
}
// Start menu music
_menuMusic = Sound.Play("phonk_menu_music", .25f);
_windMusic = Sound.Play("wind_blowing_loop", .25f);
}
void OnGameStarted()
{
_menuMusic.Stop(.5f);
_windMusic.Stop(.5f);
// Only start game music if not already playing
if (!_gameMusic.IsValid())
_gameMusic = Sound.Play("abydos_game");
}
public void StopMenuMusic()
{
if(_menuMusic.IsValid())
_menuMusic.Stop(0f);
if(_windMusic.IsValid())
_windMusic.Stop(0f);
}
public void PlayMenuMusic()
{
_menuMusic = Sound.Play("phonk_menu_music", .25f);
_windMusic = Sound.Play("wind_blowing_loop", .25f);
}
void OnGameReturned()
{
_gameMusic.Stop(.5f);
_menuMusic = Sound.Play("phonk_menu_music", .3f);
_windMusic = Sound.Play("wind_blowing_loop", .3f);
}
}