テラシュールブログ

旧テラシュールウェアブログUnity記事。主にUnityのTipsやAR・VR、ニコニコ動画についてのメモを残します。

イベント登録時のオブジェクト削除

先日の【InputTouchesの記事】で、
オブジェクト(もしくはコンポーネント)が破棄された状態で、イベント実行すると
問題があるのではないか的なツィートがあったので、実際に調べてみた。

イベントさしたらゲームオブジェクトが破棄されるタイミングでイベント外さないとアレな気がする…大丈夫? 【元文

情報感謝です。

■実験内容

テストした手順はこんな感じ
1.コンソールにメッセージを出力するイベントを作成。
 イベントを持つクラスはInputTouchesTestクラスと命名。
2.GestureのSwipeEにイベントを登録。
3.スワイプ操作。
4.InputTouchesTestコンポーネントまたはゲームオブジェクトを削除。
5.スワイプ操作。

期待動作は、3はメッセージが表示され、5はエラー表示が出て停止する、
そう思ってた時期が私にもありました。

ちなみにコードはこんな感じ。


public class InputTouchesTest : MonoBehaviour {

string message = "swipe";

void Start () {
Gesture.onSwipeE += action;
}

void Update () {
if(Input.GetKeyDown(KeyCode.Space))
{
Destroy(this); //(もしくはDestroy(gameObject);)
}
}

void action(SwipeInfo pos) {
Debug.Log(message);
}
}

■実際の動作

結論から言ってしまうと、オブジェクトを削除しても普通に動作した
エラーも発生していない。

いくらなんでもオカシイので、
毎アップデートでカウンタに+1する処理を作って
ログの数値を眺めてみたところ、オブジェクトを削除したポイントでカウンタが停止。

また、毎スワイプ時にカウンタ+1する処理を作って動作を確認したところ、
オブジェクトを削除してもコンポーネントを削除してもカウンタに+1し続けた。


何これ怖い。

スクリーンショット 2012-06-07 1.33.51


これ放置すると原因不明のバグになりそうな気がする。

イベントを使用しているオブジェクトを削除するときは、必ず「-=」で削除したほうが良さそうだ。