色々あってこの仮説に至ったので検証してみました。
以下のコンポーネントをアタッチしてログの出力される順番を見てみます。
要約するとアタッチした順番でコンポーネントに番号が振られて、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つのコンポーネントをアタッチしてみます。
結果は以下です。アタッチした順の逆順で実行されました。
次にインスペクター上の順番をD&Dで適当に並び替えて実行してみます。
アタッチした順の逆順で実行されました。
次は複数のオブジェクトにまたがってアタッチしてみます。
結果は以下です。オブジェクトをまたいでも、アタッチした順の逆順になりました。
次はコンポーネントを3つアタッチしたオブジェクトを3つに複製してみます。
こうなりました。複製したオブジェクトは順番が入れ替わっています。
※オブジェクト名が出るようにコードをちょっといじりました。
考えられる可能性は、オブジェクトが複製されるときにアタッチした逆順でコンポーネントがコピーされて、順番が入れ替わるとかでしょうか。
最後にログの出力タイミングをUpdateにして、実行中にEnable/Disableを切り替えてみます。
最後にEnableにしたコンポーネントが後で実行されるようになっていますね。
検証結果
・基本的にはアタッチした順の逆順に実行される
・オブジェクトごと複製した場合は順番が入れ替わる
・実行中にEnable/Disableを切り替えた場合も順番が入れ替わる