Menu
CoddyTech

OnEnableとOnDisable

CoddyのUnityジャーニー「Unityスクリプトの基礎」セクションの一部。レッスン 72/85。

OnEnable()は、スクリプトがアクティブになるたびに実行されます。オブジェクトが最初に表示されたとき(Awake()の直後)と、SetActive(true)でオブジェクトが表示されるたび、またはenabled = trueでスクリプトが再び有効になるたびに実行されます。OnDisable()は、オブジェクトが非表示になるたび、スクリプトが無効になるたび、またはオブジェクトが破棄されるたびに実行されます。

別のスクリプトがSetActiveで開閉するポータルは、自身の状態を記録できます。

void OnEnable()
{
    Debug.Log("Portal open");
}

void OnDisable()
{
    Debug.Log("Portal closed");
}

シーンが始まると、ポータルはPortal openを記録します。ポータルを非表示にしてから再び表示すると、Portal closed、続いてPortal openが記録されますが、Awake()とStart()は2回目には実行されません。そのため、タイマーのリセットや訪問回数のカウントなど、表示されるたびに実行する必要があるコードはOnEnable()に記述します。ポータルが非表示の間はUpdate()が実行されないため、別のオブジェクトに付いているスクリプトがポータルを開閉します。

challenge icon

チャレンジ

中級

各Switchableがオンになったときとオフになったときに報告するようにしましょう。

  1. int count;フィールドとvoid OnEnable()を追加します。countに1を加えてから、name + " on (" + count + ")"をログに出力します。例:Bubble on (2)。
  2. void OnDisable()を追加し、name + " off"をログに出力します。

「プレイ」を押してからSpaceキーを押します。ConsoleにはPlayer on (1)、続いてBubble on (1)とBubble offが表示されます。その後、「確認」を押します。

自分で試してみよう

using UnityEngine;

public class Switchable : MonoBehaviour
{
    public GameObject target;

    void Update()
    {
        if (target != null && Input.GetKeyDown(KeyCode.Space))
        {
            target.SetActive(!target.activeSelf);
        }
    }

    // このオブジェクトがオンになるたびに、その回数を数えて "<name> on (<count>)" をログに出力する
    // オフになるたびに、"<name> off" をログに出力する
}

Unityスクリプトの基礎のすべてのレッスン

自分で練習してみよう: Unityプレイグラウンド