特定のコンポーネントを優先して実行する方法

フェレットといっしょの多言語化を行っているのですが、その際に勉強になったので書き留めておきます。

Startに書いた初期化が実行されていない・・・

共通で使用するモジュールを初期化時に生成したかったため、モジュール初期化の処理をStartに書いて実行しましたが、なんか動いていない。

あれ、おかしいなと思って調べてみると・・・モジュールアクセス時にNullReferenceExceptionが!!

初期化失敗してんぞコレ。なぜ?

原因はStartの順番でした

呼び出し側オブジェクトのStart処理で共通使用モジュールを呼び出しているところで例外が発生してました。
共通使用側のStartより先に呼び出し側が走っていたので、初期化されていない共通使用モジュールを呼び出してNullReferenceExceptionとなってしまっていたようです。

結論: Startの順番はDefaultExecutionOrderで指定できる

DefaultExecutionOrderというAttributeがあるそうです。
値が低い方が優先され、標準コンポーネントの実行順は0とのこと。

[DefaultExecutionOrder(-1)]
public class commonProcStarter : MonoBehaviour
{
        void Start()
        {
                // 初期化。
        }
}

これで無事ヌルリしなくなりました!

乱用すると怖いことになりそうなので気をつけよう・・・。

参考

テラシュールブログ
【Unity】コンポーネントのイベント実行順についてのTips

お世話になりっぱなしです。

Leave a Reply

Your email address will not be published. Required fields are marked *