Unity的資源加載以及AssetBundle的一些坑


  • AssetBundle加載完畢,進行其中Asset的初始化后,不能立即Unload()。否則Asset的初始化會有問題,依賴關系會Missing。需要等待個1,2秒再Unload()。因為Instantiate()也有一個delay,盡管它可以立即返回一個GameObject對象。
  • Static Batch只對預先在場景中擺好的靜態對象起作用。運行時加載的對象則可能會失效。這時可以調用StaticBatchingUtility.Combine(GameObject root);手動觸發Static Batch。
  • 光照貼圖的uv信息保存在Mesh的uv2屬性上,是一個Vector2[]。模型的導入選項中,如果勾選Generate Lightmap UV會自動生成這些uv信息。但是在將模型打包到AssetBundle時這些uv會丟失。可以使用配置文件手動記錄。在加載這些模型時,再通過代碼將它們恢復。
  • 模型的name(gameObject.name)和它的Mesh的name(gameObject.renderer.mesh.name)是不一樣的。
  • AssetBundle打包出來的粒子可能會丟失Shader。只要在打包的項目中,把可能用到的Shader加入到Edit->Project Settings->Graphics->Always Included Shaders這個列表里就行了。
  •  AssetBundle里的資源會隨着AssetBundle的卸載而從內存消失。
    這是個惡心的問題。考慮一種情況,你有3個AssetBundle:A保存Prefab,B保存Mesh,C保存Texture和Material。依賴關系是A->B->C。於是你依次載入C,B,A,再把A里的Prefab給Instantiate一個,就會得到完整的GameObject。這時,你想這仨AssetBundle不要了卸了吧。卸載完,你發現Mesh,Texture,Material都沒了。因為B,C里的資源是都被依賴的,但是卸載時缺沒有被考慮到。但是你要是將B,C的東西也Instantiate各一份出來,依賴關系就沒了,只能自己添加。
    因此,建議相關的資源最好打成一個AssetBundle。這樣依賴關系是穩定的。或者你自己維護一個依賴關系。這事兒你要指着Unity,還真不太靠譜。
  • 不要將循環迭代的變量傳入到循環中的閉包函數中。因為迭代變量會被循環改寫。可以在循環內創建一個局部變量來存儲該變量。因為閉包使用外部參數的機制本質還是記錄內存地址。這種錯誤在你循環初始化一些資源,並且在回調時才能得到的情況下,很容易遇到。
  •  在編輯器模式中,對Resources目錄中內容修改后,需要AssetDataBase.Refresh()后才能使用Resources.Load()讀取到其中的內容。
  • 通過AssetBundle讀取的資源,例如通過Load(),LoadAll()和mainAsset,是不能進行Destroy的。當AssetBundle被卸載時,會被一起析構。最好先Instantiate()出來一份再使用。Texture2D、Mesh這樣的資源,需要在導入選項里勾選Read/Write Enabled。

  • 一些GameObject如果被MonoBehavior的變量(數組,List,Dictionary等)持有,則必須在OnDestroy()時手動析構它們。否則會造成內存泄露。


免責聲明!

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



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