Prefab概念:
Prefab是一種資源類型——存儲在項目視圖中的一種可反復使用的游戲對象。因而當游戲中須要非常多反復使用的對象、資源等時,Prefab就有了用武之地。它擁有下面特點:
? 能夠放到多個場景中。也能夠在同一個場景中放置多次
? 當加入一個Prefab到場景中,就創建了它的一個實例
? 全部的Prefab實例鏈接到原始Prefab,本質上是原始Prefab的克隆。
? 不論項目中存在多少實例。僅僅要對Prefab進行了改動。全部Prefab實例都將隨之發生變化。
創建填充Prefab
為了創建一個Prefab。必須使用菜單構造一個新的空白Prefab。不包括游戲對象,因而不能創建它的一個實例。
此時這個新的Prefab像一個空的container,想要使用它。必須用游戲對象的數據來填充它,讓它不空。創建方法為Project視圖中Create-》Prefab(或導航菜單條Assets-》Create-》Prefab),此時能夠看到Project視圖多了個灰色的小立方體,它就是創建的Prefab。
填充Prefab非常easy。僅僅須要在Hierarchy視圖中選擇要成為Prefab的游戲對象,然后拖動該對象到剛才創建的Prefab上就可以。此時能夠看見灰色的小立方體變成藍色了。此時。游戲對象和其全部子對象就已經拷貝到了Prefab的數據中,該Prefab能夠在多個實例中反復使用。而Hierarchy視圖中的原始游戲對象已經成為了該Prefab的一個實例。
假設選擇了一個Prefab實例,并希望做能夠影響全部實例的變化,點擊Inspector中的Selectbutton選擇源Prefab。
腳本實例化Prefab(執行時實例化Prefab)
在執行時,通過Prefab實例化復雜的游戲物體是非常方便的。實例化Prefab的替代方法就是從一開始就使用代碼來創建游戲物體。而實例化Prefab比替代方法有非常多優勢:
○ 能夠用一行代碼來實例化一個具有所有同樣功能的Prefab。而用代碼創建等效的游戲對象卻要花費平均5行代碼但可能很多其它。
○ 能夠非常easy地在Scene和Inspector視圖中高速建立、測試和改動Prefab。
○ 能夠改動實例化的Prefab卻不須要改變實例化它的代碼。
比如,一個簡單的火箭可被改動為超級火箭,卻不須要改動不論什么代碼。
Unity中Object類含有兩個實例化函數:
[c#]static Object Instantiate(Object original, Vector3 position, Quaternion rotation);
static Object Instantiate(Object original);
[javascript]static function Instantiate(original: Object, position: Vector3, rotation: Quaternion): Object;
static function Instantiate(original: Object): Object;
實例化函數跟編輯器中的Duplicate命令相似。
克隆游戲對象能夠有選擇性地指定位置和旋轉,默覺得Vector3.zero和Quaternion.identity。假如克隆了一個組件那么附加的游戲對象也會被克隆;當克隆游戲對象或組件,全部的孩子對象和組件都會被克隆,它們的屬性集跟源對象一樣;可是克隆的新對象的父母卻是null。當然想設置的話能夠顯示指定;克隆時游戲對象的狀態也會被克隆,因而假設源對象是inactive的話克隆出來的對象狀態也是inactive的。
能夠看看利用instantiate實例化Prefab的樣例:Instantiate應用的4個典型小樣例。
Prefab的繼承
繼承是指任何時候當源Prefab發生變化時,這些變化將應用于全部已鏈接到該Prefab的游戲對象。比如,假設加入一個新的腳本到該Prefab。全部已鏈接到該Prefab的游戲對象都將立馬包括該腳本。
可是,改變一個單獨實例的屬性并同一時候保持鏈接完整是可能。
改變一個Prefab實例的任何屬性,能夠觀察到屬性變量名字變為粗體,如今該變量能夠被重寫,全部的重寫屬性不會受源Prefab變化的影響,這樣就能夠在保持Prefab鏈接不變的前提下,改動Prefab實例使它們變得獨一無二。
假設想用新的重寫屬性值覆蓋源Prefab和全部實例,能夠在Inspector中點擊Applybutton。
注意,源的位置和旋轉將不被應用。由于那樣會影響到實例的絕對位置并把全部實例放在同一位置。可是從不論什么子或根的祖先的位置和旋轉將被應用。由于他們是相對于根的Transform來計算的;假設想放棄對特定實例的全部覆蓋更新。能夠點擊Revertbutton。
破壞與恢復Prefab鏈接
某些行為能夠打破源Prefab和單個Prefab實例之間的鏈接,可是鏈接總是會被修復的。能夠打破鏈接的行為有:
○ 加入或刪除一個組件
○ 加入或刪除一個子對象
這些行為將給出鏈接打破的警告/確認消息。假設確認這種行為將會破壞鏈接 。
若要修復該鏈接,能夠在Prefab實例的Inspector視圖中點擊Reconnect或Applybutton。Reconnect將會丟棄與源Prefab的全部區別,而Apply將會將全部的區別拷貝到源Prefab中,因此全部其它的Prefab實例都會受到影響。
導入的Prefab
當放置一個網格資源到資源目錄時,Unity會自己主動導入文件并生成一些類似于Prefab的網格。而實際上并非網格。僅僅是資源文件本身。
在進行正常預置工作時,資源的實例化名沒有某些限制。
資源是作為一個游戲對象在場景中被實例化的,被鏈接到源資源卻不是一個Prefab。資源作為正常的游戲對象,能夠加入和刪除組件。然而,不能對這個資源本身做不論什么變動,由于這將給資源文件本身加入數據。假設要創建一些須要反復使用的東西。應該將資源實例制成一個Prefab,步驟同創建Prefab,僅僅只是是拖拽資源文件到新建的Prefab就可以。
-
資源
+關注
關注
0文章
59瀏覽量
17828
發布評論請先 登錄
相關推薦
評論