Unity3D中Prefab


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就可以。

       當選擇了一個資源的實例。Inspector視圖中的Applybutton將被替換為一個Editbutton,點擊該button將為資源啟動編輯程序。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM