こんにちは、Unityエンジニアのオオバです。
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は初期化関数
結論を簡単にまとめます。
①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つです。その他にもイベント関数はいくつも存在します。
- OnEnable
- OnDisable
- Update
- LateUpdate
- FixedUpdate
- OnDestroy
など多くのイベント関数が用意されています。
👇下のように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にセットすることで初めて動作します。
①ヒエラルキーに配置した②GameObjectを選択
👉 今さら聞けないUnityのヒエラルキー(Hierarchy)とは?
👆上のように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は一度だけ実行される
②Awakeはシーン遷移時または生成時に呼ばれる
③【注意】複数のAwakeの順番は制御できない
④コンポーネントが非アクティブでもGameObjectがアクティブならAwakeは実行される
Awakeの特徴①Awakeは一度だけ実行される
Awakeの特徴は1度しか呼ばれないこと です。一度でもAwakeが呼ばれてしまうと、そのコンポーネントが生きている限りは呼ばれません。
Awakeが呼ばれる条件はGameObjectがアクティブのとき。
つまり以下のInspectorウィンドウのチェックが入っている状態です。
特徴を利用して、 1度しか実行を許さない初期化処理 を書くことが多いです。
- 変数の初期化
- 状態の初期化
- オブジェクトの参照
などなど。
Awakeの特徴を生かしたプログラミングはよく見かけます。
Awakeの特徴②シーン遷移時または生成時に呼ばれる
Awakeが呼ばれる2つのパターンを紹介します。
Awakeの実行パータンA「シーン遷移時」
「①ヒエラルキー」に配置された「②GameObject」にセットされた「③コンポーネント」のAwakeは シーン遷移時 に呼ばれます。
Awakeの実行パータンB「コンポーネント生成時」
動的にGameObjectが生成されたとき セットされたコンポーネントのAwakeは呼ばれます。
// この時点でAwakeは呼ばれる
var obj = Instantiate(prefab) as GameObject;
👆上のようにオブジェクトをプログラミングから新規で生成する場合です。 Instantiateメソッド
が呼ばれた時点でAwakeは呼ばれるのです。
生成された瞬間に呼ばれていることに注意。

【Unity】Prefabを生成する方法徹底解説
Prefabとは再利用可能なGameObject。Prefabは生成することで価値を発揮します。本記事ではPrefabの生成方法について徹底解説します。
Awakeの特徴③【注意】複数のAwakeの順番は制御できない
Awakeには注意点があります。それは 複数のAwakeの実行順は制御できない ことです。
シーン遷移した時、「①ヒエラルキー」に配置された
「②GameObject」の全コンポーネントのAwakeが同時に呼ばれます。
「すべてのAwakeってどういう順番で呼ばれるんだろう?」
って思いますよね。
実はAwakeの呼ばれる順番は デフォルトランダム です。
つまり本当は「A」のAwakeを実行したあとに、BのAwakeを実行したくても毎度結果が変わるため、その 設計は破綻 しているということです。
もし上記のように 処理の順番を制御 したいのであれば次のようなやり方があります。
- AにだけAwakeを定義
- BにはAwakeを定義しない
- BはAwakeに変わるメソッド(Initialize)を定義
- AのAwakeタイミングでBのInitializeを実行
つまり 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は実行してしまうのです。
ちなみに上記の仕様はAwakeのみで「OnEnable」「Start」「Update」などのAwake以外のイベント関数では起きません。
Awakeならではのハマりポイントなので要注意です。
GameObjectのアクティブに依存するのはAwakeだけではありません。
実はコルーチンも影響を受けます。 コルーチンとは中断(待機)と再開を可能にする仕組み 。非同期処理とも呼ばれます。処理の待機はゲーム開発では必須のテクニックです。
まだコルーチンを理解できていないという方は↓↓こちらの記事をどうぞ。
Startの特徴4選
Awakeの特徴を学んだので、次はStartの特徴を紹介します。
①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エディタで動かす分には同じ順番になることもあります。注意すべきはビルド後の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は似ているようで、細かな点で仕様が違います。表にまとめるとこんな感じです。
ー | Awake | Start |
---|---|---|
実行回数 | 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の使い方や特徴、両者の違いについて解説してきました。
簡単にまとめてみます。
①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ライフをお過ごしください。
- Unity6000.0.23f1