【Unity】オブジェクトが消えた瞬間を察知してイベントを受け取る
Unityではいろんな条件に対してイベントを飛ばすことが出来ます。今回はGameObjectが消されたタイミングにイベントを呼び出す処理をどのように実装するかを解説したいと思います。
オブジェクトが消えた時にイベントを受け取る方法
先にスクリプトの回答から。今回のプログラムでは、消えた側とその観測者側の2種類のスクリプトを準備します。ソースファイルだけをを確認したい場合はこちらのコードを見て、ピンと来たらあとは自分のプログラム修正にでも戻ってくださいませ!
オブジェクトが消えたタイミングでイベントを投げる方
こちらのスクリプトはアタッチしているオブジェクトがDestroyなどで消された場合にDestroyedというログを表示して、OnDestroyedというイベントをキックします。
using UnityEngine;
using UnityEngine.Events;
public class DeleteObject : MonoBehaviour {
public UnityEvent OnDestroyed = new UnityEvent();
private void OnDestroy(){
Debug.Log("Destroyed");
OnDestroyed.Invoke();
}
}
OnDestroyというメソッドが、オブジェクトが消えた時に自動的に呼び出されます。自分の中で終了処理などを利用する場合はこのメソッド内で完結させるだけでOKです。他のスクリプトに消されたことを告知する場合、OnDestroyedを利用して伝えることが可能です。OnDestroyedのつなぎこみは次のスクリプトでご紹介します。
監視しているオブジェクトが壊されたことを察知する
今回は上記のスクリプトと連携する形で、監視しているオブジェクトが消えたことを察するプログラムです。UnityEventの使い方を別途覚える必要がありますが、まずはプログラムの形からこれでいいのね、という感じで使って下さい。
using UnityEngine;
public class Checker : MonoBehaviour {
public DeleteObject target;
void OnDisable()
{
target.OnDestroyed.RemoveAllListeners();
}
void OnEnable()
{
target.OnDestroyed.AddListener(()=>{
Debug.Log("targetがDestroyされました");
// ここに処理を追加
});
}
}
AddListenerを使って、targetがなくなった時に処理したい内容を実装することが出来ます。今回はラムダ式という方法で記載しています。()=>とかはわかんない場合はまずは真似してみて下さい。OnEnable/OnDisableでイベントの登録と解除をしていますが、このあたりはプログラムに合わせて実装してみて下さい。
実際に動かして試してみる
上記スクリプトを利用して、実際にイベントを受け取ったりして見ましょう。
下ごしらえ
- 上記スクリプトを2つ用意して下さい
- 空のシーンを作成
- CreateEmptyx2を用意します
- 各GameObjectに2つのスクリプトを別々にアタッチします
- CheckerインスペクターのtargetにDeleteObjectをセットして下さい
下図ではわかりやすくするため、CreateEmptyで作ったGameObjectの名前をスクリプト名と同じものに変更しています
動作チェック
以上のセットアップが完了したら、プレイをしてみましょう。動かした状態では特に変化はありませんが、動いている状態からDeleteObjectを右クリック>Deleteで削除すると以下のようなログが表示されると成功です。
オブジェクトのOnDestroyはエディター上の操作でも呼ばれますが、プログラムでDestroyしても同様の動きをしてくれます。
締め
簡単にですが、オブジェクトが壊された時にイベントを取得する方法をご紹介しました。こちらのプログラムだけで次の項目が使われています。もっと掘り下げて理解する場合はキーワードとして利用してみて下さい
- OnDestroy(Unityのライフサイクル)
- UnityEngine.Events
- UnityEvent
- Invoke
- AddListener
- OnEnable/OnDisable
今回のサンプルはgithubにもアップしていますので、動いているものから確認したい場合はこちらからダウンロードしてみて下さい
→Githubのリンク