Prefab概念:
Prefab是一種資源類型——存儲在項目視圖中的一種可反復(fù)使用的游戲?qū)ο蟆R蚨斢螒蛑许氁浅6喾磸?fù)使用的對象、資源等時,Prefab就有了用武之地。它擁有下面特點:
? 能夠放到多個場景中。也能夠在同一個場景中放置多次
? 當加入一個Prefab到場景中,就創(chuàng)建了它的一個實例
? 全部的Prefab實例鏈接到原始Prefab,本質(zhì)上是原始Prefab的克隆。
? 不論項目中存在多少實例。僅僅要對Prefab進行了改動。全部Prefab實例都將隨之發(fā)生變化。
創(chuàng)建填充Prefab
為了創(chuàng)建一個Prefab。必須使用菜單構(gòu)造一個新的空白Prefab。不包括游戲?qū)ο螅蚨荒軇?chuàng)建它的一個實例。
此時這個新的Prefab像一個空的container,想要使用它。必須用游戲?qū)ο蟮臄?shù)據(jù)來填充它,讓它不空。創(chuàng)建方法為Project視圖中Create-》Prefab(或?qū)Ш讲藛螚lAssets-》Create-》Prefab),此時能夠看到Project視圖多了個灰色的小立方體,它就是創(chuàng)建的Prefab。
填充Prefab非常easy。僅僅須要在Hierarchy視圖中選擇要成為Prefab的游戲?qū)ο螅缓笸蟿釉搶ο蟮絼偛艅?chuàng)建的Prefab上就可以。此時能夠看見灰色的小立方體變成藍色了。此時。游戲?qū)ο蠛推淙孔訉ο缶鸵呀?jīng)拷貝到了Prefab的數(shù)據(jù)中,該Prefab能夠在多個實例中反復(fù)使用。而Hierarchy視圖中的原始游戲?qū)ο笠呀?jīng)成為了該Prefab的一個實例。
假設(shè)選擇了一個Prefab實例,并希望做能夠影響全部實例的變化,點擊Inspector中的Selectbutton選擇源Prefab。
腳本實例化Prefab(執(zhí)行時實例化Prefab)
在執(zhí)行時,通過Prefab實例化復(fù)雜的游戲物體是非常方便的。實例化Prefab的替代方法就是從一開始就使用代碼來創(chuàng)建游戲物體。而實例化Prefab比替代方法有非常多優(yōu)勢:
○ 能夠用一行代碼來實例化一個具有所有同樣功能的Prefab。而用代碼創(chuàng)建等效的游戲?qū)ο髤s要花費平均5行代碼但可能很多其它。
○ 能夠非常easy地在Scene和Inspector視圖中高速建立、測試和改動Prefab。
○ 能夠改動實例化的Prefab卻不須要改變實例化它的代碼。
比如,一個簡單的火箭可被改動為超級火箭,卻不須要改動不論什么代碼。
Unity中Object類含有兩個實例化函數(shù):
[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;
實例化函數(shù)跟編輯器中的Duplicate命令相似。
克隆游戲?qū)ο竽軌蛴羞x擇性地指定位置和旋轉(zhuǎn),默覺得Vector3.zero和Quaternion.identity。假如克隆了一個組件那么附加的游戲?qū)ο笠矔豢寺。划斂寺∮螒驅(qū)ο蠡蚪M件,全部的孩子對象和組件都會被克隆,它們的屬性集跟源對象一樣;可是克隆的新對象的父母卻是null。當然想設(shè)置的話能夠顯示指定;克隆時游戲?qū)ο蟮臓顟B(tài)也會被克隆,因而假設(shè)源對象是inactive的話克隆出來的對象狀態(tài)也是inactive的。
能夠看看利用instantiate實例化Prefab的樣例:Instantiate應(yīng)用的4個典型小樣例。
Prefab的繼承
繼承是指任何時候當源Prefab發(fā)生變化時,這些變化將應(yīng)用于全部已鏈接到該Prefab的游戲?qū)ο蟆1热纾僭O(shè)加入一個新的腳本到該Prefab。全部已鏈接到該Prefab的游戲?qū)ο蠖紝⒘ⅠR包括該腳本。
可是,改變一個單獨實例的屬性并同一時候保持鏈接完整是可能。
改變一個Prefab實例的任何屬性,能夠觀察到屬性變量名字變?yōu)榇煮w,如今該變量能夠被重寫,全部的重寫屬性不會受源Prefab變化的影響,這樣就能夠在保持Prefab鏈接不變的前提下,改動Prefab實例使它們變得獨一無二。
假設(shè)想用新的重寫屬性值覆蓋源Prefab和全部實例,能夠在Inspector中點擊Applybutton。
注意,源的位置和旋轉(zhuǎn)將不被應(yīng)用。由于那樣會影響到實例的絕對位置并把全部實例放在同一位置。可是從不論什么子或根的祖先的位置和旋轉(zhuǎn)將被應(yīng)用。由于他們是相對于根的Transform來計算的;假設(shè)想放棄對特定實例的全部覆蓋更新。能夠點擊Revertbutton。
破壞與恢復(fù)Prefab鏈接
某些行為能夠打破源Prefab和單個Prefab實例之間的鏈接,可是鏈接總是會被修復(fù)的。能夠打破鏈接的行為有:
○ 加入或刪除一個組件
○ 加入或刪除一個子對象
這些行為將給出鏈接打破的警告/確認消息。假設(shè)確認這種行為將會破壞鏈接 。
若要修復(fù)該鏈接,能夠在Prefab實例的Inspector視圖中點擊Reconnect或Applybutton。Reconnect將會丟棄與源Prefab的全部區(qū)別,而Apply將會將全部的區(qū)別拷貝到源Prefab中,因此全部其它的Prefab實例都會受到影響。
導(dǎo)入的Prefab
當放置一個網(wǎng)格資源到資源目錄時,Unity會自己主動導(dǎo)入文件并生成一些類似于Prefab的網(wǎng)格。而實際上并非網(wǎng)格。僅僅是資源文件本身。
在進行正常預(yù)置工作時,資源的實例化名沒有某些限制。
資源是作為一個游戲?qū)ο笤趫鼍爸斜粚嵗模绘溄拥皆促Y源卻不是一個Prefab。資源作為正常的游戲?qū)ο螅軌蚣尤牒蛣h除組件。然而,不能對這個資源本身做不論什么變動,由于這將給資源文件本身加入數(shù)據(jù)。假設(shè)要創(chuàng)建一些須要反復(fù)使用的東西。應(yīng)該將資源實例制成一個Prefab,步驟同創(chuàng)建Prefab,僅僅只是是拖拽資源文件到新建的Prefab就可以。
-
資源
+關(guān)注
關(guān)注
0文章
59瀏覽量
17805
發(fā)布評論請先 登錄
相關(guān)推薦
評論