はなちるのマイノート

Unityをメインとした技術ブログ。自分らしくまったりやっていきたいと思いますー!

【Unity】たびたび登場するthisっていったいなに?

はじめに

ゲームオブジェクトを削除しようと思ったとき、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をおまじないだと認識しているかたも多いのではないでしょうか。

厳密に言うと、このgameObjectMonoBehaviourクラスのフィールドです。

f:id:hanaaaaaachiru:20190604230053p:plain

なので、たとえ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 の子であるすべてのオブジェクトを破壊します。

Object-Destroy - Unity スクリプトリファレンス

ちなみに

ちなみになのですが、Destoryメソッドの引数にUnityEngine.Componentを渡せばゲームオブジェクトからそのコンポーネントを削除してくれるので、このようなコードも書くこともできます。

using UnityEngine;

public class Test : MonoBehaviour
{
    private void Start()
    {
        // ゲームオブジェクトからRigidbodyコンポーネントを削除する
        Destroy(GetComponent<Rigidbody>());
    }
}

さいごに

今回はthisについて紹介をしてみました。

少しでも参考になればなによりです。