はじめに
ゲームオブジェクトを削除しようと思ったとき、Destory(this)
かDestroy(this.gameObject)
はたまたDestroy(gameObject)
のどれが正しいか悩んだことがないでしょうか。
ちなみにDestroy(this.gameObject)
とDestroy(gameObject)
はスクリプトがアタッチされたゲームオブジェクトが削除されますが、Destory(this)
はスクリプトのみが削除されます。
今回はなぜこのようなことが起こるのかをじっくり見てみましょう。
そもそもthisとは
Unityでもよく見かけるthis
ですが、別にUnity特有のキーワードではなく、.NET
に備わっているキーワードの一つです。
拡張メソッドやインデクサーの宣言などにも用いられますが、上の例での意味は以下の通りです。
this キーワードはクラスの現在のインスタンスを参照します。
this キーワード - C# リファレンス | Microsoft Docs
これを踏まえながら先程の3つのDestory
をみてみましょう。
Destroy(this)
このDestroy(this)
は引数としてthis
を渡しています。
つまりDestroy
メソッドを呼んでいるインスタンス自身を引数として渡すことでコンポーネントのみの削除を実行しています。
Destory(gameObject)とDestroy(this.gameObject)
そもそもgameObject
をおまじないだと認識しているかたも多いのではないでしょうか。
厳密に言うと、このgameObject
はMonoBehaviour
クラスのフィールドです。
なので、たとえgameObject
でもthis.gameObject
でもMonoBehaviour
を継承している場合は以下のように書いるのと同じ意味ということになります。
public class Test { private int _num = 10; private void Hoge() { int a = _num; //10 int b = this._num; //10 } }
そしてDestory
の引数がUnityEngine.GameObject
ならばGameObject ならびにすべてのコンポーネント、GameObject の子であるすべてのオブジェクトを破壊します。
ちなみに
ちなみになのですが、Destory
メソッドの引数にUnityEngine.Component
を渡せばゲームオブジェクトからそのコンポーネントを削除してくれるので、このようなコードも書くこともできます。
using UnityEngine; public class Test : MonoBehaviour { private void Start() { // ゲームオブジェクトからRigidbodyコンポーネントを削除する Destroy(GetComponent<Rigidbody>()); } }
さいごに
今回はthis
について紹介をしてみました。
少しでも参考になればなによりです。