Awake()、Start()、OnEnable()の順番

最初に呼び出されるイベント関数としてAwake()、Start()、OnEnable()がありますが、これらの順番はどうなっているのか。

実際Awake()とStart()の順番は知っていたのですが、OnEnable()のタイミングを勘違いしていて不具合が生じてしまったので、覚えておくためにも記事にすることにしました。

Awake()とStart()の関係は?

これはほとんどの方が知っているかもしれません。

Awake()が呼び出された後に、Start()が呼び出されます。

ですので、GetComponent系や自身のクラス内での初期化をAwake()でしておいて、他のクラスを呼び出す処理などはStart()に記述すれば、呼び出し先のクラスでまだ初期化できてない!みたいなことがなくなると思います。

どのクラスのAwake()が呼び出されるかという順番は一定ではないので、Awake()内に他のクラスを利用する処理を書いてしまうとうまくいかないことが多々あるので注意。

OnEnable()のタイミングは?

問題のOnEnable()が呼び出されるタイミングですが、Unityの公式マニュアルによると「Awake()と同じタイミング」だそうです。

Unity - マニュアル: イベント関数の実行順
Unityのマニュアルは、Unityの使い方を学ぶ手助けとなります。Unityを使って2Dや3Dゲームを作成したり、ゲーム以外のアプリを作成したりして多くの経験を積みましょう。

なのでAwake()と同様、OnEnable()で他のクラスを利用する処理を書いてしまうと、実行される順番によってはうまくいかないことがあるので注意が必要です。

やりたいことの種類にもよりますが、僕は

Start()とOnEnable()の両方に処理を書き、OnEnable()の段階で準備ができていたら(nullじゃなかったら)実行してStart()では実行しない、準備ができていなければStart()で実行する

みたいな感じでスクリプトを書きました。

シーンの最初に実行するだけならAwake()とStart()だけで十分なのですが、アクティブ化した時に実行したい処理がある場合はOnEnable()を使う必要があるので注意が必要ですね。

ちなみに、Update()の最初の処理は必ずStart()よりも後に呼び出されるようになっています。

イベント関数の順番は「場合によっては成功する」みたいなこともあるのでしっかりと順番を意識して処理を書きたいですね。

コメント