スクリプトの実行順序をスクリプトから指定する

Unity で Awake や Update の実行順序をプログラム(スクリプト)から指定する方法の紹介です。

確認環境

この記事は以下環境で確認しています。

  • Unity 2021.2.5f1
  • Editor 上で確認

実行順序の設定

通常 Unity の コンポーネントのメソッドの実行順は不定です。Hierarchy 上に配置したコンポーネントの Awake, Start, Update etc.. などの全ての実行順序はいざ実行するまでわかりません(毎回違う事もあります

実行順序は以下設定から指定できます。

Edit > Project Settings > Script Execution Order

このメニュー画面コンポーネント一つ一つに対して優先度を指定することが可能です。未指定の場合「Default Time (=0)」というセクションで順不同に処理されまが、数値がマイナス側ならそれらより前、プラスならそれらより後となります。数字が大きいほどより前(もしくは後ろ)で実行されるようになります。

スクリプトから順序を設定する

設定画面を使わずにコンポーネントに直接実行順序を指定することもできます。

Unity の標準機能で「DefaultExecutionOrder」という属性をコンポーネントに設定すると実行順を指定できます。

[DefaultExecutionOrder(-1)] // 設定画面でSampleComponentに-1を設定したのと同じ
public class SampleComponent : MonoBehaviour { }

但しクラスの継承は認識してくれないので基底クラスで DefaultExecutionOrder を指定していても派生クラス側に設定が引き継がれないので注意してください。

[DefaultExecutionOrder(-1)] // ★基底クラスで優先度を指定していても...
public abstract class Base : MonoBehaviour { }

public class Sample : Base { } // ★派生クラス側には効果が無い

// ↓↓↓↓↓

[DefaultExecutionOrder(-1)] // ★優先度は派生クラスでも個々に指定する
public class Sample : Base { }

やりすぎると優先順位度スパゲティになるのでご注意ください。あと、設定画面と属性に設定がバラけているとかなり分かりにくくなるので何らかのルールを決めたほうがいいと思います。

あと「Simple Ordering」というアセットは使用しないでください。このアセットを使用せずととも標準機能で実現できます(たぶんこの属性が無い古い環境が対象です)