unity-SpriteAtlas图集

Posted 蝶泳奈何桥.

tags:

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


title: unity-SpriteAtlas图集
categories: Unity3d
tags: [unity, 图集]
date: 2022-01-10 14:29:00
comments: false
mathjax: true
toc: true

unity-SpriteAtlas图集


前篇

  • Sprite Atlas - https://docs.unity3d.com/cn/2018.4/Manual/class-SpriteAtlas.html
  • 自动创建SpriteAtlas并设置图集资源 - https://www.jianshu.com/p/bdd223184738
  • SpriteAtlas与AssetBundle最佳食用方案 - https://cloud.tencent.com/developer/article/1765934

创建 图集

  1. 创建.

    1. 手动创建. 右键 -> create -> sprite atlas, 然后拖入需要打图集的 文件/文件夹

    2. 代码创建

      public static SpriteAtlas CreateAtlas(string output, TextureImporterFormat tif) 
          SpriteAtlas atlas = new SpriteAtlas();
          // 设置参数 可根据项目具体情况进行设置
          SpriteAtlasPackingSettings packSetting = new SpriteAtlasPackingSettings() 
              blockOffset = 1,
              enableRotation = false,
              enableTightPacking = false,
              padding = 2,
          ;
          atlas.SetPackingSettings(packSetting);
      
          SpriteAtlasTextureSettings textureSetting = new SpriteAtlasTextureSettings() 
              readable = false,
              generateMipMaps = false,
              sRGB = true,
              filterMode = FilterMode.Bilinear,
          ;
          atlas.SetTextureSettings(textureSetting);
      
          AssetDatabase.CreateAsset(atlas, output);
          return atlas;
      
      
  2. 大概就是这样设置

    • 网上很说不要勾选 Include In Build, 说勾选了会有冗余的一份散图打进去, 实际上这个Bug早已经在 Unity2018.4.6 中修复了, 所以我们在使用中放心大胆地勾选 Include In Build 就好了


打成 AssetBundle

xxx.spriteatlas 图集文件打成 ab 后, 引擎需要根据 每个人自定义加载 方式加载 ab 后, 回调回引擎, 不然会出现图片是 空白 的情况

需要添加 SpriteAtlasManager.atlasRequested, 不添加的会会报错: spriteatlasmanager.atlasrequested wasn't listened to while xxx requested


添加 atlasRequested

  1. 代码

    using UnityEngine;
    using UnityEngine.U2D;
    
    public class AtlasLoader : MonoBehaviour 
    
        void OnEnable() 
            SpriteAtlasManager.atlasRequested += RequestAtlas;
        
    
        void OnDisable() 
            SpriteAtlasManager.atlasRequested -= RequestAtlas;
        
    
        void RequestAtlas(string tag, System.Action<SpriteAtlas> callback) 
            // 1. 自定义加载 ab 的逻辑. (这里最好不要用异步加载的方式, 否则会闪现一下空白图片, 因为此时资源还未被加载出来)
            string path = string.Format("Assets/Res/SpriteAtlas/0.spriteatlas", tag);
            SpriteAtlas sa = (SpriteAtlas) ResourceMgr.Instance.LoadAsset(path, typeof(SpriteAtlas));
            
            // 2. 加载完 SpriteAtlas 回传给引擎 
            callback(sa);
        
    
    

打包方式

  1. 旧方式把 某个 图片 文件夹打成一个 ab 的还是要的, 原有的资源加载方式都不变.
  2. 只是新增了将 xxx.spriteatlas 打成 ab. 然后运行时回调 atlasRequested 加载这个 ab 回传给 引擎 即可.

资源对比

新打包方式
  1. 图集 ab

    • cards.assetbundle.manifest 里面记录了引用的 图片文件夹 ab

      ...
      Assets:
      - Assets/Res/SpriteAtlas/cards.spriteatlas
      Dependencies:
      - E:/its/tdmj_itc/patch/temp_patch_root/tdmj/common/resource/assets/res/ui/atlas/cards.assetbundle
      
      
      
  2. 图片文件夹 ab

    • cards.assetbundle.manifest 里面记录了引用的 图片资源

      ...
      Assets:
      - Assets/Res/UI/Atlas/cards/11.png
      - Assets/Res/UI/Atlas/cards/15.png
      Dependencies: []
      
      
    • AssetStudio 分析 cards

    • unity profiler 中内存快照

      多出来几个 xxx.spriteatlas 所在 ab


旧打包方式
  1. 图片文件夹 ab

    • cards.assetbundle.manifest 里面记录了引用的 图片资源

      ...
      Assets:
      - Assets/Res/UI/Atlas/cards/11.png
      - Assets/Res/UI/Atlas/cards/15.png
      Dependencies: []
      
      
    • AssetStudio 分析 cards


结论
  1. AssetStudio 可以看出, 新的方式的 图集是打到 xxx.spriteatlas 所在的 ab 中.

  2. unity profiler 中内存快照看到多出了

  3. 使用新的 SpriteAtlas 图集方式可以随时预览某个图集


以上是关于unity-SpriteAtlas图集的主要内容,如果未能解决你的问题,请参考以下文章

Unity 之 图集属性详解和代码示例 -- 拓展一键自动打包图集工具

Unity 之 图集属性详解和代码示例 -- 拓展一键自动打包图集工具

什么叫新建图集

Unity 2D:导入图集

将纹理图集拆分为多个纹理图集警告

Node.JS 文件读写,把Sheet图集转换为龙骨动画图集