【Unity】2.4 層次視圖(Hierarchy)

分類:Unity、C#、VS2015 瀏覽器

建立日期:2016-03-29 編輯器

1、簡介

層級視圖 (Hierarchy) 包含當前場景中的每一個遊戲對象 (GameObject)。有些是三維模型等資源文件的直接實例,其他是預設(Prefabs)實例,自定義對象構成遊戲的絕大部分。可在層級視圖(Hierarchy)中選擇對象並將一個對象拖到另外一個對象內,以應用父子化(Parenting)。在場景中添加和刪除對象後,還將在層級視圖 (Hierarchy) 中顯示或消失。 ide

2、遊戲對象(GameObjects)

遊戲對象 (GameObjects) 是 Unity 中最重要的對象。瞭解什麼是遊戲對象 (GameObject) 及如何使用相當重要。 學習

一、什麼是遊戲對象 (GameObjects)? 測試

遊戲中的每一個對象都是一個遊戲對象 (GameObject)。然而,遊戲對象 (GameObjects) 自己不作任何事情。它們須要特殊屬性 (special properties) 才能成爲一個角色、一種環境或者一種特殊效果。可是每一個對象要作不少不一樣的事情。 3d

若是每一個對象都是一個遊戲對象 (GameObject),咱們該如何區分靜態空間 (static room) 中的交互式啓動對象 (interactive power-up object) 呢?是什麼使得這些遊戲對象 (GameObjects) 互不相同? orm

答案是:遊戲對象 (GameObjects) 是一種容器。它們是空盒,可以容納組成一個光照貼圖的島嶼或物理驅動的小車的不一樣部分。所以,要真正理解遊戲對象 (GameObjects),就必須瞭解這些組成部分(稱爲「組件 (Components)」)。根據您要建立的對象類型,您能夠添加不一樣的組件 (Components) 組合到遊戲對象 (GameObject) 中。想象一個遊戲對象 (GameObject) 是一口空烹飪鍋,組件 (Components) 是不一樣的做料,它們構成了您的遊戲食譜。您也可使用腳本 (Scripts) 製做本身的組件 (Components)。 對象

(1)遊戲對象 (GameObject) 和組件 (Component) 的關係 blog

如以前在遊戲對象 (GameObjects) 中所述,遊戲對象包含組件 (Components)。 排序

下面經過遊戲對象 (GameObject) 及其最多見的組件 (Component) - 變換組件 (Transform Component) 來探討這種關係。

打開任意 Unity 場景,而後爲其建立一個新的空遊戲對象 (GameObject),選擇該遊戲對象並在檢視器 (Inspector) 中查看它的屬性。

image

注意,即便是一個空的遊戲對象 (GameObject),它仍然會包含一個名稱(Name)、一個標籤(Tag)和一個層(Layer)。另外,每一個遊戲對象(GameObject)還包含一個變換組件(Transform Component)。

(2)變換組件 (Transform Component)

記住:在Unity中建立一個沒有變換組件(Transform Component) 的遊戲對象是不可能的。

變換組件(Transform Component) 是最重要的組件(Components) 之一,由於全部遊戲對象 (GameObject) 的變換 (Transform) 屬性均由此組件啓用。在遊戲世界/場景視圖 (Scene View) 中,它定義了遊戲對象 (GameObject) 的位置、旋轉和縮放。若是一個遊戲對象 (GameObject) 沒有變換組件 (Transform Component),它只是計算機內存中的一些信息,實際上並不存在於場景世界。

變換組件 (Transform Component)還會啓用稱爲「父子化 (Parenting)」的概念,它是應用遊戲對象(GameObjects) 的關鍵,可經過 Unity 編輯器 (Unity Editor) 使用它。

(3)其餘組件 (Components)

變換組件 (Transform Component) 是全部遊戲對象 (GameObjects) 的關鍵組件,因此每一個遊戲對象 (GameObject) 都有一個。除此以外,遊戲對象還能夠包含其餘組件 (Components)。

image

以主相機遊戲對象 (Main Camera GameObject) 爲例,你能夠看到,它包含了組件 (Components) 的不一樣集合。具體來講,包含一個相機組件 (Camera Component)、一個GUI層(GUI Layer)、一個光暈層(Flare Layer)和一個音頻偵聽器 (Audio Listener)。全部這些組件爲遊戲對象 (GameObject) 提供了各類功能。若是沒有這些組件,就沒法爲玩家渲染出任何遊戲圖形!

剛體、碰撞組件、粒子和音頻都是不一樣的組件 (Components)(或其組合),均可以添加到任何特定的遊戲對象 (GameObject) 中。

三、父子化 (Parenting)

Unity 採用父子化 (Parenting) 這一律念。使任何遊戲對象 (GameObject) 成爲另外一對象的子對象,將欲移動的子對象拖到層級視圖 (Hierarchy) 的父對象中。子對象會繼承父對象的移動和旋轉路徑。可根據須要點擊父對象的摺疊箭頭,顯示或隱藏子對象。

四、停用遊戲對象 (GameObjects)

可利用遊戲對象 (GameObject) 的激活複選框將一個遊戲對象 (GameObject) 標記爲「不活動」,以便暫時將其從場景中刪除。使用腳本中的 activeSelf 屬性或檢視器中的激活複選框可實現該目的:

image

(1)停用父遊戲對象 (GameObject) 的影響

停用父對象時,停用也將覆蓋全部其子對象上的 activeSelf 設置,所以,父級如下的整個層次結構都處於不活動狀態。注意,這不會更改子對象上 activeSelf 屬性的值,因此在父對象從新激活時,子對象會恢復到原始狀態。這意味着,經過子對象的 activeSelf 屬性沒法肯定其在場景中當前是否處於活動狀態。所以,你應當使用 activeInHierarchy 屬性,該屬性會將父對象的覆蓋效果考慮在內。

(2)不要使用SetActiveRecursively

早期版本中有一個稱爲 SetActiveRecursively 的功能,可用於激活或停用給定父對象的子對象。爲避免破壞舊代碼,雖然保留了低版本API中的SetActiveRecursively,但不建議使用,未來還可能會將其刪除。

在特殊狀況下,好比你想更改子對象的 activeSelf 設置,能夠用如下C#代碼來實現:

void DeactivateChildren(GameObject g, bool a)

{

g.activeSelf = a;

foreach (Transform child in g.transform)

{

DeactivateChildren(child.gameObject, a);

}

}

3、使用組件 (Components)

在遊戲中,組件 (Components) 就是對象和行爲的螺栓與螺母,它們是每一個遊戲對象 (GameObject) 的功能零件。若是您還不瞭解組件 (Components) 與遊戲對象 (GameObjects) 之間的關係,請在進一步學習以前先閱讀遊戲對象 (GameObjects)的介紹。

一、組件 (Component) 和腳本 (Script) 的關係

建立腳本並將其鏈接到遊戲對象 (GameObject) 時,腳本會出如今遊戲對象 (GameObject) 的檢視器 (Inspector) 中,它看起來就像一個組件 (Component)。這是由於腳本在保存時實際上就是變成了組件 (Components) - 但腳本只是一種特定類型的組件 (Component)。在技術層面上,腳本會編譯爲某種類型的組件 (Component),Unity 引擎會將其像其餘組件同樣對待。所以,腳本實際上就是你本身建立的一個組件 (Component),是在檢視器 (Inspector) 中列出的一個元素,它會執行你寫出的任何功能。

二、添加組件 (Components)

你能夠經過組件 (Components) 菜單向所選遊戲對象 (GameObject) 添加組件 (Components)。

例如,爲新建的空遊戲對象 (GameObject) 添加一個剛體 (Rigidbody)的步驟是:選中該遊戲對象,而後從菜單選擇「組件 (Component)->物理 (Physics)->剛體 (Rigidbody)」。當你操做時,你會看到剛體 (Rigidbody) 屬性出如今檢視器 (Inspector) 中。

若是在空遊戲對象 (GameObject) 仍被選中時按「播放 (Play)」,你可能還會獲得一個小驚喜。試一試,注意觀察剛體 (Rigidbody) 是如何將功能添加到空遊戲對象 (GameObject) 的。(遊戲對象 (GameObject) 的 Y 座標值開始減少,這是由於 Unity 的物理引擎致使遊戲對象 (GameObject) 在重力的做用下下落。

另外一種選擇是使用組件瀏覽器 (Component Browser),使用對象檢視器中的「添加組件(Add Component)」按鈕可激活該瀏覽器。

該瀏覽器可以讓您按類別方便地導航組件,還具備搜索框,您能夠用此框按名稱定位組件。

您能夠將任意數量或組合的組件 (Components) 添加到單一的遊戲對象 (GameObject)。有些組件 (Components) 與其它組件結合起來可發揮最佳做用。例如,剛體 (Rigidbody) 可與任何碰撞組件結合使用。剛體 (Rigidbody) 經過 NVIDIA PhysX 物理引擎來控制變換 (Transform),碰撞組件 (Collider) 則容許剛體 (Rigidbody) 與其餘碰撞組件 (Colliders) 碰撞和相互做用。

三、編輯組件 (Components)

組件 (Components) 的一個重要方面是靈活性。將一個組件 (Component) 鏈接到遊戲對象 (GameObject) 時,該組件 (Component) 有不一樣的值或屬性 (Properties),這些值或屬性在構建遊戲時能夠在編輯器裏調整,或者在運行遊戲時由腳原本調整。

有兩種主要類型的屬性(Properties):值(Values) 和引用(References)。

觀察以下截圖,它是一個具備音頻源(Audio Source)組件 (Component) 的空遊戲對象 (GameObject)。檢視器中音頻源(Audio Source)的全部值均爲默認值。

image   image

該組件 (Component) 包含一個引用 (Reference) 屬性和七個值 (Value) 屬性。音頻剪輯(Audio Clip)是引用 (Reference) 屬性。音頻源 (Audio Source) 開始播放時,它將嘗試播放音頻剪輯(Audio Clip)屬性中引用的音頻文件。若是沒有引用,則將出現錯誤,由於沒有可播放的音頻。

要在檢視視圖 (Inspector) 中引用文件很是簡單,只需從工程視圖(Project)中將音頻文件拖到引用屬性 (Reference Property) 上便可,或者使用對象選擇器 (Object Selector) 來完成。

組件 (Components) 能夠將引用屬性包含到任何其餘類型的組件 (Component)、遊戲對象 (GameObjects) 或資源 (Assets)。

音頻剪輯 (Audio Clip) 上的其他屬性都是值 (Value) 屬性,這些屬性能夠直接在檢視器 (Inspector) 中調整。音頻剪輯 (Audio Clip) 上的值 (Value) 屬性都是切換、數值、下拉字段,不過值屬性也能夠是文本字符串、顏色、曲線和其餘類型。

四、複製和粘貼組件 (Component) 設置

組件 (Component) 的上下文菜單包含一些用於複製和粘貼其設置的項目。

image

使用「粘貼組件值(Paste Component Values)」菜單項,可將複製值粘貼到現有組件。或者可使用「將組件粘貼爲新組件(Paste Component As New)」,建立具備這些值的新組件 (Component)。

五、測試屬性 (Properties)

當遊戲處於播放模式時,能夠在任何遊戲對象 (GameObject) 的檢視器 (Inspector) 中隨意更改屬性。例如,你可能想測試不一樣高度的跳躍。若是在腳本中建立一個跳躍高度屬性,則能夠進入播放模式更改該值,而後按下跳躍按鈕看看發生了什麼。而後再次更改該值,並在接下來的幾秒看看結果。

一旦退出播放模式,屬性將恢復到播放模式前的數值,這樣就不會丟失任何工做。

六、更改組件 (Components) 的順序

在大多數狀況下,檢視器 (Inspector) 中所列組件的順序可有可無。然而,有一些組件 (Components) 的順序很是重要,例如圖像效果。上下文菜單具備上移 (Move Up) 和下移 (Move Down) 命令,以便你根據須要從新排序組件 (Components)。

image

七、刪除組件 (Components)

如要刪除一個組件 (Component),在檢視器 (Inspector) 中選擇或右擊其標題,而後選擇「刪除組件(Remove Component)」。或者左擊組件 (Component) 標題旁邊的選項圖標。

相關文章
相關標籤/搜索