ぱふの自由帳

ぱふの技術ブログ。メインはUnity。最近はUnity1Weekの放送してます。良ければフォローお願いします、、

this と gameObject と this.gameObject の違いをまとめた

はじめに

this と gameObject と this.gameObject を感覚で使っていたので違いを調べたものをまとめておきます。違いがいまいち分からないって方の参考になれば・・(*・.・)ノ

何が違うのか

this

自分自身のインスタンスを指します。ゲームオブジェクトにアタッチされているスクリプト自身を指していると理解してください。

gameObject

スクリプトがアタッチされているゲームオブジェクトを指します。

this.gameObject

ゲームオブジェクトにアタッチされているスクリプトがアタッチされているゲームオブジェクト(呪文のようですが…)。すなわち、スクリプトがアタッチされているゲームオブジェクトを指します。

結局…

this と gameObject は別物ですが、gameObject とthis.gameObjectは同じものを指していると言うことです。

確認してみた

今回、ゲームオブジェクトobj_a,obj_b,obj_cのそれぞれにA,B,Cという名前のスクリプトをアタッチしてみました。AのスクリプトDebug.Log(this)を、BのスクリプトDebug.Log(gameObject)、CのスクリプトDebug.Log(this.gameObject)といった処理を記述しています。(分かりやすくなるようにA is ~といったログを出しています)
その結果が以下の画像になります。

f:id:PafuOfDuck:20170517205621p:plain

画像から、Aはobj_aにアタッチされているスクリプトを指しており、B,Cはそれぞれのゲームオブジェクトを指していることが確認できます。

ちょっと待てよ?

this.GetComponent<hoge> (); ・・・A
this.gameObject.GetComponent<hoge> (); ・・・B

「上のコードはA,Bどちらも同じを動きをするから this と this.gameObject は同じなのでは?」と思った方はいませんか?思った方は少し長いですが以下を読むことをおススメします。

A,Bは正確に言うと常に同じものではありません。A,Bが同じ動きをするのは MonoBehaviour を継承したクラス内のみなのです。なぜなら、GetComponent というメソッドが MonoBehaviour で実装されているからです。
つまり、MonoBehaviour を継承していなければ GetComponent メソッドは自分で実装していない限り存在していません。そのため、MonoBehaviour を継承していないクラス内ではAはエラーとなります。
Bは MonoBehaviour を継承しているかどうかに関わらずエラーは発生しません。なぜなら、this.gameObject の GameObject クラスは MonoBehaviour を継承したクラスになっているためです。

おわり

後半は長々しい説明になってしまいましたが、以上でまとめを終わります。
個人的な疑問なのですが、gameObject と this.gameObject が一緒という結果だったのですが、好きな方を使用してもいいんでしょうかね?(←調査中です)

何か間違っている内容や追加の情報がありましたらコメントをお願いします!

初心者の方や熟練者の方を問わずTwitterのフォローお待ちしています…(`・ω・´) Let’s Unity !