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 ~
といったログを出しています)
その結果が以下の画像になります。
画像から、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 が一緒という結果だったのですが、好きな方を使用してもいいんでしょうかね?(←調査中です)
何か間違っている内容や追加の情報がありましたらコメントをお願いします!