LoginSignup
1
0

More than 1 year has passed since last update.

【Unity】同じクラスのコンポーネントの実行順はアタッチした順の逆順になる説

Posted at

色々あってこの仮説に至ったので検証してみました。

以下のコンポーネントをアタッチしてログの出力される順番を見てみます。
要約するとアタッチした順番でコンポーネントに番号が振られて、Awakeでその番号をログに出力する感じです。

using UnityEngine;

public class ComponentOrderTest : MonoBehaviour {

    public static int AllCount;

    public int count;

    void Reset() {
        count = AllCount;
        AllCount++;
    }

    void Awake() {
        print(name+":"+count);
    }

    [ContextMenu("AllCountReset")]
    public void AllCountReset() {
        AllCount = 0;
    }
}

まずは普通に一つのオブジェクトに5つのコンポーネントをアタッチしてみます。
image.png
結果は以下です。アタッチした順の逆順で実行されました。
image.png

次にインスペクター上の順番をD&Dで適当に並び替えて実行してみます。
image.png
アタッチした順の逆順で実行されました。
image.png

次は複数のオブジェクトにまたがってアタッチしてみます。
image.png
image.png
image.png
結果は以下です。オブジェクトをまたいでも、アタッチした順の逆順になりました。
image.png

次はコンポーネントを3つアタッチしたオブジェクトを3つに複製してみます。
image.png
image.png
image.png
こうなりました。複製したオブジェクトは順番が入れ替わっています。
※オブジェクト名が出るようにコードをちょっといじりました。
image.png
考えられる可能性は、オブジェクトが複製されるときにアタッチした逆順でコンポーネントがコピーされて、順番が入れ替わるとかでしょうか。

最後にログの出力タイミングをUpdateにして、実行中にEnable/Disableを切り替えてみます。
7bba6984-ff61-4864-a313-08fb501d042b.gif
最後にEnableにしたコンポーネントが後で実行されるようになっていますね。

検証結果

・基本的にはアタッチした順の逆順に実行される
・オブジェクトごと複製した場合は順番が入れ替わる
・実行中にEnable/Disableを切り替えた場合も順番が入れ替わる

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0