You can use the DontDestroyOnLoad function to keep a script and related Game Object from being destroyed when you change scenes. This is particularly helpful for playing theme music. Without it, the music would restart on every scene change.
This script also subscribes to the sceneLoaded Action allowing us to determine if the scene changed and add logic to change the music based on the new scene.
using UnityEngine;
namespace MyAmazingGame.Components
{
public enum MusicFiles
{
None,
DrumsOnly,
ThemeMusic
}
public class MusicPlayer : MonoBehaviour
{
//static instance of the MusicPlayer to check if we should keep or delete new instances
static MusicPlayer Player_Instance;
//two audio sources - the MusicPlayer script is attached to a Game Object
//audio sources are added as children to the Game Object
//audio sources have "Play On Awake" set to false
//the audio sources are referenced by adding them in the Eidtor to these audio variables
public AudioSource _Audio__Drums_Only;
public AudioSource _Audio__Theme_Music;
private void Start()
{
if (MusicPlayer.Player_Instance == null)
{
Debug.Log("MusicPlayer: Start: Initial Music Player: Dont Destroy");
//dont destroy this instance
DontDestroyOnLoad(this);
//save a reference to this instance in the static variable
MusicPlayer.Player_Instance = this;
//track scene changes
UnityEngine.SceneManagement.SceneManager.sceneLoaded += OnSceneLoaded;
//start music
this.Start_Stop_Music(MusicFiles.DrumsOnly);
}
else
{
Debug.Log("MusicPlayer: Start: NOT Initial Music Player: Destroy");
Destroy(this.gameObject);
}
}
void Start_Stop_Music(MusicFiles music_file)
{
//this assumes you have additional ui to enabled/disable this preference
var play_music = PlayerPrefs.GetString("music");
if (play_music?.ToLower() == "false")
{
//stop all music
this._Audio__Drums_Only.Stop();
this._Audio__Theme_Music.Stop();
return;
}
if (music_file == MusicFiles.DrumsOnly)
{
//stop others
this._Audio__Theme_Music.Stop();
//start if not already playing
if (this._Audio__Drums_Only.isPlaying == false)
{
this._Audio__Drums_Only.Play();
}
}
else if (music_file == MusicFiles.ThemeMusic)
{
//stop others
this._Audio__Drums_Only.Stop();
//start if not already playing
if (this._Audio__Theme_Music.isPlaying == false)
{
this._Audio__Theme_Music.Play();
}
}
}
void OnSceneLoaded(UnityEngine.SceneManagement.Scene scene, UnityEngine.SceneManagement.LoadSceneMode load_scene_mode)
{
Debug.Log("MuscPlayer: OnSceneLoaded");
//play theme music if the scene name is "Play"
if (scene.name == "Play")
{
Start_Stop_Music(MusicFiles.ThemeMusic);
}
else
{
Start_Stop_Music(MusicFiles.DrumsOnly);
}
}
}
}