はじめに
ゲームオブジェクトをアクティブにするとき、変数や子オブジェクトなどを毎回初期化しておきたい場合に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にも初期化処理が入っている場合は、順番に注意しましょう。