UnityのDestroyの仕様

Unityでobjectのクローンを生成する際はObject.Instantiateメソッドを使用しますが、objectを削除する場合はDestroyメソッドを使用します。

Destroyメソッド

仕様

  • 引数にとるObjectがComponentの場合, GameObjectからコンポーネントを削除し、破壊する.
  • 引数にとるObjectがGameObjectの場合, GameObject並びに全てのコンポーネント, GameObjectの子であるすべてのオブジェクトを破壊する。
  • 呼び出したフレームのアップデート処理後に行われる。しかし常にレンダリング前に実行される。
  • MonoBehaviourを継承したスクリプトが削除されるとき, OnDisable, OnDestroyメソッドが削除前に呼ばれる。

参考: https://docs.unity3d.com/ScriptReference/Object.Destroy.html

躓いたところ

上の仕様を知らずにスクリプトを書いていたため

Destroy(this) // これを実行するスクリプトのみ消去される. ゲームオブジェクトは残る

と書いていた。このように書くと、Destroyを実行したスクリプトコンポーネントだけが消去されるためゲームオブジェクトは残ったまんまになる。

Destroy(gameObject) // このように書くとGameObjectが正しく破壊される.

ゲームオブジェクトごと消去したいなら引数にgameObjectを取る。なんでだろーと思って時間を費やしてしまった。

気づいたこと

GameObjectは内部にUnityEngine.Object型の木構造を持っている?

UnityCsReferenceでもComponent.GetComponentメソッドは内部でGameObject.GetComponentメソッドを動かしていたので、多分正しそう? 真相はネイティブコードの中…

GameObjectとComponentは異なるInstanceIDを持っている.

両者ともに異なるUnityEngine.Object型を継承したオブジェクトなので当たり前。だが間違えてたら嫌だったので確かめた。ちゃんと違った。

コメント

タイトルとURLをコピーしました