起因
最近想优化一下UI Batches,发现了Unity 的SpriteAtlas组件(后面简称SA),但是用的时候发现了诸多问题,所以开个博客记录一下
如何切换SA
Sprite Packer Mode
切换成Always Enabled
如何创建SA
在Project
面板中,Create SA
SA组件介绍
请不要勾选Include in Build
按照文档中的描述,勾选了这个,就不需要自己增加一个Late Binding脚本,但是仍然会弹出警告,并且会出现白图现象
请不要勾选Tight Packing
SA在有A通道图片时,图片会发生严重的错位,不推荐勾选
Addressable Importer
如果项目中使用了这个插件,可以增加一个SA的配置,不知道Addressable Importer
插件的可以翻看我前面的Blog
Late Binding
做到这里的时候,我热更新到手机上时发现测试用的SA的所有Icon都变成了白图,并报出了下面的警告
⚠️ SpriteAtlasManager.atlasRequested wasn't listened to while AUIHome requested.
解决方案
创建一个SALateBinding.cs
的脚本,并丢到ET Global上
public class SALateBinding: MonoBehaviour {
public void OnEnable() { SpriteAtlasManager.atlasRequested += RequestAtlas; }
public void OnDisable() { SpriteAtlasManager.atlasRequested -= this.RequestAtlas; }
private async void RequestAtlas(string tag, Action<SpriteAtlas> callback) {
SpriteAtlas sa = await Addressables.LoadAssetAsync<SpriteAtlas>(tag).Task;
callback(sa);
}
}
资源卸载
上面只有绑定,但是图集资源却一直没有从内存中卸载,所以我们还要增加ET对SA卸载的支持
为了方便做进
Hotfix
中,我们在ETModel
中UIConfig.cs
里面增加UI对应的SAName
public class UIConfig: MonoBehaviour {
public string LayerName;
public string SAName;
public bool DestoryOnHide;
}
最后在UI声明周期结束时,用 Addressable.Release(SAName)
卸载对应资源