x


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

more ▼

asked Apr 11 '11 at 06:28 AM

ronronmx gravatar image

ronronmx
804 83 99 121

(comments are locked)
10|3000 characters needed characters left

1 answer: sort voted first

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

more ▼

answered Apr 11 '11 at 06:42 AM

Ariel J gravatar image

Ariel J
64 6 6 9

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.

Apr 11 '11 at 06:56 PM ronronmx

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.

Apr 12 '11 at 12:20 AM Ariel J

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

Apr 12 '11 at 12:41 AM Ariel J

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!

Apr 13 '11 at 05:33 AM ronronmx

No probs :D Good luck in Unity!

Apr 13 '11 at 09:23 AM Ariel J
(comments are locked)
10|3000 characters needed characters left
Your answer
toggle preview:

Up to 2 attachments (including images) can be used with a maximum of 524.3 kB each and 1.0 MB total.

Follow this question

By Email:

Once you sign in you will be able to subscribe for any updates here

By RSS:

Answers

Answers and Comments

Topics:

x5059
x263
x82

asked: Apr 11 '11 at 06:28 AM

Seen: 1836 times

Last Updated: Apr 11 '11 at 06:28 AM