Unity AssetBundle(3):图集Atlas与AB包

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity AssetBundle(3):图集Atlas与AB包相关的知识,希望对你有一定的参考价值。

参考技术A

前篇:Unity AssetBundle(1):Assets打包和依赖(Dependencies)理解

前篇的验证没有加入图集Atlas这个因素,对于图集Atlas与AB包之间的关系 一直有点困惑:

为此做了一个实验:一组图片四张图tex1-4:
github:GeWenL / AssetBundlePro

tex1-4; 不打图集,且单独打成不压缩的ab包,大小如下图所示。

现在打成同一个图集Atlas, tex1.png、tex2.png打在tex12 ab包中,tex3.png、tex4.png打在tex34 ab包中:

发现打出来的ab包大小非常大,且大小一样4104K,用UnityStudio查看两个ab包:

发现这两个ab包,都写入了相同的图集纹理,只是各自的Sprite不同。

因此要注意图集与AssetBundle的关系,一个AssetBundle可以包含多个图集,但一个图集的资源只能存在于一个AssetBundle中。否则会造成资源冗余。

项目开发日志:Build AssetBundle——SpriteAtlas(还是有些疑惑)

项目信息:
   平台-Android
   Unity编辑器版本-2018.2.5f1
 
状况1:真机状况下引用到图集下的sprite的UI显示出错。
在我们的测试下发现了以下两个解决方案:
    1.在加载相应UI前,将sprite所属图集(spriteAtlas)提前加载到内存中。(相当麻烦,你得知道自己的sprite属于哪个图集,并且需要相应的一套资源加载的框架)。
    2.调用unity提供的回调,手动定位加载相应图集。(untiy2018以后才提供用协程异步加载图集)
技术分享图片
接下来是我疑惑的原因:
 
测试记录:unity2017.3.0f3
SpriteAtlas打AB包:
    UnityEditor,勾选Include in Build,不注册atlasRequested,加载带Image的UI预制体,正常显示
    UnityEditor,不勾选Include in Build,不注册atlasRequested,加载带Image的UI预制体,不显示显示,并警告SpriteAtlasManager.atlasRequested wasn‘t listened to while RGB requested.
 
    UnityEditor,勾选Include in Build,注册atlasRequested,加载带Image的UI预制体,正常显示,
但不触发atlasRequested事件。
    UnityEditor,不勾选Include in Build,注册atlasRequested,加载带Image的UI预制体,正常显示,并触发atlasRequested事件。
 
    Android真机,勾选Include in Build,不注册atlasRequested,加载带Image的UI预制体,正常显示
    Android真机,不勾选Include in Build,不注册atlasRequested,加载带Image的UI预制体,正常显示显示图片(奇怪)
 
    Android真机,勾选Include in Build,注册atlasRequested,不加载带Image的UI预制体,正常显示图片,不触发atlasRequested事件。
    Android真机,不勾选Include in Build,注册atlasRequested,不加载带Image的UI预制体,正常显示图片,但也不触发atlasRequested事件(奇怪)
 
 
我们项目Unity2018在大量UI(勾了Include in Build)的时候有时候会出现显示错误,注册事件后恢复正常。所以这里当作一个unity的BUG?
 

以上是关于Unity AssetBundle(3):图集Atlas与AB包的主要内容,如果未能解决你的问题,请参考以下文章

谈谈我用Unity5的AssetBundle踩到的几个坑

Unity 浅谈AssetBundle 游戏资源

unity 怎么使用sprite packer图集

项目开发日志:Build AssetBundle——SpriteAtlas(还是有些疑惑)

UGUIDrawCall优化

Siki_Unity_3-7_AssetBundle从入门到掌握