はじめに
今回はDefaultExecutionOrderでスクリプトの実行順番をスクリプトから書くことについての記事になります!
例えばStartメソッドが複数あった場合、実はどちらが先に実行させるかは分かりません。
前に私のパソコンではちゃんと動いていたのに、別のパソコンだとエラーがでてきてしまったことがありました。
その原因を調べてみると、Startメソッドの呼び出しの順番が変わっていたからでした。
それを解決する方法の一つとして、クラスにDefaultExecutionOrderという属性を付けることが挙げられます。
これを今回は見ていきましょう。
DefaultExecutionOrderとは
DefaultExecutionOrderはスクリプトの実行する順番を指定でき、[DefaultExecutionOrder(-1)]のように使います。
using UnityEngine; [DefaultExecutionOrder(-1)] public class Hoge : MonoBehaviour { private void Start() { Debug.Log("Hoge"); } }
()の中の数字が小さいほうが先に実行され、0が標準のコンポーネントの実行順です。
実際に実験をしてみましょう。
実験
この2つのスクリプトを用意し、同じゲームオブジェクトにアタッチしました。
Hoge.cs
using UnityEngine; public class Hoge : MonoBehaviour { private void Start() { Debug.Log("Hoge"); } }
Fuga.cs
using UnityEngine; public class Fuga : MonoBehaviour { private void Start() { Debug.Log("Fuga"); } }
DefaultExecutionOrderを付けなかった場合はこのように表示されました。

今度はDefaultExecutionOrderを付けてみます。
Hoge.cs
using UnityEngine; [DefaultExecutionOrder(-1)] public class Hoge : MonoBehaviour { private void Start() { Debug.Log("Hoge"); } }
Fuga.cs
using UnityEngine; [DefaultExecutionOrder(0)] public class Fuga : MonoBehaviour { private void Start() { Debug.Log("Fuga"); } }

さいごに
ただ、DefaultExecutionOrderの乱用は実行順序に依存したコードが増え、むしろ可読性が悪くなるような気もします。
程よくたまに使うぐらいがベストかもしれません!