Unity图集相关问题

Unity图集相关问题


前言

最近查找图集相关资料的时候看到了Unity论坛上的一篇帖子,其中Unity官方技术人员解释了“Include In Build”究竟有什么作用。


Include In Build

简而言之,如果勾选了,就意味着Sprite直接引用SpriteAtlas;如果不勾选,就意味着Sprite没有直接引用SpriteAtlas。

也就是说,我们可以理解为“Include In Build”就是是否存储sprite和图集的引用关系。

当勾选的时候,Unity保证了使用者在任何时候都无需关注图集(不确定图集会不会被打进底包,官方没有细说,应该需要去找Unity源码才行)。当在运行时使用sprite的时候,Unity会自动进行图集管理。使用者无需手动加载图集。

当取消勾选的时候,使用者就需要使用Late-binding(后绑定)来加载图集。


问题

如果勾选了Include In Build,图集又打了单独的AB包。那么只要当图集AB包加载到内存中后,无需进行后绑定,即可正常显示sprite。

但根据不加载图集AB包,图片就无法正常显示的现象来看,我们可以进行一波推断。

对于既勾选了Include In Build,又打了图集AB包的情况,Unity虽然记录了sprite和图集的引用关系,但应该不会对图集进行任何管理了。所以说不想进行后绑定,又想对图集进行热更新,可以尝试开启Include In Build,并保证图集的AB包加载到内存中。

之前也怀疑过是不是这个版本Unity的Bug,所以上述问题的最终原因还需要查看Unity源码才能知道(埋一个坑,以后再说)。


Late-binding

所谓后绑定,就是Unity在加载资源时,对于引用到的sprite,Unity由于不知道sprite和图集的引用关系,所以会发送一个请求加载这个sprite的事件。作为使用者需要接收这个事件(即SpriteAtlasManager.atlasRequested回调),然后把这个sprite的图集返回给Unity。这也就意味着,使用者需要自己加载图集。

具体实现好像还有很多坑,因为没有淌坑,所以这里就不多说了。


platformSettings

对应图集Override部分,如果存在则说明有针对某平台的重写设置。

platformSettings:
- serializedVersion: 2
  m_BuildTarget: Standalone
  m_MaxTextureSize: 2048
  m_ResizeAlgorithm: 0
  m_TextureFormat: 47
  m_TextureCompression: 2
  m_CompressionQuality: 50
  m_CrunchedCompression: 0
  m_AllowsAlphaSplitting: 0
  m_Overridden: 1
  m_AndroidETC2FallbackOverride: 0
- serializedVersion: 2
  m_BuildTarget: Android
  m_MaxTextureSize: 1024
  m_ResizeAlgorithm: 0
  m_TextureFormat: 47
  m_TextureCompression: 1
  m_CompressionQuality: 50
  m_CrunchedCompression: 0
  m_AllowsAlphaSplitting: 0
  m_Overridden: 1
  m_AndroidETC2FallbackOverride: 0

totalSpriteSurfaceArea

没有查到具体含义,搜索引擎上相关信息太少。

有时候有值,有时候又是0。目前不知道具体原因和细节。

totalSpriteSurfaceArea: 17843

storedHash

storedHash表示Library\AtlasCache文件夹中可用的当前spriteatlas缓存的哈希。当生成的图集和缓存的图集资源一样、Pack平台一样(SpriteAtlasUtility.PackAllAtlases)、设置一样时,Unity通过缓存快速生成图集(确实非常快),并且将storedHash标记为缓存的哈希值。当不存在图集缓存信息的时候,storedHash为00000000000000000000000000000000。

有人说这个storedHash会经常变,反正我测试了,只要上述条件不变,storedHash就不会变。具体可以参考这个

(storedHash在2019的某个版本好像被去掉了,就是因为用户反馈老变,不好做版本控制。)

storedHash: 
  serializedVersion: 2
  Hash: 31ee8620a8a14d495f31dc7bae9d896e

另:batchmode

Unity在batchmode中切换了平台后,不会立即生效。所以对于UNITY_ANDROID、UNITY_IOS这类的宏,很有可能判断不到,写代码的时候需要注意一下。(坑!)

解决方法,可以将宏判断改为传参,通过不同参数来运行不同逻辑。


后记

这个学习记录实际上是由上一篇图集引用问题引出来的。总之,学就完事了。

(不好看源码,又想稍微了解一下Unity引擎底层,上Unity官方论坛!)


  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值