Game/2D/MusicManager.cs

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.

Networking
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);
    }
}