広告
広告

実行時の Awake の実行順の問題

カテゴリ:unity

最初からアクティブなオブジェクトは以下の順で初期化メソッドが実行される. これは子オブジェクトがあっても同じで,すべてのオブジェクトの Awake が実行されてから OnEnable が実行される.

  1. Awake
  2. OnEnable
  3. Start

しかし非アクティブ状態でスタートした親オブジェクトを実行時にアクティブにすると問題が起こる.

実行時に親をアクティブにした場合,親と子の Awake と OnEanble の実行順は環境依存になる. 親の Awake と OnEnable が実行されてから,子の Awake が呼ばれることもあるし,その逆もある.

バグレポートを報告したが,これは仕様だという回答だった.

回避策

Edit > Project Settings > Script Execution Order でスクリプトの実行順を指定する.

もしくは Start 後に OnEnable が呼ばれるようにする.

bool isStarted = false;
void Start(){
    isStarted = true;
    OnEnable();
}

void OnEnable(){
    if(!isStarted){
        return;
    }
}

広告
広告