こんにちは、Unityエンジニアのオオバです。
Unityでプログラミングを始めると必ず登場する Awakeメソッド 。
イベント関数 とも呼ばれます。
イベント関数とはMonoBehaviourを継承した自作コンポーネント内で実行される特別な関数です。
Unity開発では欠かせない機能の1つです。
そんな重要なイベント関数の1つであるAwake。
Awakeはいつ使うのべきか?
オオバも初心者の頃Awakeの使い方がわかりませんでした。
Unityを始めて11年。今ならわかりますが 「Awake」はUnityプログラミングで超重要 です。
必ず理解しておく必要があります。
そこで、本記事ではUnityプログラミング初心者に向けたAwakeを解説します。
Awakeの理解なしにゲーム開発は不可能 です。
本記事を通してAwakeを理解してしまいましょう。
UnityのAwakは初期化に使う
結論を簡単にまとめます。
①Awakeは1度しか呼ばれないので初期化に使う
②Awakeはシーン開始時に呼ばれる
③Awakeはインスタンス生成時にも呼ばれる
④複数のAwakeの順番は制御できない
⑤GameObjectがON(アクティブ)のときに呼ばれる
Awakeは初回1度しか呼ばれない特徴を生かして 初期化 に使います。
ただし、 Awake同士の順番は保証されない ことに注意が必要。
このあたり知ってるかどうかで、プログラミングの安定性はかなり変わってきます。
このように Awakeの理解はUnityプログラミングにとってかなり重要 です。
Awakeの正しい知識を身につけて正確なプログラミングを目指しましょう。
では詳しい解説に入ります。
👉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からは呼ばれません。
①ヒエラルキーに配置した②GameObjectを選択
👉 今さら聞けないUnityのヒエラルキー(Hierarchy)とは?
👆上のようにGameObjectにセットすることでAwakeは呼ばれるようになります。
これがUnityプログラミングの基本です。
Awakeを含むイベント関数はMonoBehaviourをを継承することで動作 します。
つまり MonoBehaviourはUnityプログラミングにとって重要 なのです。
そんなMonoBehaviourの徹底解説記事を執筆しました。
MonoBehaviourに不安な方はぜひ読んでみてください。
ちなみにGameObjectとコンポーネントの違いについて不安のある方ははこちらの記事がオススメです。
Awakeの特徴4選
この章ではAwakeの特徴を4つ紹介します。
①一度しか呼ばれない
②シーン遷移時または生成時に呼ばれる
③【注意】複数のAwakeの順番は制御できない
④コンポーネントが非アクティブでもGameObjectがアクティブなら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の順番は制御できない
1点Awakeには注意点があります。
複数のGameObjectのそれぞれのAwakeの順番は制御できません。
シーン遷移した時、「①ヒエラルキー」に配置された
「②GameObject」の全コンポーネントのAwakeが同時に呼ばれます。
「すべてのAwakeってどういう順番で呼ばれるんだろう?」
って思いますよね。
実はAwakeの呼ばれる順番は デフォルトランダム です。
つまり本当は「A」のAwakeを実行したあとに、BのAwakeを実行したくても毎度結果が変わるため、その 設計は破綻 しているということです。
もし👆上のように処理の順番を制御したいのであれば、次のようなやり方があります。
- ① AwakeはAだけ定義
- ② BにはAwakeを定義しない
- ③ BはAwakeに変わるメソッド(Initialize)を定義
- ④ AのAwakeタイミングでBのInitializeを実行
💻ソースコード : 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などは呼ばれません。
ハマりやすいポイントなので注意です。
GameObjectのアクティブに依存するのはAwakeだけではありません。
コルーチンも同様です。 コルーチンとは中断(待機)と再開を可能にする関数 です。
ゲーム開発では処理の待機は必須のテクニック 。
まだコルーチンを理解できていないという方はこちらの記事をどうぞ。
UnityのAwakeまとめ
Awakeの使い方と呼ばれる順番について解説してきました。
簡単にまとめてみます。
①Awakeは一度しか呼ばれないので初期化処理を書く
②Awakeはシーン遷移時または生成時に呼ばれる
③Awake同士の実行順はランダム
④コンポーネントが非アクティブでもGameObjectがアクティブならAwakeは実行
Awake同士の実行順はランダム なのがポイントですね。
ここを勘違いしていると思わぬ不具合に見舞われます。
だからこそ、 Awakeは 呼ばれる順番に依存しない処理を書く ことが大事。
また、一度しか呼ばれない特徴を生かして初期化処理を書くのが良いですね。
ぜひともAwakeを使いこなして、ゲーム開発に役立ててみてください。
Awakeは重要なイベント関数の1つです。
違いが分かりづらいUpdate、LateUpdateという2つのイベント関数。
この違いを詳しく次の記事で解説しています。イベント関数はUnity開発では必須知識。ぜひ読んでみてください。
この記事が気に入ったらフォローしよう
「Unity初心者大学」というUnity初心者向けのYouTube始めました!!
ぜひチャンネル登録をお願いします!
最後まで読んでいただきありがとうございました!
すばらしいUnityライフをお過ごしください。
- Unity2020.3.26f1