分類:Unity、C#、VS2015 ide
建立日期:2016-04-02 學習
預製體(Prefab,也叫預設)是「存儲在工程視圖(Project View)中」的一種特殊的資源,是一種可重複使用的遊戲對象(GameObject)的容器。 測試
若是在Project中有多個預製體(Prefab),爲了容易查找,可將這些預製體所有保存到Project視圖中Assets文件夾的Prefabs子文件夾下。 字體
Prefabs子文件夾下的的全部預製體均可以放入到多個場景中,並且即便在同一個場景中仍然能夠屢次使用。 spa
向場景中添加一個預製體就是建立該預製體的一個實例。另外,因爲場景(Scene)中全部預製體的實例都會自動連接到Project中的原始預製體(Prefab),所以這些實例本質上就是原始預製體的克隆。或者說,不論場景中有多少個預製體實例,只要僅僅對Project中某個Prefab做出任何更改,你就會看到這些更改立刻就能應用於場景中該Prefab的全部實例。 code
一、在工程視圖(Project)中建立預製體(Prefab) orm
要在Project中建立一個預製體(Prefab),只需將你在場景(Scene)中建立的一個遊戲對象 (GameObject)拖放到工程視圖(Project View)中的某個Prefab中。 對象
若是層級視圖(Hierarchy)中的遊戲對象(GameObject)的名稱變成藍色,表示Hierarchy中的該對象是一個已經制做好的預製體的實例。此時,你能夠根據須要,決定是保留層級視圖 (Hierarchy)中的這個實例仍是刪除這個實例,不論你是否保留,都不會影響Project中製做好的原始預製體。 blog
二、在層次視圖(Hierarchy)中建立預製體的實例 遊戲
要在「當前場景中」建立一個「預製體的實例」,直接從工程視圖(Project View)中將某個預製體拖放到場景(Scene)或層級視圖(Hierarchy)中。
Hierarchy視圖中的「藍色」字體表示該對象是某個預製體的實例。
一旦你建立了預製體的實例,該實例就會自動連接到Project中的源預製體,並在層級視圖(Hierarchy)中以「藍色」文字顯示。
在這個截圖中,有3個遊戲對象是藍色,表示這都是預製體的實例。
三、在檢視器(Inspector)中操做預製體
(1)粗體的含義
有時候你可能但願僅更改單個預製體實例的屬性,同時還能保持與源預製體的連接完整,此時可看到該實例對應的變量名稱變成了粗體,表示這個變量已被重寫。注意,全部重寫的屬性都不會受到源預製體更改的影響。
(2)Select
若是你選擇了某個預製體實例,並但願將所作的更改影響到全部實例,此時可直接在檢視器(Inspector)中單擊【Select】按鈕來選擇更改的原始預製體。
(3)Apply
若是但願用重寫的值更新源預製體及其全部實例,可單擊檢視器(Inspector)中的【Apply】 按鈕。注意,這種「應用」不會對「根位置」和「旋轉」起做用,由於這會影響實例的絕對位置並致使全部實例放在同一個位置。可是,Apply會對根的任何子元素或祖先元素的位置和旋轉起做用,由於它們是相對於根的變換來計算的。
(4)Revert
若是想放棄對特定實例的全部重寫,可單擊【(Revert)】按鈕。
四、導入預製體
將網格資源放入Assets文件夾下時,Unity會自動導入文件,並生成一些相似於網格以外的看起來像預製體的東西。可是,這實際上不是預製體(Prefab),它只是資源文件自己使用的東西。
注意,資源(asset)圖標與預設 (Prefab) 圖標略有不一樣。
資源是做爲一個遊戲對象(GameObject)存在於場景中的實例,它連接到源資源而不是連接到預製體(Prefab)。你能夠向該遊戲對象(GameObject) 正常添加、刪除組件,。可是你沒法對資源自己做任何更改,由於這樣會向資源文件自己添加數據!若是你但願建立一些可重複使用的東西,那你就應當把它製做成一個預製體。
選擇一個資源實例時,檢視器 (Inspector) 中的【Apply】按鈕將被替換成【Edit】按鈕。單擊此按鈕將爲資源啓動編輯應用程序(如 Maya 或 Max)。
通過上面的介紹,你應當已經從基本層面上了解了Prefabs的概念:Prefabs本質上是GameObjects(預約義的遊戲對象)和Components(組件)組成的集合體,是可在遊戲中重複使用的容器對象。
使用Prefabs能夠方便地在運行時實例化複雜的GameObjects(遊戲對象)。
一、建立遊戲對象的方式
在Unity中,有兩種建立對象(Game Object)的方式:
(1)方式1:所有用C#代碼實現。這種方式使用C#代碼從頭開始建立並初始化遊戲對象(GameObjects)。
(2)方式2:利用Prefabs實現。即:先製做預製體,運行時再經過代碼實例化預製體。
與方式1相比,方式2(用Prefabs實現)有多個優點:
l 可使用一行代碼實例化Prefab,並具備完整功能。而使用代碼建立等效遊戲對象 (GameObjects),平均須要五行代碼,還有可能須要更多。
l 可在場景 (Scene) 和檢視器 (Inspector) 中快速設置、測試和修改預製體。
l 能夠更改已實例化的預製體,而無需更改實例化預製體的代碼。例如,可將一個簡單的火箭更改爲超級火箭,但無需更改代碼。
二、示例—建立一堵牆
爲了說明Prefabs的強大,讓咱們來看看可用得上Prefabs的一些基本狀況:
(1)在不一樣位置,屢次使用單塊「磚」預製體來建立一堵牆。
(2)發射時,火箭發射器實例化一個飛行的火箭預製體。該預製體是一個包含一個網格(Mesh)、剛體 (Rigidbody)、碰撞器 (Collider) 和帶有本身的拖尾粒子系統 (Particle System) 的子游戲對象 (GameObject)。
(3)機器人爆炸成許多碎片。此時完整的操做機器人已毀壞,替換成一個殘破的機器人預製體。該預製體包含分紅多個部分的機器人,全部部分均設有本身的剛體 (Rigidbodies) 和粒子系統 (Particle Systems)。有了預製體,你僅用一行代碼就能夠將一個對象替換成指定的預製體,從而讓機器人炸成許多碎片。
該示例僅僅是爲了說明「使用Prefab建立對象」與「使用代碼建立對象」相比,前者(使用Prefab建立對象)的優點。
(1)實現方式1
首先演示「使用代碼建立對象」的實現方式,由於只有比較,你才能理解這種方式有什麼缺點。
先在ch03Demos工程的Project視圖的Assets下建立一個名爲Scripts的子文件夾,而後在該子文件夾添加一個名爲Demo1的C#腳本:
雙擊Demo1腳本,Unity就會自動啓動VS2015並自動在VS2015中打開Demo1.cs文件,並且解決方案資源管理器中Assets下的文件夾結構和Unity中的文件夾結構相同:
將Demo1.cs文件改成下面的內容:
using UnityEngine; using System.Collections; public class Demo1 : MonoBehaviour { void Start () { for (int y = 0; y < 5; y++) { for (int x = 0; x < 5; x++) { GameObject cube = GameObject.CreatePrimitive(PrimitiveType.Cube); cube.AddComponent<Rigidbody>(); cube.transform.position = new Vector3(x, y, 0); } } } }
保存該文件。
切換到Unity,選擇主菜單的【GameObject】->【Create Empty】建立一個空遊戲對象,再將Scripts文件夾下的Demo1腳本拖放到剛添加的空遊戲對象中。
切換到Game視圖,單擊【播放】按鈕觀察執行效果。此時將看到徹底用代碼建立的立方體牆(因爲默認使用了重力,牆會自動倒塌):
固然,因爲沒有添加紋理,因此此時看到的僅僅是一堵白色的牆(倒塌後仍是一個一個的立方體)。若想執行附加操做,例如更改磚塊紋理、摩擦力或剛體的質量,還須要再添加其餘的代碼,可見用這種方式實現起來有多麼麻煩。
刪除層次視圖中剛建立的空遊戲對象。
(2)實現方式2
第2種中實現方式是先建立一個「牆」預製體,而後再用「建立預製體實例」的辦法來建立多堵牆。
步驟以下:
選擇主菜單的【GameObject】->【3D Object】->【Cube】建立一個立方體:
此時,剛建立的Cube在層次視圖中處於選中狀態。
將Texture文件夾下的brick_D拖放到層次視圖中的這個立方體上。
在Project視圖的Assets文件夾下,添加一個Prefabs子文件夾:
鼠標右擊Prefabs子文件夾,選擇【Create】->【Prefab】:
將新添加的Prefab的名稱更改成「Brick」。
將在層級視圖中建立的立方體拖放到Project視圖中剛建立的「Brick」上。
這樣就建立好了一個名爲「Brick」的預製體(或預設)。
建立預設 (Prefab) 後,在層次視圖中添加的立方體(Cube)已經用不到了,能夠從層級視圖 (Hierarchy) 選中它,而後按Delete鍵刪除。
從新添加一個空遊戲對象 (GameObject)。
在VS2015解決方案資源管理器項目中的Scripts子文件夾下,添加一個文件名爲Demo2.cs的C#腳本(Demo2.cs),而後將其改成下面的內容:
using UnityEngine; using System.Collections; public class Demo2 : MonoBehaviour { public Transform Brick; void Start () { for (int y = 0; y < 5; y++) { for (int x = 0; x < 5; x++) { Instantiate(Brick, new Vector3(x, y, 0), Quaternion.identity); } } } }
按<F5>鍵將其附加到Unity,而後按<Shift>+<F5>鍵結束。
切換到Unity,將工程視圖下的該腳本拖放到剛纔添加的Cube上,這就爲該對象添加了一個Demo2組件:
另外,此時檢視器 (Inspector) 中將出現一個名爲「Brick」的新變量,這個Transform類型的變量能夠接受任何遊戲對象 (GameObject) 或預製體。
從工程視圖 (Project View) 中,將預製體「Brick」拖放到檢視器 (Inspector)視圖中的Brick變量的值上(做用是:建立預製體的實例做爲Brick變量的值):
按下「播放 (Play)」,就會看到同時使用預製體和C#腳本建立的牆:
可見,這種方式實現的腳本代碼不只很是乾淨,並且可重複使用這個Brick預製體。
剛開始學習時,你可能想知道爲何要這樣作,用第1種方式建立立方體不是更靈活和方便嗎?爲何還要再搞一個Prefab呢?
這是由於使用Prefab,您能夠在數秒以內就能完成對它的調整:
固然,若是僅僅是爲了學習操做步驟,找不到brick_D.jpg文件時,隨便找一副其餘的.jpg圖片代替也行,反正目標就是給這堵用立方體構造的牆貼滿圖,理解其含義就好了。