【Unity】Awakeメソッドとは?Startとの違いや呼ばれるタイミング

Awakeメソッドとは? Unity

こんにちは、ともくんのゲーム作り部屋にようこそ!

このページでは、

「UnityのAwakeメソッドってなに?」

「Awakeメソッドはどうやって使えばいいの?」

というお悩みの方に向けた内容となっています。

Awakeメソッドは、Unityで使えるイベント関数の一つで、インスタンス生成直後に呼び出されるメソッドです。

Unityには、同じようなメソッドにStartメソッドがありますが、AwakeメソッドはStartメソッドよりも先に呼び出されるのが特徴です。

そのため、「GameManager」などゲーム内の根幹となるオブジェクトの変数を初期化する際などにAwakeメソッドが使われます。

そこで、このページでは、Awakeメソッドがどういうものなのか、Startメソッドとの違いや使い方までをまとめていきます。

なお、このページでは、

Windows11
Unity Hub3.11.1
Unity6

のバージョンで解説しています。

この記事を書いた人

ゲーム作りを学び始めた一児のパパです。
このブログは、子供から「ゲームを作ってみたい!」と言われ、非プログラマーでゲーム作りをしたことない僕が、ゲーム作りの本を読んで独学でゲーム開発を学んでいるブログです。
同じように初めてゲーム作りをしている方と一緒に学んでいけるようなブログに出来たらいいなと思っています。
また、「このコードはおかしい」とか「もっと良い書き方があるよ!」などあれば、どんどん指摘して頂けると助かります。

Awakeメソッドとは?

まずは、Awakeメソッドの仕様や特徴について紹介していきます。

インスタンス生成直後に呼ばれるイベント関数

Awakeメソッドは、インスタンスが生成された直後に一回だけ自動的に呼び出されるイベント関数です。

このインスタンスとは実体のことで、オブジェクトが有効化されたタイミングにAwakeメソッドが呼び出されることになります。

インスタンスが生成されて自動で呼び出されるイベント関数として、Awakeメソッドの他にも、StartメソッドUpdateメソッドなどがあります。

Startメソッドとの違いは呼ばれる順番

Awakeメソッドと同じように、インスタンスが生成されてすぐに一度呼び出されるメソッドとして、Startメソッドがよく使われます。

AwakeメソッドとStartメソッドの違いとして、呼ばれるタイミングが異なっていて、AwakeメソッドはStartメソッドよりも早く呼ばれることになります。

もう少し詳しく言うと、

という違いがあり、Awakeメソッドの方が先に処理されて、その後にStartメソッドの処理が行われます。

なお、Updateメソッドは、このStartメソッドの後に呼ばれることになります。

Awake ⇒ Start ⇒ Update

一番先に行うべき処理をAwakeメソッドに書く

AwakeメソッドもStartメソッドも、変数の初期化を行う際によく使われるメソッドです。

基本的には、Startメソッドで変数の初期化を行えばよいのですが、他のスクリプトを含めたStartメソッド同士の順番はランダムになっていて、どのStartメソッドから呼ばれるかが分かりません。

そこで、他のStartメソッド内での処理よりも早く呼ぶ必要がある場合に、Awakeメソッドを使います。

例えば、冒頭でも解説した通りで、ゲームの根本となるスコアやライフなどを管理させるための「GameManager」のオブジェクトを置く場合は、先に変数にインスタンスを入れておかないといけないため、Awakeメソッドを使って処理しておくことがあります。

そのため、Startメソッドの中で基本的に変数の初期化を行い、特に優先的に行うべき処理はAwakeメソッドの中に記述していきましょう。

Awakeメソッドの使い方

ここからは、Awakeメソッドの使い方についてまとめていきます。

なお、AwakeメソッドとStartメソッドの使い方は、全く一緒になっています。

MonoBehaviourクラスを継承する

Awakeメソッドを使うためには、MonoBehaviourクラスを継承する必要があります。

継承とは、クラス内の変数やメソッドを別のクラスに引き継ぐことで、AwakeメソッドはMonoBehaviourクラスという中で定義されているので、継承して派生クラスを作成する必要があります。

using UnityEngine;

public class クラス名 : MonoBehaviour  // MonoBehaviourクラスを継承する
{
}

MonoBehaviourから継承を行う際は、3行目のクラス作成の際に、クラス名の後ろに「:」を付けてMonoBehaviourと書くことで、継承することができます。

なお、僕の使っているUnity6では、スクリプト作成の際に自動的にMonoBehaviourクラスを継承することができるようになっているので、その場合はこの作業は必要ありません。

Awake()でメソッド内に処理を書いていく

MonoBehaviourクラスの継承ができたら、スクリプト内にAwakeメソッドを書いていきます。

Awakeメソッドは返り値が無いため、

using UnityEngine;

public class Test : MonoBehaviour  // MonoBehaviourクラスを継承する
{
    void Awake()    // Awakeメソッドを作る
    {
        // Awakeメソッドの処理内容を書く
    }
}

と、5行目のようにvoid型で書いてあげることで、Awakeメソッドを使うことができます。

これで、Awakeメソッドの{}内の処理が、インスタンス生成直後にStartメソッドの前に一度だけ行われるようにできます。

なお、メソッドの作り方については、以下の記事でも詳しくまとめていますので、参考にしてみてください。

まとめ

このページでは、Unityで使われるAwakeメソッドについて、どんなメソッドなのか、Startメソッドとの違いや使い方についてまとめていきましたが、いかがでしたでしょうか?

Awakeメソッドは、インスタンス生成直後に呼ばれるイベント関数で、そのメソッド内に書かれている処理が一度だけ行われます。

そのため、Awakeメソッドは変数の初期化に使われることが多い関数です。

またStartメソッドよりもAwakeメソッドの方が先に呼ばれることになるため、優先的に行いたい処理をAwakeメソッドに書くことになります。

最後までお読みいただきまして、ありがとうございました!

コメント