版權聲明:本文爲博主原創文章,未經博主容許不得轉載。html
初學Unity的過程當中,會發現打包發佈程序後,unity會自動將場景須要引用到的資源打包到安裝包裏,沒有到的不會跟進去。咱們在編輯器裏看到的Asset中的文件結構只是工做於編輯器環境下的,在遊戲中unity會從新組織數據庫。這是咱們必定會遇到一個需求,即動態的加載咱們本身的文件,並且想維護這個文件存儲和加載的位置,而且是各類自定義的文件。mysql
好比說你換裝,須要動態從磁盤load一個模型,正常狀況下若是這個模型沒有被場景引用到,它都根本不會被打進安裝包的。再好比說我想存儲一個本身定義的配置的文件,想把它放在磁盤的某個位置,動態的讀,這些需求就要動態的加載資源。sql
1.首先總結下unity有哪幾種資源類型數據庫
unity資源的類型:服務器
-a) Unity內置的經常使用asset, fbx\jpg...編輯器
- b) textasset: txt、binary等,對應了它的TextAsset類,能夠直接讀入文本或者二進制byte函數
-c) scriptable object 它是序列化的Object實例,例如把一個Object實例保存成scriptable object,讀入進來後就直接在內存中變成那個實例加密
- d) asset bundle 它是一個資源壓縮包,裏面包含了一堆資源url
一般咱們自定義的文件類型能夠經過textasset 或scriptable object 來存儲,區別在於前者是一個字節或文本流,後者要對應於程序中一個定義了的類型,textasset 還一般用於資源的加密。spa
2.動態load資源的幾種途徑:
-經過Resources模塊,調用它的load函數:能夠直接load並返回某個類型的Object,前提是要把這個資源放在Resource命名的文件夾下,Unity不關有沒有場景引用,都會將其所有打入到安裝包中。
-經過bundle的形式:即將資源打成 asset bundle 放在服務器或本地磁盤,而後使用WWW模塊get 下來,而後從這個bundle中load某個object。
-經過AssetDatabase.loadasset :這種方式只在editor範圍內有效,遊戲運行時沒有這個函數,它一般是在開發中調試用的
區別:Resources的方式須要把全部資源所有打入安裝包,這對遊戲的分包發佈(微端)和版本升級(patch)是不利的,因此unity推薦的方式是不用它,都用bundle的方式替代,把資源達成幾個小的bundle,用哪一個就load哪一個,這樣還能分包發佈和patch,可是在開發過程當中,不可能沒更新一個資源就打一次bundle,因此editor環境下可使用AssetDatabase來模擬,這一般須要咱們封裝一個dynamic resource的loader模塊,在不一樣的環境下作不一樣實現。
3.動態資源的存放
有時我須要存放一些本身的文件在磁盤上,例如我想把幾個bundle放在初始的安裝裏, unity有一個streaming asset的概念,用於提供存儲接口的訪問。咱們須要在編輯器創建一個StreamingAssets名字的文件夾,把須要咱們放在客戶磁盤上的動態文件放在這個文件夾下面,這樣安裝後,這些文件會放在用戶磁盤的指定位置,這個位置能夠經過Application.streamingAssetsPath來獲得。