[Unity] Awake と Start の違い

Unity

Awake と Start

Unity の オブジェクトに用意されているイベントの内、Awake と Start という似たような物があります。Unityのエディタ上から生成したスクリプトは予めStartメソッドが用意されているためそれを利用していたのですが、いろいろなサンプルコードを見ていると、Awakeを使って実装している例も多くあります。

どちらも初期化に関するイベントなのはなんとなくわかるのですが、違いを知らなかったので調べてみました。

イベント関数の実行順序

Awake、Start共に初期化に関するイベントですが、その実行順序としては Awake -> Start の順になります。スクリプトのライフサイクルによってこのように決められているようです。具体的には以下の図を参照してください。

公式マニュアルからの引用です。

Awake

公式マニュアルによると、Awakeイベントは以下のタイミングで実行されます。

シーンが始まると(シーン内の各オブジェクトに対して一度だけ)呼び出されます。

  • Awake: この関数は常に Start 関数の前およびプレハブのインスタンス化直後に呼び出されます。(もしゲームオブジェクトがスタートアップ時に無効である場合、有効化にされるまで Awake は呼び出されません。)

インスタンス化直後、Startの前に呼ばれます。

Start

同じく公式マニュアルによると、Startイベントは以下のタイミングで実行されます。

最初のフレームのアップデート前

  • Start: スクリプトのインスタンスが有効になると、最初のフレームのアップデート前に Start が呼び出されます。

Awakeの後、最初のUpdateの直前に呼ばれるようです。

Awake と Start の使い分け

両者の違いがひとまずは把握できたところで、使い分けはどのようにすればよいでしょうか。

Awake

調べてみると Awake では自身に関する初期化処理(パラメータなど)を行うのが良いようです。オブジェクトの生成後呼ばれるのでこのタイミングで初期化するということです。

注意点として、他のオブジェクトを参照するのはNGです。なぜなら Awake 自体の呼ばれる順番は不定なようで、参照するオブジェクトが初期化されておらず、Null参照になってしまうおそれがあるからです。

Start

他のオブジェクトの情報等を取得したい場合は Start に書くのが良いようです。

まとめ

上で記した違い以外にも色々とあるようですが、ひとまずは上のような違いを意識して開発すると予期せぬエラーが防げるかもしれません。

参考URL

コメント