アヒルのある日

株式会社AHIRUの社員ブログです。毎週更新!社員が自由に思いついたことを書きます。

【Unity】スクリプトの呼び出し順を制御する方法

こんにちは!いかついプログラマです。

Unityでゲームを作成していると、Monobehaviourクラスのイベント関数(Start、Updateなど)の呼び出し順序を変更したい場面が間々あるかと思います。
通常、Unityではこれらイベント関数の呼び出し順序は不定となっており、どのクラスから順に実行されるかはわかりません。
今回は、そんな関数の呼び出し順序を変更する方法を紹介したいと思います。

実験

まずは、特になにもせずにMoneobehaviourクラスの実行順序を見ていきます。
以下のようなStart関数とUpdate関数のみを実装したクラス、MessageA、B、Cを作成し、シーンに貼り付けます。
それぞれコンソールにログを出力するだけのクラスで、MessageA、B、Cでは出力するログの内容のみ変更します。

public class MessageA : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        Debug.Log("Message A Start");
    }

    // Update is called once per frame
    void Update()
    {
        Debug.Log("Message A Update");
    }
}

この状態でシーンを再生した場合、MessageC、B、Aの順にイベント関数が実行されました。


Script Execution Orderを設定する

Script Execution Orderを設定することで、関数の実行順序を制御することが可能です。
[Edit] -> [ProjectSettings] -> [ScriptExecutionOrder]と選択することで、以下のようなウィンドウを開くことができます。

ウィンドウ右下にある「+」ボタンを押すと、クラスの一覧が表示されます。
ここでドラッグや数字を変更することで、実行順序を制御することが可能です。
また、"DefaultTime"では、ScriptExecutionOrderで指定のなかったクラスが順不同で呼び出しされます。
今回は、先ほど実験で使用したスクリプトが、MessageA、B、Cの順で呼び出されるように設定してみます。
MessageAをDefaultTimeよりも前に、MessageCをDefautTimeよりも後に呼び出されるように設定することで、A、B、Cの順で呼び出されるはずです。

実行すると…

しっかりA、B、Cの順に呼び出されていますね!

それではまた次回!

参考:
Script Execution Order - Unity マニュアル