unity3d裏面prefab、assetbundle、unitypackage等包的使用

    prefab:預置是一種資源類型——存儲在項目視圖中的一種可重複使用的遊戲對象。預置可以多次放入到多個場景中。當你添加一個預置到場景中,就創建了它的一個實例。所有的預置實例鏈接到原始預置,基本上是它的克隆。不管你的項目存在多少實例,當你對預置進行任何更改,你將看到這些更改將應用於所有實例。

    當預置源發生變化,這些變化將應用於所有已鏈接的遊戲對象。例如,如果添加一個新的腳本到預置,所有已鏈接的遊戲對象都將立刻包含該腳本。但是,它有可能改變一個單獨實例的屬性,同時保持鏈接。改變任何一個預置實例的屬性,可以看到變量名稱變爲粗體,現在該變量可以被重寫,所有的重寫屬性不會影響預置源的變化。這使你可以修改預置實例使它們變得獨一無二,而不破壞它們與預置源之間的鏈接。

    我的理解是,prefab保存了Object及其子Object的屬性,但是不包含紋理、材質、腳本,而只是記錄了使用的這些資源的guid。所以如果想要和別的開發人員共享prefab,則必須將工程中用到的這些資源上傳到svn上,或者將資源、.meta一起copy過去。

    

    assetbundle:是 Unity 編輯器在編輯環境中(edit-time)創建的一些列的文件,這些文件可以被用在項目的運行環境中(run-time)。 AssetBundles 可以包括的資源文件有模型文件(models)、材質(materials)、紋理(textures)和場景(scenes)。AssetBundles 不能包含腳本文件。具體來說,一個 AssetBundle 就是把一系列的資源文件或者場景文件以某種方式緊密保存的一個文件。這個 AssetBundle 文件可以被單獨加載到可執行的應用程序中。AssetBundles 可以由被 Unity 構建的遊戲或者應用按需加載使用。這允許對像模型、紋理、音頻、甚至是整個的遊戲場景這樣的資源進行流式加載和異步加載。AssetBundles 可以預緩存(pre-cached)和存儲在本地,這樣在運行時就可以立即加載它們。但是 AssetBundles 技術的主要的目的是在需要的時候能夠從遠端的服務器上按需請求特定的資源,並加載到遊戲中。AssetBundles 可以包含 Unity 可以識別的任何類型的資源,包括自定義的二進制數據。唯一的例外是,腳本資源是不被允許的。

    一個項目中肯定不止一個AssetBundle包,而每個AB包可能不止一個asset。而如何取組織資源文件,也就是把哪些資源打包到一起,哪些分開是值得商議的。每一個 AssetBundle 都有一些技術開銷。AssetBundles 是一些封裝資源的文件。這種封裝會增大了 AssetBundle 的整體大小,儘管這種大小的增加不會太明顯,而且是可測量的。當組織 AssetBundles 時,是更多的小的 AssetBundles 還是更少的大的 AssetBundles 呢?這是需要我們根據自己的項目的實際情況來好好權衡的。更多的小的 AssetBundles 會面臨更多的跟蹤和創建相關的開銷,太少的 AssetBundles 會使單個AssetBundle 本身的大小變大,也會導致它們可能包含一些冗餘的數據。


    

    Unity的Export/Import Package功能主要用途是在不同的項目之間實現asset複用。該功能的基本介紹和操作詳見官方文檔,本文將進一步描述該功能的具體表現,以及如何利用該功能實現多人項目的協作。

    導入導出包功能具有下列特性:

    在導出時,Unity會記錄導出內容在項目中的完整路徑,並在導入時重建對應的目錄結構。因此我們可以方便地在項目間同步目錄。

導出時,Unity會讓你選擇是否導出被依賴的內容。如果鉤選擇會自動添加被依賴的內容,並顯示在列表中。如下圖。

imageimage

不導出依賴

導出依賴

    導入時,Unity會判斷當前項目中是否存在名稱、路徑完全相同的文件。若有,則判斷修改時間是否一致,若一致就忽略,否則會提示是否覆蓋。注意Unity並不管文件的新舊,只是簡單地詢問用戶是否用包中的文件覆蓋項目中的同名文件。如下圖:

image

    最重要的是,Unity輸出包時,還包含了asset對應的元數據。用WinRAR或者其他壓縮軟件打開Unity導出的.unitypackage文件,就可以看到這些元數據文件,如下圖:

image

      正是由於導出的包自動包含了相關元數據信息,彌補了用SVN無法管理這些數據的缺陷,我們就可以將二者配合使用,達到多人在一個項目中協同工作的效果。具體建議如下:

  1. 首先用SVN建立對整個項目文件夾的管理,包括asset和library目錄以及下面的文件;

  2. 由負責集成的項目組成員管理並提交該項目更新到svn數據庫

  3. 其他協作人員從svn數據庫下載最新的項目文件

  4. 協作人員對自己負責的內容進行工作,然後將成果輸出。輸出時不要鉤選依賴

  5. 將輸出的unitypackage文件提交給集成人員(通過svn或者其他途徑都可以)

  6. 集成人員將新的unitypackage導入項目,然後再提交到svn數據庫

    

    如果對人員分工、規範以及項目目錄規劃得好的話,採用這種方式完全可以實現多人同時工作,提高項目開發和迭代的效率。


    所以,歸納如下:

    prefab是爲了開發中模塊重用而出現的,僅保存屬性等設置信息。

    assetbundle是用於打包遊戲資源,在運行時獲取這些資源,不能打包C#腳本。

    unitypackage是爲了開發時多人協同工作而出現的,實現插件開發,模塊重用。


    參考:http://blog.sina.com.cn/s/blog_5373cec90100p4ow.html



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章