Unityでは特定のタイミングで呼ばれるイベントメソッドがいくつもあります。
スクリプトを作成した時にデフォルトで作成されているStartメソッドやUpdateメソッドもそのイベントを受け取って実行されるメソッドですね。
スクリプトにそのイベントのメソッドを記述していなければ実行はされません。
イベントの受け取りはMonoBehaviourクラスを継承して作られたクラスで使用が出来ます。
C#であればスクリプトファイルを作成した時にデフォルトでMonoBehaviourクラスを継承し、JavaScriptでは何も記述せずともMonoBehaviourクラスを継承して作られます。
今回はOnEnable、OnDisable、OnDestroyメソッドを使ってみたいと思います。
OnEnableメソッド
OnEnableメソッドはスクリプトが設定されているゲームオブジェクトがアクティブになった時に呼ばれるメソッドです。
ゲームオブジェクトを選択しインスペクタで名前の左側のチェックボックスにチェックが入った時ですね。
あらかじめヒエラルキー上にゲームオブジェクトを置いておきスクリプトでOnEnableメソッドを記述しておいたとすると、Unityを実行すればOnEnableに記述したスクリプトが実行されます。
ゲームオブジェクトのインスペクタで名前の横のチェックを外してUnityを実行した場合はこのOnEnableは実行されません。
Startメソッドも似たようなタイミングで呼ばれますが、OnEnableメソッドの方がタイミングとして早く呼ばれます。
またStartメソッドは最初にゲームオブジェクトがアクティブになったタイミングで1回しか呼ばれませんが、OnEnableメソッドはアクティブになると毎回呼ばれます。
OnDisableメソッド
OnDisableメソッドはOnEnableメソッドとは逆でゲームオブジェクトが非アクティブになったときに実行されます。
ゲームオブジェクトのインスペクタの名前の左のチェックを外した時ですね。
ゲームオブジェクトが削除される前にも呼ばれます。
OnDestroyメソッド
OnDestroyメソッドはその名の通りそのゲームオブジェクトが削除された時に実行されるメソッドです。
例えば敵を攻撃して倒した時に敵のゲームオブジェクトを消すと思いますがそれと同時にアイテムを落としたい時などにこのメソッドを使用します。
敵が消えた時に実行されるメソッドなのでその時にアイテムを生成するとちょうどいいかもしれません。
OnDestroyの中で新しいインスタンスの生成をするとエラーが発生するので無理っぽいです・・。
他のオブジェクトを生成する以外の後処理をする時に使うといいのかもしれません。
実際にメソッドを使ってみる
実行タイミングを文章だけで見ても解り辛いのでサンプルスクリプトを作り試してみましょう。
ヒエラルキー上で右クリック→Create Emptyを選択し、インスペクタの名前の左のチェックボックスを外しておきます。
↑のようにGameObjectという空のゲームオブジェクトが出来ます。
インスペクタで名前の横のチェックボックスを外し、新しいスクリプトOnEnableOnDisableOnDestroyTestスクリプトを作成し取りつけます。
OnEnableOnDisableOnDestroyTestスクリプトはこの後作成します。
今回使用するメソッドや他のイベントの発生タイミングに関しては
に詳しく記載されています。
イベント発生確認サンプルのOnEnableOnDisableOnDestroyTestスクリプトを作成する
イベントの発生タイミングを確認する為のスクリプトOnEnableOnDisableOnDestroyTestを作成します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | using UnityEngine; using System.Collections; public class OnEnableOnDisableOnDestroyTest : MonoBehaviour { void Start () { Debug.Log("Start"); } void OnEnable() { Debug.Log("OnEnable"); } void OnDisable() { Debug.Log("OnDisable"); } void OnDestroy() { Debug.Log("OnDestroy"); } } |
何の変哲もないスクリプトですね、そのメソッドが呼ばれたら自身のメソッド名をログに出力しているだけです。
このスクリプトを先ほど作成した空のGameObjectゲームオブジェクトに設定してください。
上のインスペクタではEventTestスクリプトになっていますが、OnEnableOnDisableOnDestroyTestが表示されているはずです。
サンプルの実行手順としては
GameObjectゲームオブジェクトは最初非アクティブにした状態でUnityを実行し、インスペクタの名前の左のチェックボックスにチェックを入れます。
するとOnEnableとStartが呼ばれ、ログを一旦Clearにした後にインスペクタの名前の横のチェックボックスのチェックを外します。
ここでOnDisableが呼ばれています。
ログをClearして、GameObjectゲームオブジェクトを選択した状態で右クリック→Deleteを選択してゲームオブジェクトを削除します。
ここでOnDestroyが呼ばれています。
それぞれのイベントの実行タイミングが確認出来ました。
今回のサンプルでは手動でゲームオブジェクトのオン・オフをしたり削除したりしていますが、実際にはスクリプトからゲームオブジェクトのオン・オフや削除を行います。
スクリプトからゲームオブジェクトをオン・オフしたりゲームオブジェクトを削除するには
1 2 3 4 5 6 7 8 9 10 11 | // ゲームオブジェクト [SerializeField] private GameObject obj; void Start() { obj.SetActive(true); // ゲームオブジェクトをアクティブにする obj.SetActive(false); // ゲームオブジェクトを非アクティブにする Destroy(obj); // ゲームオブジェクトを削除する } |
↑のようなメソッドを使うとスクリプトからゲームオブジェクトを操作する事が出来ます。
あくまで操作する時に使用するメソッドを羅列しただけなので実用的でないのはご了承ください・・・・(^_^;)
終わりに
今回のようなイベントの実行タイミングを知っておくとゲームオブジェクトが操作されたタイミングで何らかの処理をする事が出来ます。
AwakeやStart、Update等だけでなくこういったイベントメソッドも覚えてゲームに活用したいですね(^_^)v