スクリプトとゲームオブジェクト
スクリプトを持つゲームオブジェクトの取得
MonoBehaviour クラスを継承するスクリプトは、コンポーネントとしてゲームオブジェクトに設定されています。スクリプトを実行しているメソッドの this から得られるのは MonoBehaviour オブジェクトでありゲームオブジェクトではありません。
スクリプトを実行しているゲームオブジェクトを取得するには gameObject プロパティを使います。
public GameObject gameObject { get; }
スクリプトを実行しているゲームオブジェクト自身は gameObject プロパティを使います。しかし、スクリプト自身である MonoBehaviour クラスの多くのプロパティは、スクリプトを実行しているゲームオブジェクトにアタッチされています。
例えば、スクリプトからオブジェクトの名前にアクセスするには gameObject プロパティから得られたオブジェクトの name プロパティを使う方法がありますが、単にスクリプト自身の name プロパティからでもゲームオブジェクトの名前を得られます。
using UnityEngine; public class Test : MonoBehaviour { void Start() { print(name); print(gameObject.name); } }
コード1はスクリプト自身の name プロパティと gameObject プロパティから得られた GameObject オブジェクトの name プロパティを出力しています。実行結果は、同じ名前となるでしょう。
このように、MonoBehaviour クラスのプロパティの多くがスクリプトを実行するゲームオブジェクトのプロパティとして関連付けられています。前述した移動や回転などの座標変換を行う transform プロパティも同様です。
public Transform transform { get; }
名前と同様に gameObject プロパティから得られる GameObject オブジェクトの transform プロパティからも座標変換を行えます。
本来の意味から考えれば、ゲームオブジェクトの状態を操作するには gameObject プロパティから得られる GameObject オブジェクトを通すべきですが、スクリプトの処理の大部分が、スクリプトを持つゲームオブジェクトの操作であるため、スクリプト自身のプロパティがゲームオブジェクトであるかのように作用します。
ただし、これは MonoBehaviour クラスであるスクリプトの this オブジェクトとゲームオブジェクトは異なるものであるという考えを混同させてしまうため注意が必要です。