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

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

    AwakeメソッドStartメソッド はUnityでプログラミングを始めると必ず登場します。これらは イベント関数 です。

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

    AwakeやStartはいつ使うのべきか?

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

    Unityを始めて12年経ち、さまざまなゲーム開発の経験をしたことでAwakeやStartの使い所がわかりました。
    結論から言うと 「Awake」と「Start」は使い方を誤るとヤバい です。

    両者は似た特徴を持っているため、 Unity初心者は特にハマりやすい です。Unityでゲーム開発する上では必ず理解しておく必要があると言えます。

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

    本記事を通してAwakeとStartをマスターしてしまいましょう。

    UnityのAwakとStartは初期化関数

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

    UnityのAwakとStartは初期化関数

    ①AwakeもStartも1度しか呼ばれない関数

    ②Awakeはシーン開始時に実行

    ③StartはAwake後1フレーム後に実行

    ④Awake、Startはインスタンス生成時に実行

    ⑤複数のAwake、Startの順番は制御できない

    ⑥AwakeのみGameObjectがON(アクティブ)のときにも実行

    Awakeは初回1度しか呼ばれない特徴を生かして 初期化 に使います。StartはAwake後1フレーム経過して実行される特徴があります。注意点として Awake同士、またはStart同士の順番は保証されない ということです。

    この辺りを知ってるかどうかで、プログラミングの安定性は大きく変わってきます。

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

    ※本記事は広告を含みます

    👉DOTweenの教科書を読んでUnityアニメーションをプログラミングしてみよう!

    Unityの「Awake」「Start」とは?

    改めて「Awake」「Start」とは何かを解説します。

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

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

    AwakeとStartはイベント関数の1つです。その他にもイベント関数はいくつも存在します。

    など多くのイベント関数が用意されています。

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

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

    ちなみにC#スクリプト「AwakeTest.cs」を作っただけではUnityからは呼ばれません。GameObjectにセットすることで初めて動作します。

    【Unity基礎】AwakeやStartって何?使い方や特徴を徹底解説_0
    ①ヒエラルキーに配置した②GameObjectを選択

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

    【Unity基礎】AwakeやStartって何?使い方や特徴を徹底解説_1
    👆上のようにGameObjectにセット(AddComponent)することでAwakeとStartは呼ばれるようになります。これがUnityプログラミングの基本です。

    AwakeやStartを含むイベント関数はMonoBehaviourを継承することで 初めて動作 します。

    つまり MonoBehaviourはUnityプログラミングにとって重要 だということです。Unity開発で超重要なMonoBehaviourの徹底解説記事を執筆しました。MonoBehaviourの理解に不安な方は↓↓こちらからぜひ読んでみてください。

    またMonoBehaviourとGameObjectは密接な関係です。MonoBehaviourをより深く知るためにはGameObjectの知識も必要になります。↓↓GameObjectを基礎から学べる記事はこちらです。ぜひ参考にしてみてください。

    AwakeとStartの違いについて

    AwakeとStartは双方同じような機能を持っています。Unity初心者にとって AwakeとStartは混乱の元 となるでしょう。

    オオバも初心者の頃はどっちを使ったら良いのか分かりませんでした。使いわけを理解する上で、双方の特徴を理解していきましょう。

    Awakeの特徴4選

    まずはAwakeの特徴を4つ紹介します。

    Awakeの特徴4選

    ①Awakeは一度だけ実行される

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

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

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

    Awakeの特徴①Awakeは一度だけ実行される

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

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

    つまり以下のInspectorウィンドウのチェックが入っている状態です。
    【Unity基礎】AwakeやStartって何?使い方や特徴を徹底解説_2

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

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

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

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

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

    【Unity基礎】AwakeやStartって何?使い方や特徴を徹底解説_3

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

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

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

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

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

    生成された瞬間に呼ばれていることに注意。

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

    Awakeには注意点があります。それは 複数のAwakeの実行順は制御できない ことです。

    【Unity基礎】AwakeやStartって何?使い方や特徴を徹底解説_4

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

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

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

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

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

    つまり Awakeの使用箇所を1つに絞ります。 その後は関数を実行していく方式です。サンプルコードを見ていきましょう。

    💻ソースコード : 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やStartって何?使い方や特徴を徹底解説_5

    ちなみに上記の仕様はAwakeのみで「OnEnable」「Start」「Update」などのAwake以外のイベント関数では起きません。

    Awakeならではのハマりポイントなので要注意です。

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

    Startの特徴4選

    Awakeの特徴を学んだので、次はStartの特徴を紹介します。

    Startの特徴4選

    ①Startは一度だけ実行される

    ②Awakeが呼ばれて1フレーム後にStartは実行される

    ③複数のStart同士の順番は制御できない

    ④StartはTaskやコルーチンが使用可能

    Startの特徴①Startは一度だけ実行される

    StartはAwakeと同様コンポーネントのライフサイクル内で1度のみ実行されます。この点はAwakeと同じ仕様と考えてもらって大丈夫です。

    一度しか実行されない特徴を生かしてプログラムの初期化処理をさせることもあります。

    Startの特徴②Awakeが呼ばれて1フレーム後にStartは実行される

    Startの最も大きな特徴は 呼び出しタイミング です。Awake実行後 1フレーム遅れて実行 します。

    Awakeの後にStartが呼ばれる順番に変更はありません。逆に言えば、AwakeもStartも定義しているのに、Startから実行されることはないということです。

    Startの特徴③複数のStart同士の順番は制御できない

    StartもAwake同様にStart同士の順番は保証されていません。複数コンポーネントでそれぞれStartが定義されていた場合、Start同士の順番は毎度同じにはならないということです。

    お悩みさん
    お悩みさん
    Unityエディタ上では毎回同じ順番なんだけど?

    Unityエディタで動かす分には同じ順番になることもあります。注意すべきはビルド後のStart順です。

    過去の経験上、実機に書き出すとStartの順は変わることが多いです。

    Startを複数定義する場合は、実機ビルドを含めてテストすることをオススメします。

    Startの特徴④StartはTaskやコルーチンが使用可能

    StartはTaskやコルーチンを使用できます。わかりやすく解説するためにソースコードで紹介します。

    💻ソースコード : コルーチン化したStart
    IEnumerator Start()  
    {
        yield return null;  
    }
    
    💻ソースコード : Task化したStart
    async void Start()  
    {
        await Task.Delay(3000);  
    }
    

    このようにStart関数の戻り型を IEnumerator にするとコルーチンへ。async を付与すればTask化することが可能です。

    この特徴はAwakeにはないStartのみの特徴です。サンプルコードを書く際に便利なのでぜひ覚えておきましょう。

    async void Start()  
    {
        await UniTask.Delay(TimeSpan.FromSeconds(3f));  
    }
    

    もちろんTaskだけではなく上記のように UniTask も使用可能です。

    AwakeとStartの違いのまとめ

    AwakeとStartは似ているようで、細かな点で仕様が違います。表にまとめるとこんな感じです。

    AwakeStart
    実行回数1回1回
    実行タイミング生成時Awake後1フレームあと
    Task・コルーチン化不可
    呼び出し順保証されない保証されない
    GameObjectのアクティブ時実行未実行

    細かいですが知らないと不具合につながる特徴もありますので、ぜひこの表を参考にしてみてください。

    極論Startは使わなくてもOK

    AwakeとStartについて解説してきて根本から覆すようなことをこれからお伝えします。

    極論Startは不要 です。Startに書きたいものはAwakeに記述することで事足りてしまうからです。

    オオバは12年間Unityを使ってきて、最終的にStartは使わなくなりました。なぜなら、AwakeとStartの使い分けに混乱するためです。

    つまり12年間どうしてもStartが必要な場面が登場しなかったとも言えます。

    もちろんゲームの内容によってはStartが必要な場面が出てくるかもしれません。Start不要論は あくまで1つの参考例 として、あなたの引き出しに入れておいて頂ければと思います。

    UnityのAwakeとStartのまとめ

    AwakeとStartの使い方や特徴、両者の違いについて解説してきました。

    簡単にまとめてみます。

    UnityのAwakeとStartのまとめ

    ①Awake・Start共に一度しか呼ばれないので初期化処理に利用

    ②Awake・Start共にシーン遷移時または生成時に実行

    ③StartはAwakeの1フレーム後に実行

    ④Awake・Start同士の実行順は保証されない

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

    ⑥StartはTask・コルーチン化可能

    ⑦極論Startは不要

    AwakeとStartは共通点もありますが、細かな点で違いがあります。特にAwake同士、Start同士の実行順は保証されない点に要注意です。

    この特徴を忘れていて事故が起きることがよくあります。

    だからこそAwakeやStartは 実行順に依存しない処理 にする事が大事なのです。

    またオオバはStartを使わなくても12年間ゲームを作ってこれました。AwakeとStartの使い分けどうしよう。。。って悩んでいたら一度Startを廃止するのも良いかもしれません。

    本記事を通してAwake、Startの理解が深まったら嬉しいです。ぜひともAwake、Startを使いこなして、ゲーム開発に役立ててみてください。

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

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

    オススメ記事
    検証環境