AwakeとStartの違いを理解しよう!UnityTipsシリーズ

なんか雰囲気で使ってても問題ないStartとAwakeの使い分け。Awakeの方が先に処理される!ぐらいしか理解していないのなら、ここで覚えて行きましょう。

目次

AwakeとStartの違いを知る

感覚的に使っていても割となんとかなることが多いですが、できればはっきりと使い方を理解しておきたいところ。正しい処理でライバルと差をつけろ!

一覧表で見比べる

まずは各違いを表としてまとめます。細かな説明は後で行いますが、最終的にはこちらの表を確認することで違いを思い出せるようになるでしょう。

項目
✅ 実行タイミングスクリプトが有効化されたときに一度だけ最初のフレームの前に一度だけ(有効時)
🥇 実行順Startより先に実行されるAwakeのあとに実行される
🔁 複数スクリプト間の順序保証なしなし
無効スクリプトでの実行オブジェクトが有効化されたときに呼ばれる無効オブジェクトでは呼ばれない
🧠 主な用途自身の内部初期化
依存のない設定処理
他オブジェクトとの連携
外部依存の処理
🔐 Singletonパターンに適している✅ 適している❌ 不適切(順序が重要なため)
💥 非アクティブ状態での動作アクティブ化された瞬間に呼ばれるアクティブで初回Update前のフレームに呼ばれる
🧪 例rb = GetComponent();player = GameObject.FindWithTag("Player");

上記表の中で特に覚えておきたい点としては以下

  • 実行順
    • 処理の順番は必須級。間違えていると設計に関わります
    • (ただ、すぐに違和感に気づくのでやらかしてから修正しても大丈夫かも)
  • 無効スクリプトでの実行
    • どういう状態だと呼ばれたり呼ばれなかったりするか
    • 作りによって動かない場合が出たりするのでしっかり把握しておくことで事故や不具合対応が早くなる
  • 主な用途
    • どういう処理を優先的に書くべきか
    • ここを見るとわかってるかどうか判断されるので他の人とコードを共有するときは理解が必要になる

Awakeについて理解を深める

Awakeには次のような特徴があります。

  • 実行タイミングについて
    • スクリプトのオブジェクトが有効化された時に一度だけ動く
    • Startより前に実行される
  • シーン読み込み直後に即実行される。他のスクリプトとの依存関係を作る前の準備に使われる
  • コンポーネントがDisable状態でも、オブジェクトがアクティブな状態になると実行される
スライム

Startメソッドやライフサイクル系には珍しく、コンポーネントがDisableでも動きます。

主な用途としては次のような時

  • 依存関係がない内部変数の初期化
    • 他のゲームオブジェクトにかかわらない部分
    • コンポーネントのコンストラクタとほぼ同等だと思ってOK
  • Singletonパターンの設定など
    • Unityで多く見られるデザインパターンの一つ
    • 使っているところが多いので目にすることも多いハズ

Startについて理解を深める

Startには次のような特徴があります

  • 実行タイミング
    • スクリプトが有効かつ対象のゲームオブジェクトがアクティブな場合
    • 上記条件の初回フレーム直前に呼ばれる
  • ライフサイクル的にAwakeより必ず後に呼ばれる
    • この性質を利用し、他のコンポーネントもAwakeで初期化済み前提でStartメソッド内の実装を行うことが可能
フェアリー

AwakeとStartの違いを理解することで、他のコンポーネントとの連携も取りやすくなりますね

主な用途としては次のようなものが挙げられます

  • 他のオブジェクトやスクリプトとの連携
  • FindObjectOfTypeやGetComponentで別のスクリプトにアクセスするような処理
    • もちろんAwakeとの関連を理解することが必須
    • 少なくとも同じインスペクター内のコンポーネントのAwakeは確実に呼ばれていることが保証されます
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

目次