📖

Unityの `Awake()` と `Start()` をどう使い分ける? 迷ったらこう使え初期化の極意

2025/01/26に公開

Unityの Awake()Start() をどう使い分ける?

Unityでは、ゲームオブジェクトやスクリプトの初期化を行う代表的なメソッドとして Awake()Start() があります。一見似たような役割に見えますが、呼ばれるタイミング想定されている用途が少し異なるため、うまく使い分けることで開発効率や可読性を向上できます。

Unityの基本操作からC#スクリプトの基礎まで、やさしく学べる入門チュートリアルはこちら
https://zenn.dev/ryuryu_game/books/fd28de9d8e963a/viewer/0570af

1. Awake()Start() が呼ばれるタイミング

Awake()

  • オブジェクトが生成され(有効化され)たタイミングで最初に呼ばれる
  • シーン読み込み時や、Instantiate() された直後など、「まだ周辺オブジェクトが完全に初期化されていない可能性がある」段階
  • 同じフレーム内でも、Awake()OnEnable()Start() の順に呼ばれる

Start()

  • すべての Awake() が完了し、かつオブジェクトが有効(enabled)である場合に呼ばれる
  • シーン全体がある程度整った後のタイミング
  • 他のオブジェクトの初期化が終わった状態を前提に処理できる

2. それぞれの役割・使い分け

Awake() は「自分自身」に関わる最低限の初期化

  • 同じ GameObject 内のコンポーネントや自スクリプトが使うリソース・変数など「内部的なセットアップ」を行うのに適している
    • 例: GetComponent<T>(), リスト・辞書など自前コレクションの生成など
  • 他のオブジェクトが準備完了している保証はない ため、外部リソースへの依存は最小限に留める
  • 「このスクリプト自身を動かすのに必要な準備」を真っ先に行いたいとき

Start() は「外部との連携」が必要な初期化

  • すべてのオブジェクトの Awake() が完了した後に呼ばれる
  • シーン内の他のオブジェクトへの参照イベントの購読など、外部とのつながりが必要な処理をまとめる
    • 例: GameManager.Instance へのアクセス、他シーン内の Singleton 取得、他コンポーネントの public 変数を読み込む 等
  • オブジェクトが 無効(disabled) だと Start() は呼ばれない点にも注意

3. 具体的な使い分け例

カメラ制御スクリプトの例

public class CameraController : MonoBehaviour
{
    private Camera mainCamera;
    public Transform target;

    void Awake()
    {
        // カメラコンポーネントを取得(同じGameObject内)
        mainCamera = GetComponent<Camera>();
        // カメラが必要とする内部初期化(リストや設定値の読み込み など)
    }

    void Start()
    {
        // 他オブジェクト(例: プレイヤー等)がシーン上に揃った後で実行したい処理
        if (target == null)
        {
            // 場合によってはここで target を探す
            target = GameObject.FindWithTag("Player")?.transform;
        }
    }

    void Update()
    {
        if (target != null)
        {
            mainCamera.transform.position = new Vector3(target.position.x, target.position.y, mainCamera.transform.position.z);
        }
    }
}
  • Awake()
    • 自身のカメラコンポーネントを取得するなど、「このスクリプト単体で動くのに最低限必要なセットアップ」
  • Start()
    • シーン全体が揃った状態を前提に、「外部オブジェクト(Player)の参照が必要」な処理

4. よくある質問・注意点

  1. 「Awake() 内で GetComponent<T>() はしてもいい?」

    • 同一 GameObject 内であれば問題ありません。
    • ただし、別の GameObject の Awake() がまだ終わっていない可能性があるため、完全に依存した形の処理は避けるほうが安全。
  2. 「Awake() と Start() の順序を制御したい」

    • Unityでは 「Awake() は全オブジェクトで実行 → 全Awake終了後に Start()」 という流れなので、基本的には「Start の順番を意図的に前後させる」ことはできません。
    • どうしても必要な場合は「Script Execution Order」の設定を調整する、または「Start() で初期化完了を待ってからイベント発火する」などの設計的工夫が必要です。
  3. 「disabled 状態のゲームオブジェクトはどうなる?」

    • Awake() は呼ばれる(シーンロードや Instantiate 時など)
    • しかし、オブジェクトが有効化されるまで Start() は呼ばれない
    • そのため、再度有効化(SetActive(true))されたタイミングで初めて Start() が呼ばれるケースがあります。

5. まとめ:迷ったらこう使い分けよう

  • Awake():
    • 自分自身のインスタンスに関する初期化
    • 同じ GameObject 内の依存関係設定
    • 「このスクリプトが動くための最低限の準備」
  • Start():
    • シーン全体が揃った後で処理したいこと
    • 外部のオブジェクトやサービスと連携する準備
    • ほかの Awake() がすべて終わってから安全に行いたい処理

自分だけで完結する初期化 → Awake()
外部への依存・連携がある初期化 → Start()

このルールを守っておけば、スクリプト間の依存関係を整理しやすくなり、バグの早期発見にもつながります。ぜひプロジェクトで試してみてください!

この記事を読んでもっと実践したいと感じたあなたへ

Unity開発を効率よく進めるためには、実践的なスキルと仲間との交流が欠かせません。
そんな方におすすめのステップが、下記の3つです。

1. 有料教材「どこでもUnity教室」でゲーム制作を短期マスター

  • 5日でシンプルなFPS完成:初心者向けに要点を押さえたカリキュラム
  • C#や最新のInputSystem、FPS実装まで網羅:つまずきやすいポイントを先回りで解説
  • 購入特典:Discord招待+サンプルプロジェクトDLで、疑問や実装例を即確認

Unity初心者でも最短5日で3D FPSが完成!今すぐ始める入門チュートリアルはこちら

https://zenn.dev/ryuryu_game/books/fd28de9d8e963a/viewer/0570af

2. 無料コミュニティで、疑問をすぐに解消&モチベーションUP

  • 初心者~中級者までOK:学習進度に合わせて質問や情報共有
  • 質問サポートが充実:わからないことを仲間や講師に即相談
  • 学習仲間と切磋琢磨:一緒に学ぶから続けやすい

Discordサーバー参加はこちら

https://discord.gg/5FwuKCacNy

3. 実績豊富な“ゲーム開発所RYURYU”があなたをトータルサポート

  • コナラ総販売200件超:さまざまなUnity開発の依頼を対応
  • VR/AR/AIなど最新技術にも精通:幅広いノウハウを活かして開発支援
  • ゲームクリエイター甲子園や東京ゲームショウなど出展実績多数

ご相談・お問い合わせはこちら

https://coconala.com/users/1772507

Discussion