Wednesday, July 17, 2013

Unity3D: Change a script's execution order dynamically (from script)

So the other day I wanted to make sure one of my scripts always ran first, to check in it's init if certain conditions have been met, and if not, do some actions.

I didn't want to rely on manually setting each scene's execution order, and if it's the first level, OnLevelWasLoaded won't get called (no idea why).

So my solution - Create an editor class that made sure that my script's execution order is always before everything else:

using UnityEditor;

[InitializeOnLoad]
public class ExecutionOrderManager : Editor
{
    static ExecutionOrderManager()
    {
        // Get the name of the script we want to change it's execution order
        string scriptName = typeof(MyMonoBehaviourClass).Name;

        // Iterate through all scripts (Might be a better way to do this?)
        foreach (MonoScript monoScript in MonoImporter.GetAllRuntimeMonoScripts())
        {
            // If found our script
            if (monoScript.name == scriptName)
            {
                // And it's not at the execution time we want already
                // (Without this we will get stuck in an infinite loop)
                if (MonoImporter.GetExecutionOrder(monoScript) != -100)
                {
                    MonoImporter.SetExecutionOrder(monoScript, -100);
                }
                break;
            }
        }
    }
}

Note: In order for this script to work it must reside in the Editor folder.

6 comments:

  1. A Unity 3Dstory based diversion may need to offer new character alterations or time scales. Amusements should dependably be replay capable. Hold them returning! Verify your game is tried by outsiders. Take a shot at the diversion application until it is regarded "loveable".

    ReplyDelete
  2. brilliant, exactly what i needed. thanks!

    ReplyDelete
  3. That's really a marvelous post. This post contains useful information which helps us a lot. I have never seen such a great post.
    Unity3d game development

    ReplyDelete
  4. Thank you very much! I needed this very badly! Kudos!!

    ReplyDelete
  5. I wanted to set the Execution order from the script itself.
    (also it became already possible using the custom attributes and reflection.)
    This information very helpful. Thank you!

    ReplyDelete