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中,当你创建一个Sprite Atlas并使用它来打包多个Sprite时,你可能需要获取这个图集在构建后占用的具体大小。这可以通过编写脚本来实现,以便在构建过程之后获取图集的大小信息。以下是如何通过脚本实现这一功能的基本步骤: 1. 在Unity编辑器中,创建一个新的C#脚本,命名为例如`SpriteAtlasSizeReporter.cs`。 2. 将这个脚本附加到一个空的GameObject上。 3. 在脚本中,你需要使用`Resources.Load`方法来加载你的Sprite Atlas资源。 4. 之后,使用Unity的`SpriteAtlas.GetPackedSheet`方法来获取图集的详细信息。 5. 通过这些信息,你可以计算出图集的总宽度和高度,这通常基于图集中的每个元素的大小以及它们如何被排列。 以下是一个简单的代码示例,展示了如何获取Sprite Atlas的打包后的图集大小: ```csharp using UnityEngine; using UnityEngine.U2D; using UnityEngine.SpriteRuntimeAtlas; public class SpriteAtlasSizeReporter : MonoBehaviour { void Start() { // 加载指定的Sprite Atlas资源 SpriteAtlas atlas = Resources.Load<SpriteAtlas>("YourSpriteAtlasName"); if (atlas == null) { Debug.LogError("Sprite Atlas not found!"); return; } // 获取图集的打包信息 PackedSheet packedSheet = atlas.GetPackedSheet(); if (packedSheet == null) { Debug.LogError("Could not get packed sheet for the atlas."); return; } // 计算图集的大小 int totalWidth = packedSheet.rect.width; int totalHeight = packedSheet.rect.height; Debug.Log($"Sprite Atlas Size: {totalWidth} x {totalHeight}"); } } ``` 请将`"YourSpriteAtlasName"`替换为你的实际Sprite Atlas的名称。 在使用上述脚本之前,确保你的Sprite Atlas已经被正确添加到Resources文件夹中,以便可以通过`Resources.Load`方法加载。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蝶泳奈何桥.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值