Unityスクリプトで混乱しやすい gameObject と transform の挙動を覚書。
バージョンは5.5.0b8。
シーンはまっさらの状態から Empty の A1, A2 を追加したものを使う。
スクリプトの挙動は以下のようになる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
/* 別物 */ Debug.Log(this.transform == this.gameObject); //False /* thisは省略できる */ Debug.Log(transform == this.transform); //True Debug.Log(gameObject== this.gameObject);//True /* gameObjectとtransformはお互いを持ちあう */ Debug.Log(transform.gameObject == gameObject); //True Debug.Log(transform.gameObject.transform == transform); //True /* GameObjectとgameObject */ GameObject a1 = GameObject.Find("A1"); GameObject a2 = GameObject.Find("A1/A2"); //Transform a1tf = Transform.Find("A1");//これはERROR。 //a1.Find("A2"); //これはERROR。 a1.transform.Find("A2"); //これならOK a1.transform.FindChild("A2"); //これもOK。ただしリファレンス記載なし。 Debug.Log(GameObject.Find("A1/A2")); //A2(gameObject) Debug.Log(a1.transform.Find("A2")); //A2(transform) Debug.Log(GameObject.Find("A1/A2") == a1.transform.Find("A2").gameObject); //True /* 親子関係はtransform */ Debug.Log(a2.transform == a2.transform.parent.Find("A2")); //True |
特にFind関数が混乱しやすいように思う。
GameObjectクラスはルートからパス指定で検索できる。
GameObjectインスタンスは検索できない。
Transformクラスは検索できない。
Transformインスタンスは現在地からの相対パスで検索できる。