【Unity】初期化に便利!OnEnableの使い方!OnEnable/Start/Awakeの呼ばれる順番は?

はじめに

ゲームオブジェクトをアクティブにするとき、変数や子オブジェクトなどを毎回初期化しておきたい場合にOnEnableが役に立ちます。

この記事では、OnEnableの使い方や、StartやAwakeとの違いについて解説します。

OnEnableとは

スクリプトが設定されているゲームオブジェクトがアクティブになったときに呼ばれる関数です。

もともとアクティブなゲームオブジェクトの場合は、ゲーム開始時にStartやAwakeと同様に呼ばれます。

ゲームオブジェクトが非アクティブから、アクティブになるたびに毎回呼ばれます。

そのため、ゲーム開始時だけでなく、ゲーム中にも必ず初期化したい時に役に立ちます。

Start / Awakeの違い

Startメソッドは、ゲームオブジェクトがアクティブな時、最初のフレームで1度だけ呼ばれます。

もともと非アクティブなゲームオブジェクトの場合は呼ばれませんが、途中でアクティブになった場合は1度だけ呼ばれます。

Awakeは、アクティブなゲームオブジェクトが最初期に1度だけ実行するメソッドです。

Startよりも前に呼ばれます。

こちらもStartと同様に、非アクティブなゲームオブジェクトの場合は呼ばれませんが、途中でアクティブになったら1度だけ呼ばれます。

ゲーム開始時の初期化に順序をつけたい場合、AwakeとStartに初期化内容を分けて書くのも良いでしょう。

OnEnable / Start / Awake の呼ばれる順番

OnEnableはAwakeとStartの間に呼ばれます。

Awake → OnEnable → Start

試してみる

以下のコードをアクティブなゲームオブジェクトに追加して、実行します

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class test2 : MonoBehaviour
{
    void Awake()
    {
        Debug.Log("Awake実行");
    }

    void OnEnable()
    {
        Debug.Log("OnEnable実行");
    }

    void Start()
    {
        Debug.Log("Start実行");
    }
}

コンソールを見ると、Awake → OnEnable → Start の順で実行されていることがわかります。

また、ゲームオブジェクトのアクティブ/非アクティブを途中で何度か切り替えてもOnEnableは実行されますが、StartやAwakeは実行されませんでした。

おわりに

StartやAwakeでは1度だけしか実行できないので、ゲーム中何度も初期化が必要な場合には、OnEnableは必須のメソッドですね。

また、OnEnableの前後にAwakeとStartが実行されるので、AwakeやStartにも初期化処理が入っている場合は、順番に注意しましょう。

ゲーム作りがゼロから学べるおすすめ動画はこちら
Unity
umiをフォローする
umi studio blog
タイトルとURLをコピーしました