こんにちは、Unityエンジニアのオオバです。

お悩みさん
お悩みさん
  • UnityのAwakeってなに?
  • Awakeがいつ呼ばれるのかわからない
  • Awake実行の条件って何?
  • オオバ
    オオバ
    本記事ではこれらの悩みを解決します。

    Unityでプログラミングを始めると必ず登場する Awakeメソッド
    イベント関数 とも呼ばれます。

    イベント関数とはMonoBehaviourを継承した自作コンポーネント内で実行される特別な関数です。
    Unity開発では欠かせない機能の1つです。

    そんな重要なイベント関数の1つであるAwake。

    Awakeはいつ使うのべきか?

    オオバも初心者の頃Awakeの使い方がわかりませんでした。

    Unityを始めて8年。今ならわかりますが 「Awake」はUnityプログラミングで超重要 です。
    必ず理解しておく必要があります。

    そこで、本記事ではUnityプログラミング初心者に向けたAwakeを解説します。
    Awakeの理解なしにゲーム開発は不可能 です。

    本記事を通してAwakeを理解してしまいましょう。

    UnityのAwakは初期化に使う

    結論を簡単にまとめます。

    Awakeのまとめ

    ①Awakeは1度しか呼ばれないので初期化に使う

    ②Awakeはシーン開始時に呼ばれる

    ③Awakeはインスタンス生成時にも呼ばれる

    ④複数のAwakeの順番は制御できない

    ⑤GameObjectがON(アクティブ)のときに呼ばれる

    Awakeは初回1度しか呼ばれない特徴を生かして 初期化 に使います。
    ただし、 Awake同士の順番は保証されない ことに注意が必要。
    このあたり知ってるかどうかで、プログラミングの安定性はかなり変わってきます。

    このように Awakeの理解はUnityプログラミングにとってかなり重要 です。
    Awakeの正しい知識を身につけて正確なプログラミングを目指しましょう。

    では詳しい解説に入ります。

    →11万文字で徹底解説した「DOTweenの教科書」Unityアニメーションの超効率化ツールはこちら

    UnityのAwakeとは?

    改めてAwakeとは何かを解説します。
    Awakeとは 「Unityが定義した特殊なメソッド」 です。
    このメソッドは MonoBehaviourクラスを継承したコンポーネントの中に定義することとで自動的に呼ばれます。

    👉 【保存版】Unityのコンポーネント徹底解説【Unity基礎】

    Awakeはイベント関数の1つ。
    その他にStart、OnEnable、Update、OnDestroyなど多くのイベント関数が用意されています。

    👇下のようにMonoBehaviourクラスを継承した AwakeTest クラスを作って動作確認してみます。

    💻ソースコード : AwakeTest.cs
    using UnityEngine;  
    // MonoBehaviourを継承することでAwakeが実行される  
    public class AwakeTest : MonoBehaviour  
    {
        // AwakeメソッドがUnityから自動的に呼ばれます  
        void Awake()  
        {
        }
    }
    

    ただAwakeTestクラス(コンポーネント)を作っただけではUnityからは呼ばれません。

    【Unity基礎】イベント関数Awakeの使い方と特徴まとめ_0

    ①ヒエラルキーに配置した②GameObjectを選択

    👉 今さら聞けないUnityのヒエラルキー(Hierarchy)とは?

    【Unity基礎】イベント関数Awakeの使い方と特徴まとめ_1

    👆上のようにGameObjectにセットすることでAwakeは呼ばれるようになります。
    これがUnityプログラミングの基本です。

    Awakeを含むイベント関数はMonoBehaviourをを継承することで動作 します。
    つまり MonoBehaviourはUnityプログラミングにとって重要 なのです。
    そんなMonoBehaviourの徹底解説記事を執筆しました。
    MonoBehaviourに不安な方はぜひ読んでみてください。


    ちなみにGameObjectとコンポーネントの違いについて不安のある方ははこちらの記事がオススメです。

    Awakeの特徴4選

    この章ではAwakeの特徴を4つ紹介します。

    Awakeの特徴4選

    ①一度しか呼ばれない

    ②シーン遷移時または生成時に呼ばれる

    ③【注意】複数のAwakeの順番は制御できない

    ④コンポーネントが非アクティブでもGameObjectがアクティブならAwakeは呼ばれる

    Awakeの特徴①一度しか呼ばれない

    Awakeの特徴は1度しか呼ばれないこと です。
    一度でもAwakeが呼ばれてしまうと、
    そのコンポーネントが生きている限りは呼ばれません。

    Awakeが呼ばれる条件はGameObjectがアクティブのとき。

    つまり以下のInspectorウィンドウのチェックが入っている状態です。

    【Unity基礎】イベント関数Awakeの使い方と特徴まとめ_2

    特徴を利用して、 1度しか実行を許さない初期化処理 を書くことが多いです。

    などなど。
    Awakeの特徴を生かしたプログラミングはよく見かけます。

    Awakeの特徴②シーン遷移時または生成時に呼ばれる

    Awakeが呼ばれる2つのパターンを紹介します。

    Awakeの実行パータンA「シーン遷移時」

    【Unity基礎】イベント関数Awakeの使い方と特徴まとめ_3

    「①ヒエラルキー」に配置された「②GameObject」にセットされた「③コンポーネント」のAwakeは、 シーン遷移時 に呼ばれます。

    Awakeの実行パータンB「コンポーネント生成時」

    動的にGameObjectが生成されたとき セットされたコンポーネントのAwakeは呼ばれます。

    // この時点でAwakeは呼ばれる  
    var obj = Instantiate(prefab) as GameObject;  
    

    👆上のようにオブジェクトをプログラミングから新規で生成する場合です。
    Instantiateメソッド が呼ばれた時点でAwakeは呼ばれるのです。
    生成された瞬間に呼ばれていることに注意。

    Awakeの特徴③【注意】複数のAwakeの順番は制御できない

    1点Awakeには注意点があります。
    複数のGameObjectのそれぞれのAwakeの順番は制御できません。

    【Unity基礎】イベント関数Awakeの使い方と特徴まとめ_4

    シーン遷移した時、「①ヒエラルキー」に配置された
    「②GameObject」の全コンポーネントのAwakeが同時に呼ばれます。

    「すべてのAwakeってどういう順番で呼ばれるんだろう?」

    って思いますよね。
    実はAwakeの呼ばれる順番は デフォルトランダム です。

    つまり本当は「A」のAwakeを実行したあとに、BのAwakeを実行したくても毎度結果が変わるため、その 設計は破綻 しているということです。

    もし👆上のように処理の順番を制御したいのであれば、次のようなやり方があります。

    💻ソースコード : Bの抜粋
    public void Initialize()  
    {
        // Awakeに代わる処理  
    }
    
    💻ソースコード : Aの抜粋
    // AにBをあらかじめ参照をセットしておく  
    [SerializeField] private B _b;  
    
    void Awake()  
    {
        // AwakeタイミングでBのInitializeを呼ぶ  
        _b.Initialize();  
    }
    

    Awakeを使うコツは、 呼ばれる順番に依存しない処理を書く ようにすることが大事です。

    Awakeの特徴④コンポーネントが非アクティブでもGameObjectがアクティブならAwakeは呼ばれる

    Awakeの落とし穴の紹介です。
    Awakeはコンポーネントが非アクティブでもGameObjectがアクティブなら呼ばれます。

    つまり以下のInspectorウィンドウの状態でもAwakeは実行してしまうのです。

    【Unity基礎】イベント関数Awakeの使い方と特徴まとめ_5

    ちなみに実行されるのはAwakeのみで、OnEnable、Start、Updateなどは呼ばれません。
    ハマりやすいポイントなので注意です。

    GameObjectのアクティブに依存するのはAwakeだけではありません。
    コルーチンも同様です。 コルーチンとは中断(待機)と再開を可能にする関数 です。
    ゲーム開発では処理の待機は必須のテクニック
    まだコルーチンを理解できていないという方はこちらの記事をどうぞ。

    UnityのAwakeまとめ

    Awakeの使い方と呼ばれる順番について解説してきました。
    簡単にまとめてみます。

    Awakeの使い方と呼ばれる順番のまとめ

    ①Awakeは一度しか呼ばれないので初期化処理を書く

    ②Awakeはシーン遷移時または生成時に呼ばれる

    ③Awake同士の実行順はランダム

    ④コンポーネントが非アクティブでもGameObjectがアクティブならAwakeは実行

    Awake同士の実行順はランダム なのがポイントですね。
    ここを勘違いしていると思わぬ不具合に見舞われます。

    だからこそ、 Awakeは 呼ばれる順番に依存しない処理を書く ことが大事。
    また、一度しか呼ばれない特徴を生かして初期化処理を書くのが良いですね。

    ぜひともAwakeを使いこなして、ゲーム開発に役立ててみてください。


    Awakeは重要なイベント関数の1つです。
    違いが分かりづらいUpdate、LateUpdateという2つのイベント関数。
    この違いを詳しく次の記事で解説しています。イベント関数はUnity開発では必須知識。ぜひ読んでみてください。

    「Unity初心者大学」というUnity初心者向けのYouTube始めました!!
    ぜひチャンネル登録をお願いします!

    最後まで読んでいただきありがとうございました!
    すばらしいUnityライフをお過ごしください。

    オススメ記事
    検証環境