- Home /
Answer by AlucardJay · Jan 06, 2013 at 06:40 AM
When this question comes up, DontDestroyOnLoad is the answer given, but it is only half the solution. For example, if you load the scene where the music player is created, then a duplicate is made, now you have 2 players following you through all the scenes. It took me a while to find the solution, but the answer is to use a Singleton . Search singletons on this 'site (or in google search "unity singleton") as there would be better explanations than what I could give.
The simple version is : only one instance of a singleton exists at a time, two cannot exist. It can be called by all scripts by using a static variable. So only one, and it has a variable which other scripts can reference.
Here is the script for a working singleton, just attach it to the music player. Note : this is in unity JS, and the script must be called MusicSingleton :
#pragma strict
// change the class name here to the name of your script, e.g.
// public class ThisIsTheScriptNameHere extends MonoBehaviour
public class MusicSingleton extends MonoBehaviour
{
private static var instance : MusicSingleton;
function Awake()
{
if (instance != null && instance != this)
{
Destroy( this.gameObject );
return;
}
else
{
instance = this;
}
DontDestroyOnLoad( this.gameObject );
}
// also change this to your script name
// public static function GetInstance() : ThisIsTheScriptNameHere
public static function GetInstance() : MusicSingleton
{
return instance;
}
function Update()
{
//
}
}
from my answer here : http://answers.unity3d.com/questions/334376/how-i-can-prevent-music-from-stopping-after-changi.html
This is the question I originally asked when I started : http://answers.unity3d.com/questions/235417/how-do-i-create-a-static-instance-in-javascript.html
Just FTR @Alu
"For example, if you load the scene where the music player is created, then a duplicate is made, now you have 2 players following you through all the scenes"
singletons are critical indeed and one must know everything about them.
(they are used everywhere in iOS for example, if you're an xcode user. Singletons are central to everything Apple has done with Cocoa, XCode, iOS...pretty much everything important is a singleton in iOS! -- the app delegate, every service like the accelerometer etc etc.)
anyway I was just going to say, in this particular example, background music. I probably wouldn't use a singleton.
in every game (other than a trivial test project), you have a "special setup scene" that loads first because you inevitably have heaps of things (including singletons!) maybe databases, tracking, whatever, that you inevitably need to start up before you launch the first "consumer scene".
(what i mean is, the special "start up scene" very likely wouldn't even have any visuals at all, perhaps just carry through the "loading screen" if anything)
(in partcular you inevitably want to launch "something, anything" that happens while you then load the enormous first scene)
in that "startup scene" you'd just have your background music, I'd say, and of course mark it to last forever.
(this is so ubiquitous it's surprising that unity don't just build in the concept.)
i find also inevitably, with the BG music, you'll have some sort of thing that has all the sound effects for the game (perhaps the UI sfx, or the game sfx, or both) Similarly that thing sticks around the whole game.
again just a thought .... in the case of BG music specifically, it is perfectly suited to loading at the beginning and just marking it to remain in place (perhaps load it with your "special non-civillian startup scene" which is inevitable in any game)
As always, some excellent insight, plenty of information for me to absorb and learn from. I am very grateful for you advice, many thanks.
(all your answers seem accepted these days, so all I can do is vote your informative answers. We are lucky to have you active here on UA!)
Your answer
Follow this Question
Related Questions
Stop continuing music (Please Help) 1 Answer
Unmuted sounds playing off-beat 0 Answers
Loading A Level After 40 Seconds 2 Answers
Audio loop 3 Answers
time between scenes (loading time) 0 Answers