Unity編程標準導引-3.3 Transform

每一個遊戲對象(GameObject),其存在於遊戲世界,都有一個位置、朝向、大小等基本定位信息;其存於Hierarchy面板,也存在與其餘GameObject的相對關係,如父子關係、兄弟關係。Unity中使用Transform來描述和操做這些屬性。
  Transform的字面理解就是「變換」的意思,全部的GameObject,當其被建立完成以後,均自動建立了這樣一個變換組件,你不須要手動建立這個組件,並且沒法刪除此組件。
接下來,咱們將變換組件的主要屬性和功能一一進行解釋。ide

3.3.一、層次相關的屬性和方法


層次面板函數

  • childCount:表明當前GameObject節點下方有幾個子節點性能

  • hierarchyCount:表明在當前GameObject所處的相互關聯的樹狀結構中,存在的層次數目。
      相互關聯的樹狀結構指的是:以Hierarchy面板中的一個頂層GameObject做爲根節點出發的一棵樹。任何一個GameObject都會存在於一棵樹中。
      能夠預想的是,這個樹狀結構中的任意一個節點的hierarchyCount屬性都是相同的。spa

  • hierarchyCapacity:表明當前所在的樹的層次容量。就是這棵樹最大能夠容納的節點數目,從整個樹中的任意一個節點訪問此屬性,所獲取的層次容量都是相同的。
      這個參數是自動增加的,即當GameObject發生層次變更時,若是當前樹的容量不足,會自動擴容。
      能夠推測出:樹中全部節點所查詢的結果實際來自最頂層節點的屬性,而當層次所發生變更時,Unity內部只須要修改頂層節點的這個屬性便可。
      須要注意的是,當頻繁變化hierarchyCapacity時,是須要帶來額外的內存消耗和性能消耗的,這與List類的內存擴容是一個道理。所以,應該爲頻繁增加的樹的根節點在一開始就設置一個比較大的容量。.net

  • parent:表明當前節點的父節點,返回一個Transform對象。當此parent爲null時,就表明本身已是頂層節點,也即樹狀結構中的根節點了。orm

  • root:得到當前樹狀結構中的根節點。對象

  • DetachChildren():分離子節點,意思就是將當前節點下方的全部直接子節點都分離出去,讓他們成爲根節點。有n個子節點,將產生n棵新的樹。blog

  • Find(string name):根據路徑查找子節點,雖然這裏的參數在文檔上顯示爲name,可是它實際表明一個路徑。它能夠是"magazine/ammo"這種格式,便可以向着葉節點深度方向查詢多個層次,找到目標Transform並返回。若是找不到返回空。索引

  • GetChild(int index):根據索引index,返回當前節點的直接子節點。遊戲

  • GetSiblingIndex():得到當前節點處於其父節點下的編號索引,即處於兄弟列表中的Index。

  • SetAsFirstSibling():設置當前節點爲兄弟節點列表中的第一個節點。

  • SetAsLastSibling():設置當前節點爲兄弟節點列表中的最後一個節點。

  • SetSiblingIndex(int index):將當前節點設置到其兄弟列表中的index位置。

  • SetParent(Transform parent, bool worldPositionStays):設置當前節點的父節點,若是worldPositionStays設置爲true,則保持其世界座標下的位置、旋轉和縮放。這會相應地修改其局部座標、旋轉和縮放信息。(後續章節會涉及到世界和局部座標的概念)

3.3.二、變換相關的屬性和方法

  這裏所說的變換,就是指所處的位置、旋轉(朝向)、縮放(大小)等信息。
  Unity下的單位是米,好比你新建一個Cube,那麼它默認的尺寸是1x1x1的尺寸,那麼咱們想要設置這個Cube到須要的尺寸,只要修改它的Trasform下的Scale三維向量參數便可,它表明了在1x1x1這個基礎上所進行的縮放。
  那些從外部導入的三維模型對象,它自己就帶有一個局部的座標系,和這個三維對象相對此局部座標系的尺寸和位置。若要修改它的尺寸,則是基於此對象在其導入的局部座標系中的尺寸和位置爲基礎,進行相應的縮放。
  因爲一棵樹表明了不少個層次的存在,每一個節點均有本身的縮放、旋轉、位置等信息。並且子節點的變換狀態會跟隨父節點變換狀態的變化而改變,所以Unity中存在局部座標和全局座標的概念。局部座標是指其相對直接父節點的變換信息,而全局座標是指當前節點疊加了全部父節點的累積變換以後的狀態結果。
  接下來詳細瞭解變換相關的屬性和方法。

  • Vector3 localPosition:局部座標系下的位置

  • Vector3 position:全局座標系下的位置

  • Quaternion localRotation:局部座標系下的旋轉

  • Quaternion rotation:全局座標系下的旋轉

  • Vector3 localScale:局部座標系下的縮放

  • Vector3 lossyScale:全局座標系下的縮放

  • Vector3 localEulerAngles:局部座標系下的歐拉角

  • Vector3 eulerAngles 全局座標系下的歐拉角

  • Vector3 forward:全局座標系下的前方矢量

  • Vector3 up:全局座標系下的上方矢量

  • Vector3 right:全局座標系下的右方矢量

經過以上屬性看出,都每一個變換屬性都有局部和全局之分。位置和縮放比較容易理解。不過縮放有兩種表現形式,一種是歐拉角,一種是四元數,實際上四元數也就是使用歐拉角在進行計算。對於這部分數學不熟悉的同窗沒必要緊張,咱們不須要詳細瞭解四元數的原理,只要學會使用便可。後續的章節中咱們會慢慢熟悉四元數的一些用法,而對於歐拉角,咱們只要簡單知道其概念便可:歐拉角是用相對Z、X、Y軸旋轉必定的度數來表示旋轉的一種方法,請記住它是按照先Z、再X、再Y這個順序進行旋轉的。
  Unity文檔上講到,若是你對於歐拉角不是很熟悉,就不要使用它,四元數能夠知足你的要求了。而實際上咱們對於簡單一些旋轉計算,使用歐拉角是更方便的,速度也更快,好比,咱們只須要某個物體相對其父節點圍繞X、Y、Z中的單一軸進行旋轉,此時文檔相對簡單,咱們可使用歐拉角進行處理,稍微複雜一點的狀況,後面的四元數章節在作解釋。
  另外須要注意幾點:
  一、Vector、Quaternion 都是結構體,經過localRotation、position等以上函數獲取的結果都是存在一個結構體中的,此時的返回結果是存在單獨開闢的新內存中的,所以對其直接修改不能影響其原有數值,咱們必須以localRotation=Vector這種形式對其賦值,讓其進行函數內進行實際賦值操做。
  2、Transform也是一個組件,儘管每一個GameObject類中都有transform這個成員,但其內部實現依然是getComponent的函數調用,而這種函數調用是比較耗時的,考慮到頻繁須要對Transform進行操做,所以,咱們應該在腳本的初始化過程當中獲取一個Transform引用並保留下來,以便後續調用而避免頻繁使用到getComponent。這也是上一節代碼中咱們這樣作的目的。

本文爲博主原創文章,歡迎轉載。請保留博主連接http://blog.csdn.net/andrewfan

相關文章
相關標籤/搜索