起因

最近想优化一下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 中,我们在 ETModelUIConfig.cs 里面增加UI对应的SAName

public class UIConfig: MonoBehaviour {
    public string LayerName;
    public string SAName;
    public bool   DestoryOnHide;
}

最后在UI声明周期结束时,用 Addressable.Release(SAName) 卸载对应资源


What doesn’t kill you makes you stronger.