Singleton Null Static Reference
Hi guys.
So in my game I'm using a number of singleton scripts to manager various aspects of the game. I always include a static reference to the instance of the script for easy referencing. It's working fine in all of my scripts bar my GameManager script. When I try to call it I get a null reference exception and I tried to print the reference to the script and it does indeed return null. I thought this might be because GameManager might be a reserved name or something so I changed it to just Manager but alas. So below is the structure I was using and I was wondering if anyone might be able to point out why I'm having an issue with this script in particular when the logic works fine in other places.
Thanks, Alec.
public class Manager : MonoBehaviour
{
public static Manager Instance;
void Start ()
{
Instance = this;
}
}
Answer by TheNinjassin · Mar 14, 2016 at 12:43 PM
Never mind it's probably an execution order error. :') I don't know why I didn't think. Moving it to Awake fixed the issue.
Yes, that's most likely your problem. And it still can be a problem if another script has its Awake called before the Awake of your singleton is called. That's why it's usually better to use a singleton implementation like this.
When you have the $$anonymous$$onoBehaviourSingleton class somewhere in your project you can simply do this:
public class $$anonymous$$anager : $$anonymous$$onoBehaviourSingleton<$$anonymous$$anager>
{
// your manager stuff
}
And access the singleton like this:
$$anonymous$$anager.Instance
This singleton implementation does this:
If we have already an reference, just return that reference.
If not use FindObjectOfType to find the reference to our instance.
If there is no instance, create an empty gameobject and attach the singleton script
If we have found one / created one, mark the instance with DontDestroyOnLoad to prevent the destruction on scene load.
This ensures we always get an instance back. Note: Of course if there is no instance in the scene (usually user mistake) it will create a new dynamic instance. If the manager is supposed to have asset references setup in the inspector, those would be missing. Another approach is to create a prefab for the manager and have the singleton code instantiate the prefab from the resources folder in cast none was found. As last resort it still can create a new instance.
That is extremely useful to know, thank you so much for your assistance.