unity-SpriteAtlas图集

unity-SpriteAtlas图集


前篇


创建 图集

  1. 创建.

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

    2. 代码创建

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      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. 代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    using UnityEngine;
    using UnityEngine.U2D;

    public class AtlasLoader : MonoBehaviour {

    public string dir = "Assets/Res/SpriteAtlas";

    void OnEnable() {
    SpriteAtlasManager.atlasRequested += ReqAtlas;
    }

    void OnDisable() {
    SpriteAtlasManager.atlasRequested -= ReqAtlas;
    }

    void ReqAtlas(string tag, System.Action<SpriteAtlas> callback) {
    LogUtil.D("--- ReqAtlas, tag: {0}", tag); // tag 就是图集文件名
    SpriteAtlas sa = null;
    string path = string.Format("{0}/{1}.spriteatlas", dir, tag);
    #if UNITY_EDITOR
    sa = UnityEditor.AssetDatabase.LoadAssetAtPath<SpriteAtlas>(path);
    #else
    sa = (SpriteAtlas) ResourceMgr.Instance.LoadAsset(path, typeof(SpriteAtlas));
    #endif
    callback(sa);
    }
    }

打包方式

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

资源对比

新打包方式
  1. 图集 ab

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

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
              ...
      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

      ![](https://pic05.wilker.cn/20220110201306-089.webp)

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

      ```json
      ...
      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 里面记录了引用的 图片资源

      1
      2
      3
      4
      5
      6
      ...
      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 图集方式可以随时预览某个图集