以類別而言,當然必定是兩兩獨立的,後來才想通,每個 GameObject 在場景中,必定存在某個「位置(Position)」,而 GameObject 這個物件本身並沒有提供這個屬性來存取,因為「位置」這個屬性是被定義在 Transform 類別中的。
而若以「位置」為基礎反推回去,當然必定是用來表示某個座標,而這樣用來表示「位置」的屬性,除非是用在做相關的算術運算,不然以「位置」來思考,它作為座標的表示,確實必須存在一個物體讓「位置」這個屬性去表示它的位置。
就上述的邏輯而言,當一個物體(GameObject)被置於場景(Scene)中時,它必定存在於某個「位置」上,不然你怎麼知道如何在畫面上找到它呢?
所以在這樣的思維上,一個 GameObject 便代表了一個場景上的實體(可見的顯示物件),即便它是Empty GameObject,你也能清楚見到它位於什麼位置。
因此若從不同層面來看,GameObject 和 Transform 的確是各自獨立卻又相互依存的。單從類別層面來看,兩個是不同類別表現了不同的資訊:若從顯示物件的層面而論,彼此卻又是不能拆解分離的。
但由於這樣的特性,可能有人一樣曾在物件存取時會被誤導,因為GameObject 並不能「直接存取」用來表示它「位置」的 Position 這個屬性,甚至是 Rotation 或 Scale,因為Position、Rotation 及 Scale這三個屬性其實是在 Transform 類別中才定義的,GameObject並不存在這三個屬性,只能透過對應的 Transform 去存取該 GameObject 的 Position、Rotation 及 Scale。
小結:
GameObject 在場景(Scene)中,僅在三維空間中代表一個物體,並存在名稱Name)及標籤(Tag)等屬性,且在程式碼中可透過靜態方法來取得對應名稱的 GameObject 物件。
Transform 這個物件在 Unity 中較像是一個元件(Component),一個被掛載在 GameObject 上的元件,用以表示與提供存取該 GameObject 的位置(Position)、旋轉角度(Rotation)及Scale(縮放尺寸)等相關的資訊。
當在場景上新增一個GameObject時,該 GameObject 便會自動附加上Transfrom 這個元件(Component),與其它元件不同不須手動掛載上該元件
,而其他類型的元件則須自行手動附加,如碰撞器(Collider)等元件。
需要特別注意一點,GameObject 的子物件,亦必須透過 Transform 來存取,Transform 提供 childCount 屬性及 GetChild() 方法來取得子物件的數量及指定索引位置的子物件。
沒有留言:
張貼留言