每個游戲?qū)ο?GameObject),其存在于游戲世界,都有一個位置、朝向、大小等基本定位信息;其存于Hierarchy面板,也存在與其他GameObject的相對關(guān)系,如父子關(guān)系、兄弟關(guān)系。Unity中使用Transform來描述和操作這些屬性。
Transform的字面理解就是“變換”的意思,所有的GameObject,當其被創(chuàng)建完成之后,均自動創(chuàng)建了這樣一個變換組件,你不需要手動創(chuàng)建這個組件,而且無法刪除此組件。
接下來,我們將變換組件的主要屬性和功能一一進行解釋。
層次面板
childCount:代表當前GameObject節(jié)點下方有幾個子節(jié)點
hierarchyCount:代表在當前GameObject所處的相互關(guān)聯(lián)的樹狀結(jié)構(gòu)中,存在的層次數(shù)目。
相互關(guān)聯(lián)的樹狀結(jié)構(gòu)指的是:以Hierarchy面板中的一個頂層GameObject作為根節(jié)點出發(fā)的一棵樹。任何一個GameObject都會存在于一棵樹中。
可以預想的是,這個樹狀結(jié)構(gòu)中的任意一個節(jié)點的hierarchyCount屬性都是相同的。
hierarchyCapacity:代表當前所在的樹的層次容量。就是這棵樹大可以容納的節(jié)點數(shù)目,從整個樹中的任意一個節(jié)點訪問此屬性,所獲取的層次容量都是相同的。
這個參數(shù)是自動增長的,即當GameObject發(fā)生層次變動時,如果當前樹的容量不足,會自動擴容。
可以推測出:樹中所有節(jié)點所查詢的結(jié)果實際來自最頂層節(jié)點的屬性,而當層次所發(fā)生變動時,Unity內(nèi)部只需要修改頂層節(jié)點的這個屬性即可。
需要注意的是,當頻繁變化hierarchyCapacity時,是需要帶來額外的內(nèi)存消耗和性能消耗的,這與List類的內(nèi)存擴容是一個道理。因此,應該為頻繁增長的樹的根節(jié)點在一開始就設(shè)置一個比較大的容量。
parent:代表當前節(jié)點的父節(jié)點,返回一個Transform對象。當此parent為null時,就代表自己已經(jīng)是頂層節(jié)點,也即樹狀結(jié)構(gòu)中的根節(jié)點了。
root:獲得當前樹狀結(jié)構(gòu)中的根節(jié)點。
DetachChildren():分離子節(jié)點,意思就是將當前節(jié)點下方的所有直接子節(jié)點都分離出去,讓他們成為根節(jié)點。有n個子節(jié)點,將產(chǎn)生n棵新的樹。
Find(string name):根據(jù)路徑查找子節(jié)點,雖然這里的參數(shù)在文檔上顯示為name,但是它實際代表一個路徑。它可以是"magazine/ammo"這種格式,即可以向著葉節(jié)點深度方向查詢多個層次,找到目標Transform并返回。如果找不到返回空。
GetChild(int index):根據(jù)索引index,返回當前節(jié)點的直接子節(jié)點。
GetSiblingIndex():獲得當前節(jié)點處于其父節(jié)點下的編號索引,即處于兄弟列表中的Index。
SetAsFirstSibling():設(shè)置當前節(jié)點為兄弟節(jié)點列表中的第一個節(jié)點。
SetAsLastSibling():設(shè)置當前節(jié)點為兄弟節(jié)點列表中的最后一個節(jié)點。
SetSiblingIndex(int index):將當前節(jié)點設(shè)置到其兄弟列表中的index位置。
SetParent(Transform parent, bool worldPositionStays):設(shè)置當前節(jié)點的父節(jié)點,如果worldPositionStays設(shè)置為true,則保持其世界坐標下的位置、旋轉(zhuǎn)和縮放。這會相應地修改其局部坐標、旋轉(zhuǎn)和縮放信息。(后續(xù)章節(jié)會涉及到世界和局部坐標的概念)
這里所說的變換,就是指所處的位置、旋轉(zhuǎn)(朝向)、縮放(大?。┑刃畔?。
Unity下的單位是米,比如你新建一個Cube,那么它默認的尺寸是1x1x1的尺寸,那么我們想要設(shè)置這個Cube到需要的尺寸,只要修改它的Trasform下的Scale三維向量參數(shù)即可,它代表了在1x1x1這個基礎(chǔ)上所進行的縮放。
那些從外部導入的三維模型對象,它本身就帶有一個局部的坐標系,和這個三維對象相對此局部坐標系的尺寸和位置。若要修改它的尺寸,則是基于此對象在其導入的局部坐標系中的尺寸和位置為基礎(chǔ),進行相應的縮放。
由于一棵樹代表了很多個層次的存在,每個節(jié)點均有自己的縮放、旋轉(zhuǎn)、位置等信息。而且子節(jié)點的變換狀態(tài)會跟隨父節(jié)點變換狀態(tài)的變化而改變,因此Unity中存在局部坐標和全局坐標的概念。局部坐標是指其相對直接父節(jié)點的變換信息,而全局坐標是指當前節(jié)點疊加了所有父節(jié)點的累積變換之后的狀態(tài)結(jié)果。
接下來詳細了解變換相關(guān)的屬性和方法。
Vector3 localPosition:局部坐標系下的位置
Vector3 position:全局坐標系下的位置
Quaternion localRotation:局部坐標系下的旋轉(zhuǎn)
Quaternion rotation:全局坐標系下的旋轉(zhuǎn)
Vector3 localScale:局部坐標系下的縮放
Vector3 lossyScale:全局坐標系下的縮放
Vector3 localEulerAngles:局部坐標系下的歐拉角
Vector3 eulerAngles 全局坐標系下的歐拉角
Vector3 forward:全局坐標系下的前方矢量
Vector3 up:全局坐標系下的上方矢量
Vector3 right:全局坐標系下的右方矢量
通過以上屬性看出,都每個變換屬性都有局部和全局之分。位置和縮放比較容易理解。不過縮放有兩種表現(xiàn)形式,一種是歐拉角,一種是四元數(shù),實際上四元數(shù)也就是使用歐拉角在進行計算。對于這部分數(shù)學不熟悉的同學不必緊張,我們不需要詳細了解四元數(shù)的原理,只要學會使用即可。后續(xù)的章節(jié)中我們會慢慢熟悉四元數(shù)的一些用法,而對于歐拉角,我們只要簡單知道其概念即可:歐拉角是用相對Z、X、Y軸旋轉(zhuǎn)一定的度數(shù)來表示旋轉(zhuǎn)的一種方法,請記住它是按照先Z、再X、再Y這個順序進行旋轉(zhuǎn)的。
Unity文檔上講到,如果你對于歐拉角不是很熟悉,就不要使用它,四元數(shù)可以滿足你的要求了。而實際上我們對于簡單一些旋轉(zhuǎn)計算,使用歐拉角是更方便的,速度也更快,比如,我們只需要某個物體相對其父節(jié)點圍繞X、Y、Z中的單一軸進行旋轉(zhuǎn),此時文檔相對簡單,我們可以使用歐拉角進行處理,稍微復雜一點的情況,后面的四元數(shù)章節(jié)在做解釋。
另外需要注意幾點:
1、Vector、Quaternion 都是結(jié)構(gòu)體,通過localRotation、position等以上函數(shù)獲取的結(jié)果都是存在一個結(jié)構(gòu)體中的,此時的返回結(jié)果是存在單獨開辟的新內(nèi)存中的,因此對其直接修改不能影響其原有數(shù)值,我們必須以localRotation=Vector這種形式對其賦值,讓其進行函數(shù)內(nèi)進行實際賦值操作。
2、Transform也是一個組件,盡管每個GameObject類中都有transform這個成員,但其內(nèi)部實現(xiàn)依然是getComponent的函數(shù)調(diào)用,而這種函數(shù)調(diào)用是比較耗時的,考慮到頻繁需要對Transform進行操作,因此,我們應該在腳本的初始化過程中獲取一個Transform引用并保留下來,以便后續(xù)調(diào)用而避免頻繁使用到getComponent。這也是上一節(jié)代碼中我們這樣做的目的。
本文為博主原創(chuàng)文章,歡迎轉(zhuǎn)載。請保留博主鏈接http://blog.csdn.net/andrewfan
另外有需要云服務器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。
分享標題:Unity編程標準導引-3.3Transform-創(chuàng)新互聯(lián)
轉(zhuǎn)載來源:http://www.sd-ha.com/article48/ioghp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供電子商務、動態(tài)網(wǎng)站、App開發(fā)、定制網(wǎng)站、搜索引擎優(yōu)化、面包屑導航
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)