はなちるのマイノート

Unityをメインとした技術ブログ。自分らしくまったりやっていきたいと思いますー!

【Unity】DefaultExecutionOrderでスクリプトの実行順番をスクリプトから書く

はじめに

今回は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を付けなかった場合はこのように表示されました。

f:id:hanaaaaaachiru:20190430212607p:plain


今度は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");
    }
}

f:id:hanaaaaaachiru:20190430212831p:plain

さいごに

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