本文主要說說Unity是如何管理的,基於何種方式,基於這種管理方式,又該如何規劃資源管理,以及構建bundle,是後面須要詳細討論的。git
unity項目中的資源,大致上能夠分爲外部導入資源和內部生成資源兩種類型。
外部導入資源: 美術生成的大部分資源,都是外部帶入資源,模型,貼圖,UI用圖,基本是美術工具生成後,導入到工程中的。
內部生成資源: 部分美術生成資源,例如材質,shader,特效,場景等,屬於基於Unity引擎來製做生成的,此外各類prefab(UI/角色等),以及代碼腳本(c#爲主),也屬於Unity的內部生成資源。github
在資源導入到unity工程後,會以各類方式進行轉換存儲,主要有如下幾種:c#
對於工程中的腳本類資源,主要分爲plugin和非plugin兩類。編輯器
全部最終構建到遊戲包中的dll,主要分爲:ide
美術類資源,分爲外部導入和內部生成兩個大類工具
工程資源劃分好後,如何對這些資源進行管理? 不一樣的引擎有不一樣的管理方式,那麼unity中是如何管理的?
這兒管理分爲2個步驟:序列化和meta文件的生成ui
工程中的資源,要存儲到本地磁盤,那麼就會經過引擎進行一步序列化的操做,序列化的實質,就是將資源對象按照必定的順序轉換成二進制文件。spa
在完成序列化後,unity會對應的爲該文件生成一份meta文件,這份meta文件會跟隨該文件一直存在,若是刪除該資源文件,其對應的meta文件也會被引擎自動刪除。
meta文件的主要構成:插件
文件的guid: 這個文件的全工程中的惟一索引id,基於該id,能夠對應的查找到該文件。guid的生成本質,就是基於文件的路徑來進行轉換生成的,同理,若是多個工程合併的時候出現guid衝突,能夠本身從新生成一份guid,相關連接: https://gist.github.com/ZimM-LostPolygon/7e2f8a3e5a1be183ac19設計
文件的導入設置:
除了meta文件的guid,unity還會爲每一個資源生成一份文件id,也就是fileID, 不過如今fileID已經再也不保留在meta文件中了,保留到文件的序列化文件中了,對於該資源,還會有一份localID, 這個localID, 對應的就是在一個資源中包含多個子資源的時候,定位每一個子資源所用:
那麼序列化是如何與guid/fileID關聯的?
在unity工程內部,若是給資源添加其餘資源的引用,例如加一個腳本,拖拽一個外部引用,那麼就會觸發一次序列化操做,序列化操做的時候,就會將引用的資源的fileID和guid都序列化下來,這樣在反序列化的時候,就會基於fileID和guid來反向找到依賴的資源,從而加載進來。
這個過程,在Unity中,就是一個裝載的過程,多說一句,若是一個資源依賴的其餘資源越多,那麼這個裝載過程就會越耗時,因此在打開一個很大的UI的時候,有一部分的時間是消耗在裝載UI上各個組件上的。
基於前文,能夠對整個unity的資源管理有一個初步的認識,基於meta文件和序列化操做,能夠管理工程中的資源,同時也能管理好各個資源的互相引用,那麼基於這樣的設計,在構建bundle的時候,是能夠進行相關的設計和實現的。