分類:Unity、C#、VS2015
創建日期:2016-03-29
一、簡介
層級視圖 (Hierarchy) 包含當前場景中的每個游戲對象 (GameObject)。有些是三維模型等資源文件的直接實例,其余是預設(Prefabs)實例,自定義對象構成游戲的絕大部分。可在層級視圖(Hierarchy)中選擇對象並將一個對象拖到另一個對象內,以應用父子化(Parenting)。在場景中添加和刪除對象后,還將在層級視圖 (Hierarchy) 中顯示或消失。
二、游戲對象(GameObjects)
游戲對象 (GameObjects) 是 Unity 中最重要的對象。了解什么是游戲對象 (GameObject) 及如何使用至關重要。
1、什么是游戲對象 (GameObjects)?
游戲中的每個對象都是一個游戲對象 (GameObject)。然而,游戲對象 (GameObjects) 本身不做任何事情。它們需要特殊屬性 (special properties) 才能成為一個角色、一種環境或者一種特殊效果。但是每個對象要做很多不同的事情。
如果每個對象都是一個游戲對象 (GameObject),我們該如何區分靜態空間 (static room) 中的交互式啟動對象 (interactive power-up object) 呢?是什么使得這些游戲對象 (GameObjects) 互不相同?
答案是:游戲對象 (GameObjects) 是一種容器。它們是空盒,能夠容納組成一個光照貼圖的島嶼或物理驅動的小車的不同部分。因此,要真正理解游戲對象 (GameObjects),就必須了解這些組成部分(稱為“組件 (Components)”)。根據您要創建的對象類型,您可以添加不同的組件 (Components) 組合到游戲對象 (GameObject) 中。想象一個游戲對象 (GameObject) 是一口空烹飪鍋,組件 (Components) 是不同的作料,它們構成了您的游戲食譜。您也可以使用腳本 (Scripts) 制作自己的組件 (Components)。
(1)游戲對象 (GameObject) 和組件 (Component) 的關系
如之前在游戲對象 (GameObjects) 中所述,游戲對象包含組件 (Components)。
下面通過游戲對象 (GameObject) 及其最常見的組件 (Component) - 變換組件 (Transform Component) 來探討這種關系。
打開任意 Unity 場景,然后為其創建一個新的空游戲對象 (GameObject),選擇該游戲對象並在檢視器 (Inspector) 中查看它的屬性。
注意,即使是一個空的游戲對象 (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)。

以主相機游戲對象 (Main Camera GameObject) 為例,你可以看到,它包含了組件 (Components) 的不同集合。具體來說,包含一個相機組件 (Camera Component)、一個GUI層(GUI Layer)、一個光暈層(Flare Layer)和一個音頻偵聽器 (Audio Listener)。所有這些組件為游戲對象 (GameObject) 提供了各種功能。如果沒有這些組件,就無法為玩家渲染出任何游戲圖形!
剛體、碰撞組件、粒子和音頻都是不同的組件 (Components)(或其組合),都可以添加到任何特定的游戲對象 (GameObject) 中。
3、父子化 (Parenting)
Unity 采用父子化 (Parenting) 這一概念。使任何游戲對象 (GameObject) 成為另一對象的子對象,將欲移動的子對象拖到層級視圖 (Hierarchy) 的父對象中。子對象會繼承父對象的移動和旋轉路徑。可根據需要點擊父對象的折疊箭頭,顯示或隱藏子對象。
4、停用游戲對象 (GameObjects)
可利用游戲對象 (GameObject) 的激活復選框將一個游戲對象 (GameObject) 標記為“不活動”,以便暫時將其從場景中刪除。使用腳本中的 activeSelf 屬性或檢視器中的激活復選框可實現該目的:

(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);
}
}
三、使用組件 (Components)
在游戲中,組件 (Components) 就是對象和行為的螺栓與螺母,它們是每個游戲對象 (GameObject) 的功能零件。如果您還不了解組件 (Components) 與游戲對象 (GameObjects) 之間的關系,請在進一步學習之前先閱讀游戲對象 (GameObjects)的介紹。
1、組件 (Component) 和腳本 (Script) 的關系
創建腳本並將其連接到游戲對象 (GameObject) 時,腳本會出現在游戲對象 (GameObject) 的檢視器 (Inspector) 中,它看起來就像一個組件 (Component)。這是因為腳本在保存時實際上就是變成了組件 (Components) - 但腳本只是一種特定類型的組件 (Component)。在技術層面上,腳本會編譯為某種類型的組件 (Component),Unity 引擎會將其像其他組件一樣對待。因此,腳本實際上就是你自己創建的一個組件 (Component),是在檢視器 (Inspector) 中列出的一個元素,它會執行你寫出的任何功能。
2、添加組件 (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) 碰撞和相互作用。
3、編輯組件 (Components)
組件 (Components) 的一個重要方面是靈活性。將一個組件 (Component) 連接到游戲對象 (GameObject) 時,該組件 (Component) 有不同的值或屬性 (Properties),這些值或屬性在構建游戲時可以在編輯器里調整,或者在運行游戲時由腳本來調整。
有兩種主要類型的屬性(Properties):值(Values) 和引用(References)。
觀察如下截圖,它是一個具有音頻源(Audio Source)組件 (Component) 的空游戲對象 (GameObject)。檢視器中音頻源(Audio Source)的所有值均為默認值。
該組件 (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) 屬性都是切換、數值、下拉字段,不過值屬性也可以是文本字符串、顏色、曲線和其他類型。
4、復制和粘貼組件 (Component) 設置
組件 (Component) 的上下文菜單包含一些用於復制和粘貼其設置的項目。
使用“粘貼組件值(Paste Component Values)”菜單項,可將復制值粘貼到現有組件。或者可以使用“將組件粘貼為新組件(Paste Component As New)”,創建具有這些值的新組件 (Component)。
5、測試屬性 (Properties)
當游戲處於播放模式時,可以在任何游戲對象 (GameObject) 的檢視器 (Inspector) 中隨意更改屬性。例如,你可能想測試不同高度的跳躍。如果在腳本中創建一個跳躍高度屬性,則可以進入播放模式更改該值,然后按下跳躍按鈕看看發生了什么。然后再次更改該值,並在接下來的幾秒看看結果。
一旦退出播放模式,屬性將恢復到播放模式前的數值,這樣就不會丟失任何工作。
6、更改組件 (Components) 的順序
在大多數情況下,檢視器 (Inspector) 中所列組件的順序無關緊要。然而,有一些組件 (Components) 的順序非常重要,例如圖像效果。上下文菜單具有上移 (Move Up) 和下移 (Move Down) 命令,以便你根據需要重新排序組件 (Components)。

7、刪除組件 (Components)
如要刪除一個組件 (Component),在檢視器 (Inspector) 中選擇或右擊其標題,然后選擇“刪除組件(Remove Component)”。或者左擊組件 (Component) 標題旁邊的選項圖標。