ゲームオブジェクトとは
UnityEngine.GameObject
Base class for all entities in Unity scenes.
ゲームオブジェクトとは「Unityのシーン上に配置される全てのモノの基本クラス」です。
C#もUnityもオブジェクト指向パラダイムに基づいて設計されています。(正確にはコンポーネント指向なんですが、それはコンポーネントの回で説明します。)
もしオブジェクト指向と言われてピンとこない人は、この記事を読む前に5分で絶対に分かるオブジェクト指向を読んでみてください。
寄り道:Unityの基本クラス
シーンについては次回に解説するとして、勘のいい人なら、シーン上に配置されないモノも含んだ基本クラスの存在を予想できるはずです。お察しの通り、あります。
UnityEngine.Object
Base class for all objects Unity can reference.
名前はまんま、オブジェクトです。説明文を直訳すると「Unityが参照できる全てのオブジェクトの基本クラス」になります。
ここで「Unityが参照できる」というのは、インスタンスIDというものがUnityEngineによって割り振られているという意味です。 逆説的にこのUnityEngine.Objectを継承していないオブジェクトにはUnityEngineによってインスタンスIDが割り振られることは無いわけです。
もしもあなたが、いま使っているオブジェクトがインスタンスIDを持っているかどうか不安になったら、以下のスクリプトを書いて実行してみると良いでしょう。
Debug.LogFormat("私のインスタンスIDは{0}です!", GetInstanceID());
GetInstanceIDメソッドの返り値はint型で、その値はユニークであることがUnityEngineによって保障されています。
もちろん、UnityEngine.GameObject(以降、ゲームオブジェクト)も、このUnityEngine.Objectを継承しています。
ゲームオブジェクトの特徴
ゲームオブジェクトに話を戻します。
ゲームオブジェクトは、その役割から主に以下の情報を"必ず"持っています。
- シーン上でアクティブか否か
- どのレイヤーに属するか(0~31)
- タグ名
- Transform(コンポーネント)
- ローカル変形情報
- 位置
- 回転
- 縮尺
- 親子関係
- ローカル変形情報
名前(nameプロパティ)が無いじゃないか!と思った方、惜しいです。nameはUnityEngine.Objectからの継承だったりします。
さて、ゲームオブジェクトがゲームオブジェクトたる所以は、Transformコンポーネントにあります。
というのも、Transformコンポーネントが変形や親子関係の情報を持っており、これらがあることで初めてゲームオブジェクトがシーン上に存在できるからです。
では、Unityにおいてしばしば登場する「空のゲームオブジェクト」にもTransformコンポーネントは割り当てられているのかと言われると、もちろん空だろうが何だろうがゲームオブジェクトなのだから割り当てられています。
心配なら、ゲームオブジェクトに以下のコードをアタッチして実行してみればよいのです。
Debug.Log(this.gameObject.transform.position);
コンソールに (0.0, 0.0, 0.0) とか出ると思います。
ゲームオブジェクトとして生まれたからには描画されずともTransformコンポーネントが割り当てられ、シーン上に存在しているのです。
描画しないものに座標情報を与えるのは何とも無駄な気がしますが、それがUnityのルールなので仕方ありません。