- Home /
Method execution order after LoadLevel()?
I'm a little confused about the order of execution when using "LoadLevel()" with an class using "DontDestroyOnLoad()".
I know that Awake() is always before OnEnable() or Start(), but it seems that I have to use "OnEnable()" after a level load to access objects in the scene because it won't find them in Awake().
Again, I only have this problem when using DontDestroyOnLoad().
Any help will be greatly appreciated! Stephane
Answer by Ariel J · Apr 11, 2011 at 06:42 AM
You probably want to try using start, as OnEnable is called when the object becomes active.
Here is the order:
Awake is called - this is called as soon as the object is in the scene Start is called - this is called when the object becomes active Update and FixedUpdate are called from then on
hope this helps!
-Aj
Thanks for your help SuperCheese. So if I understand correctly, Awake() is the first function called after using LoadLevel()? Or is Awake() called before LoadLevel()? If Awake() is called before the level loads, then it makes sense that I can't find my objects when looking them up in Awake(), as they don't exist yet.
I'm pretty sure that awake will have been only called in the first scene the object was in. So yes, in this case I reckon that awake would have been called before the LoadLevel(). Here is a couple of examples:
You have an object already placed in the scene. When you hit play, awake is called first. Awake is called when the object/script is being loaded. When you load a new scene, it simply doesn't destroy the object.
You instantiate an object at runtime. Awake is called when it loads. This is the same as before, but it is completed during the game.
After some research, I've found what you may want to use.
Here is a script I made:
var found : GameObject;
function Start () { //Find the initial object(s) and make sure it doesn't get destroyed found = GameObject.FindWithTag ("GameController"); DontDestroyOnLoad (transform.gameObject); }
function OnLevelWasLoaded () { //If a level was loaded, we look for them again! found = GameObject.FindWithTag ("GameController"); }
So sorry for the confusion! The above example should fix your problems!
-AJ
SuperCheese thanks a lot for your help! You are right about Awake() and Start() not being called again in a class using DontDestroyOnLoad(). Since I was doing all my caching either in Awake() or Start(), it never got ran again after a level load. By adding the same code to OnLevelWasLoaded(), it works like intended.
Thanks again!
Your answer
Follow this Question
Related Questions
The name 'Joystick' does not denote a valid type ('not found') 2 Answers
DontDestroyOnLoad does not work after reload the scene? 1 Answer
Scene changing 1 Answer
combine words of different scenes in a list or array; have each word link to a page 3 Answers
Nav Mesh SetDestination can't be called 3 Answers