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型を継承したオブジェクトなので当たり前。だが間違えてたら嫌だったので確かめた。ちゃんと違った。
コメント