はじめに
今回は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
の乱用は実行順序に依存したコードが増え、むしろ可読性が悪くなるような気もします。
程よくたまに使うぐらいがベストかもしれません!