【Unity】thisキーワードとは?インスタンス自身を参照できる

thisキーワードとは? Unity

こんにちは、ともくんのゲーム作り部屋にようこそ!

このページでは、

「Unityで使うthisってなに?」

「thisキーワードの使い方が分からない。」

というお悩みの方に向けた内容となっています。

UnityでC#スクリプトを書いていく際に、「this」というキーワードを付けて書いていくことがあります。

このthisは、日本語では「これ」とかを意味しますが、プログラミングではそのインスタンス自身を表しているキーワードです。

例えば、そのインスタンスの持つ変数を指定したり、コンストラクタを作る際のメンバ変数を指すのにthisが良く使われます。

そこで、このページでは、Unityのスクリプトを書いていく際に使う「this」というキーワードについて、どういうものなのか、使い方などをまとめていきます。

この記事を書いた人

ゲーム作りを学び始めた一児のパパです。
このブログは、子供から「ゲームを作ってみたい!」と言われ、非プログラマーでゲーム作りをしたことない僕が、ゲーム作りの本を読んで独学でゲーム開発を学んでいるブログです。
同じように初めてゲーム作りをしている方と一緒に学んでいけるようなブログに出来たらいいなと思っています。
また、「このコードはおかしい」とか「もっと良い書き方があるよ!」などあれば、どんどん指摘して頂けると助かります。

thisキーワードとは?

まずは、thisキーワードがどういうものなのかを紹介していきます。

インスタンス自身を表すキーワード

「this」というキーワードは、そのインスタンス自身を表しているキーワードです。

インスタンスは、クラスを元に作られた実体のことで、thisによってこの実体を参照することができます。

そして、以下のようにthisに続けて変数名などを繋げてあげることで、そのインスタンス自身が持つ変数にアクセスすることができます。

this.変数名

メンバ変数とローカル変数を区別する際に使われる

「this」キーワードは、メンバ変数とローカル変数を区別する目的で使われるキーワードです。

例えば、以下のようにスクリプトを書いたとしても、基本的にはthisを付けても付けなくても、同じ変数にアクセスすることができます。

using UnityEngine;

public class Test : MonoBehaviour
{
    int hp = 100;

    void Start()
    {
        Debug.Log("HPの値は" + hp);
        Debug.Log("HPの値は" + this.hp);
    }
}

そのため、上記スクリプトを実行すると、以下のように同じ値が返ってきます。

しかし、メンバ変数とローカル変数の変数名が同じ場合、thisを付けるとメンバ変数を指定することができます。

例えば、以下のようにメソッドを作って引数に変数で値を受け取るようにした場合、

using UnityEngine;

public class Test : MonoBehaviour
{
    int hp = 100;   // メンバ変数hpを宣言する

    void HpCheck(int hp)    // 引数にhp変数で値を受け取る
    {
        Debug.Log("HPの値は" + hp);    // ローカル変数hpの値
        Debug.Log("HPの値は" + this.hp);   // メンバ変数hpの値
    }

    void Start()
    {
        HpCheck(50);
    }
}

9行目で指定している「hp」は、7行目に書いたメソッドの引数のhp変数(ローカル変数)にアクセスしています。

一方、10行目で指定している「this.hp」は、5行目で書いたhp変数(メンバ変数)にアクセスしています。

そのため、上記のスクリプトを実行すると、

それぞれ異なる答えが返ってきます。

このように、thisキーワードを使うことで、メンバ変数とローカル変数を区別することができます。

thisキーワードのよくある使い方

ここからは、実際にthisキーワードのよくある使い方を紹介していきます。

this.gameObjectで使う

「this.gameObjectと記述することで、そのスクリプトがアタッチされているゲームオブジェクトを参照することができます。

もう少し詳しく言うと、この「this」はインスタンス自身を表していますが、オブジェクトでは無くそのスクリプト自体を指していることになります。

例えば、オブジェクトなどを破壊することができるDestroyメソッドを使って説明してみます。

ここでは、ゲーム内に四角のオブジェクトSquareを配置して、Testというスクリプトをアタッチ、このスクリプトでオブジェクトを消去していきます。

using UnityEngine;

public class Test : MonoBehaviour
{
    void Start()
    {
        Destroy(this);
    }
}

オブジェクトを消去する際に、7行目のように「Destroy(this);」と書いてしまいがちですが、これでゲームを実行してもオブジェクトは消去されません。

その代わりに、オブジェクトに紐づいているスクリプトが消去されているのが分かります。

次に、このDestroyメソッドの引数を「Destroy(this.gameObject);」に変更してみます。

using UnityEngine;

public class Test : MonoBehaviour
{
    void Start()
    {
        Destroy(this.gameObject);
    }
}

すると、ゲームオブジェクト自体を消去することができているのが分かります。

以上より、「this」インスタンス自身でそのスクリプトを指していて、「this.gameObject」にすることで、そのスクリプトがアタッチされているゲームオブジェクトを指すことができます。

なお、「this.gameObject」の部分は「gameObject」とだけ書いた場合でも同じになります。

コンストラクタで使う

「this」キーワードは、コンストラクタを作る際によく使われるキーワードです。

このコンストラクタとは、クラスのインスタンスが生成された時に必ず実行されるメソッドのことで、メンバ変数の初期値を強制的に代入したりすることができます。

using UnityEngine;

public class Test : MonoBehaviour
{
    public class Player
    {
        public int hp;

        // Playerクラスのコンストラクタ
        public Player(int hp)
        {
            this.hp = hp;   // 左がメンバ変数、右がローカル変数
        }
    }

    void Start()
    {
        Player player = new Player(100);
    }
}

例えば、上記のスクリプトの10行目から13行目がPlayerクラスのコンストラクタになっています。

コンストラクタの引数で変数「hp」の値を受け取り、その値を12行目でメンバ変数の「hp」に代入する処理をしています。

この引数の変数名とメンバ変数の変数名が同じ「hp」なので、メンバ変数には「this」キーワードを付けて「this.hp」としてあげることで、区別するようにしています。

ちなみに、このthisは必ず使わなければならないものではなく、以下のようにメンバ変数とローカル変数の変数名が違う場合(hpとmp)は、わざわざthisを付けなくても認識してくれます。

using UnityEngine;

public class Test : MonoBehaviour
{
    public class Player
    {
        public int hp;

        // Playerクラスのコンストラクタ
        public Player(int mp)
        {
            hp = mp;    // thisを付けなくても認識できる
        }
    }

    void Start()
    {
        Player player = new Player(100);
    }
}

まとめ

このページでは、Unityのスクリプトを書く際に使う「this」キーワードについて、どういうものなのか、仕組みや使い方までをまとめていきましたが、いかがでしたでしょうか?

「this」というキーワードは、そのインスタンス自身を表しています。

そして、この「this」を使うことで、同じ変数名のローカル変数とメンバ変数を区別するために使うことができます。

特に、引数付きのコンストラクタを作る際には、よく使うことが多いので、覚えておくとよいでしょう。

最後までお読みいただきまして、ありがとうございました!

コメント