Unity图集打包
Unity圖集打包
- 解析不同的精靈圖集情形
Include in Build:控制是否參與資源打包
1.正常Sprite與圖集依賴(一個sprite只能被一個圖集依賴,不存在公共依賴)
當啟用Include in Build時:
Prefab包(依賴a8圖集):圖集被打入a81p資源包
Prefab包(依賴a8圖集):圖集被打入a8p資源包
上圖圖片資源被分成多分資源打入prefab資源包
2)圖集被打包:形成資源包間的依賴,圖集和sprite將會被打一份,所有prefab資源包都依賴這份圖集資源包。
圖集包
?
Prefab包:
從上面三張圖可以看出Prefab沒有打入圖片資源,只有圖集腳本和sprete腳本被打入
當禁用Include in Build時:
1)圖集不被打包:圖集和sprite和資源圖片將不會跟隨預制體一起打入prefab,此時資源加載將不會有圖集。要想正常,必須圖集打包。使用SpriteManager綁定主動加載。
2)圖集被打包:形成資源包間的依賴,圖集和sprite將會被打一份,所有prefab資源包都依賴這份圖集資源包。
當禁用Include Build時,圖集不論是打包還是不打包都如上圖。圖集腳本和圖片資源都不會打入包
資源關系 ?
圖集依賴,下圖黃色
a1a4依賴1.pug,4.png;
a4a5a6依賴4.png,5.pug,6.png
預制體依賴,下圖綠色
a1p依賴a1a4中的1.png
a4p依賴a1a4和a4a5a6中共有的4.png
依賴圖
a1a2a3和a1a4有共同的依賴資源4.png
當啟用Include in Build時:
a1p預制體資源關系如下
上圖 a1p依賴a1a4圖集自有的圖片1.png,而a1a4 ?和 a4a5a6又有公共依賴的圖片4.png,形成鏈式間接依賴關系。導致a4a5a6和a1a4所有依賴的圖片資源都將會跟隨預制體打入資源包。 同時a4a5a6和a1a4共同依賴4.png。會形成兩份資源。
a4p預制體資源關系如下
上圖如果預制體依賴圖集共同依賴的資源4.png,資源包將會選擇其中的一個圖集打入包中
2)圖集被打包:形成資源包間的依賴,圖集和sprite將會被打一份,所有prefab資源包都依賴這份圖集資源包。
圖集包
預制體資源
此時預制體資源包只包含a1a4圖集。此時兩個圖集雖然把圖片分別打到圖集包里,但是共同依賴的4.png圖片(上圖紅色框資源)被復制兩份分別打到圖集。這種設置資源冗余。所以,圖集不能有公共依賴資源
當禁用Include in Build時:
?此時預制體資源包只包含a1a4圖集。此時兩個圖集雖然把圖片分別打到圖集包里,但是共同依賴的4.png圖片(上圖紅色框資源)被復制兩份分別打到圖集。這種設置資源冗余。所以,圖集不能有公共依賴資源
Include in Build?功能是控制依賴此圖集的資源是否跟隨此資源打包。
如果禁用 ,圖集不會計算到依賴此資源的打包中。開啟后將會計算進去。
一定要注意的是Include in Build無論是否禁用,當兩個圖集依賴相同的圖片資源時,如果這兩個圖集分別打包,則這份圖片資源將被復制兩份分別打入圖集包里。
當兩個圖集依賴相同的圖片資源,且被打在同一個包里時,被打進包里的資源時分別打包的總和,如下圖。
a4a5a6的資源將會被生成兩份。因為當打a1a4時,兩個圖集有公共依賴,兩個圖集的所有圖片被打入包,同時公用資源復制一份,然后再把a4a5a6在重新打進資源包,所以a4a5a6有兩份
所以圖集一定不要有共用資源。
總結:
1.圖集打包時,圖集間一定不要有同一個依賴的圖片,不然產生多分圖片資源。如果被多個預制依賴會產生更多的冗余資源。
2.圖集一定要打包,已被其他預制共同依賴而不會產生多分資源。
3.當Include in Build啟用時,如果圖集不被打包,那么打包時會根據依賴此圖集的預制體的多少生成多分圖集。如果圖集打包就只會生成一份圖集資源包。
4.當Include in Build禁用時,圖集必須打包,圖集資源也是一份。 ?如果圖集不被打包,unity找不到圖集,將無法顯示圖集,還有一種解決辦法就是綁定SpriteAtlasManager,通過Resources.Load()加載圖集(圖集必須在Resources目錄下)。
Include in Build被禁用時必須使用SpriteAtlasManager.atlasRequested綁定代碼,因為圖集和預制體不會形成依賴關系。或者自己編寫圖集和預制體依賴關系配置
綁定代碼如下
using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.U2D;public class assetLoaderTest : MonoBehaviour {public string rootPath = "D:/Assset";// Start is called before the first frame updatevoid Start(){SpriteAtlasManager.atlasRequested += loadAtlas;}void loadAtlas(string name,Action<SpriteAtlas> call){Debug.LogError("=======xx===" + name);AssetBundle atlas = AssetBundle.LoadFromFile(string.Format("{0}/{1}", rootPath, name));//Resources.Load(string.Format("{0}/{1}", rootPath, name));call(atlas.LoadAsset<SpriteAtlas>(name));}}總結
- 上一篇: 计算机发展15件重大事件(图说)
- 下一篇: 艾永亮:为什么国内品牌很难在市场中生存下