解决Sprite Atlas打包Asset bundles时重复打包的问题
0x00 前言
在Unity 2018.4.6之前的版本,有一个和SpriteAtlas打AB包有关的常见问题。即当给Sprite Atlas打AB包时,Sprite Atlas Texture可能会被重复打包。你可以在这里查看这个issue。
本文就来讨论一下如何解决这个问题。
0x01 The Issue
首先,我会演示一下这个issue。如下图所示,有4个sprite,分别为Icon1, Icon2, Icon3 以及 SF Window(来自Unity Samples: UI)。将它们存放到一个叫 new sprite atlas 的新Sprite Atlas中。同时有一个uGUI的Panel使用了其中的一些Sprite来渲染UI元素。


之后使用AssetBundles-Browser分别对UI Canvas和Sprite Atlas打包。

现在,我们可以继续使用另一个和Assetbundle相关的很赞的工具:
https://github.com/faelenor/asset-bundle-analyzer
来对刚刚打包的Assetbundle的内容进行分析。顺便说一下,这个工具是由一位Developer Relations Engineer 开发的,如果有反馈可以到他的工程仓库提交issue。并且这个工具需要Python2.7来执行,同时由于它的结果会保存到数据库中,因此最好有一个DB工具例如DB Browser for SQLite来查询数据库。
python analyzer.py /Applications/Unity/Unity.app/Contents/Tools ~/projects/MyGame/AssetBundles
Ok,现在我们来看一下我们得到的数据。主表叫做“objects”,每一行数据都来自Assetbundle中的每一个asset。我们可以通过“object_view”视图来查看其内容。

如上图所示,canvas和new sprite atlas 这2个Assetbundle都包含了同一个资源——spriteasset texture。我们可以在Editor中找到这张texture。
Editor 中的预览
0x02 The Solution
那么现在我们要如何解决这个问题呢?这个问题其实是由于所谓的“SpriteAtlas dependencies”所导致的。也就是SpriteAtlas 依赖问题。在SpriteAtlas的inspector编辑器上有一个叫做“Include in Build”的选项。这个选项开启时,会建立具体的sprite和SpriteAtlas的依赖关系,也就是说SpriteAtlas资源会随着具体的sprite走,就像Unity中其他asset之间产生依赖那样。
相反,如果不勾选该选项,sprite会解除它和SpriteAtlas的依赖关系。因此,SpriteAtlas也就不会自动添加到sprite所在的ab中。之后或在运行时,就可以使用所谓的“LateBinding”来加载和绑定对应的sprite了。
https://docs.unity3d.com/Manual/LateBinding.htmldocs.unity3d.com
具体如何做呢?首先不勾选“Include in Build”选项,之后再在C#脚本中注册SpriteAtlasManager.atlasRequested 的回调。在这个回调中加载对应的sprite。
https://docs.unity3d.com/ScriptReference/U2D.SpriteAtlasManager-atlasRequested.htmldocs.unity3d.com
void OnEnable()
{
SpriteAtlasManager.atlasRequested += RequestAtlas;
}
void OnDisable()
{
SpriteAtlasManager.atlasRequested -= RequestAtlas;
}
void RequestAtlas(string tag, System.Action<SpriteAtlas> callback)
{
var ab = AssetBundle.LoadFromFile(Application.streamingAssetsPath + "/new sprite atlas");
var sa = ab.LoadAsset<SpriteAtlas>(tag);
callback(sa);
}
现在,再用AssetBundle Analyzer这个工具来查看一下这次AssetBundle中的数据吧。可以看到此时只有一个spriteatlas的texture打包进了ab中。

ok,还记得本文一开始时说过的吗?是的,这是一个Unity2018.4.6之前的issue。在Unity 2018.4.6中,Unity已经修复了这个问题。

解决Sprite Atlas打包Asset bundles时重复打包的问题的更多相关文章
- 如何解决IntelliJ在打包Maven项目时不打包配置文件
在pom文件中加上你的配置文件夹目录: <build> <resources> <resource> <directory>src/res</di ...
- Unity2017新功能Sprite Atlas详解
Sprite Atlas(精灵图集)Sprite Atlas 针对现有的图集打包系统Sprite Packer在性能和易用性上的不足,进行了全面改善.除此之外,相比Sprite Packer,Spri ...
- Sprite Atlas与Sprite Mask详解
https://www.sohu.com/a/169409304_280780 Unity 2017.1正式发布后,带来了一批能帮助大家更加简化工作流的新功能.今天这篇文章,将由Unity技术经理成亮 ...
- 解决 Retrofit 多 BaseUrl 及运行时动态改变 BaseUrl ?
原文地址: juejin.im/post/597856- 解决Retrofit多BaseUrl及运行时动态改变BaseUrl(一) 解决Retrofit多BaseUrl及运行时动态改变BaseUrl( ...
- 记录下Hbuilder 打包IOS发布时 总是提示错误:ios prifile文件与私钥证书匹配 的问题
最近两天,新的APP准备要上线,然后打包正式发布版 时,总是提示不匹配 证书照hbuilder里面的文档 一样也不行,然后百度了N种方法,都是不行,而且也比较少搜索到相关问题. 后来都是谷歌了下,找到 ...
- vue 动态ip配置,避免重复打包
目前比较流行的打包大都是在vue.config.js配置代理,然后在根目录新建.env.xxx文件配置正式环境,测试环境,开发环境等用于打包时配置不同的访问地址,作为一名随波逐流的前端开发,我也是这么 ...
- 打包.a 文件时, build phases- Link Binary With Libraries
打包.a 文件时, 如果是两个Targets那么可运行调试的 build phases- Link Binary With Libraries 如果加入.a 文件. 那么就不需要在Compile ...
- 请问用Inno_Setup打包文件夹时怎么排除其中一个文件?
请问用Inno_Setup打包文件夹时怎么排除其中一个文件? 该文件夹下有几十个文件,多个文件夹,我要一个个加进去该累死,也容易出问题.不知道能不能实现我要的目的. http://www.jrsoft ...
- extjs folder is lost解决方法 和 FineUI主题切换时 iframe内的内容主题不变的解决方法
错误原因:extjs包和FineUI版本不一致 或者是 webconfig配置中 没有设置为任何人可访问 解放方法下载和FineUI版本相同的extjs包就ok了 解决方法:FineUI主题切换时 ...
随机推荐
- ElasticSearch6 报错blocked by: [FORBIDDEN/12/index read-only / allow delete (api)];
原文连接:https://blog.csdn.net/u013042707/article/details/84110531 方案:curl -XPUT -H "Content-Type: ...
- django框架进阶-分页-长期维护
################## 分页 ####################### 分页, django有自己内置的分页,但是功能不是很强大,所以自己写一个分页, web页面数据非常 ...
- 快手为什么要全资收购Acfun?
近日据媒体报道,快手已完成对「Acfun」以下简称A站的全资收购.未来A站仍将保持独立品牌和独立运营以及原有团队的独立发展.近年来,A站可谓命途多舛.相比隔壁B站风风光光顺利上市且成为真正的二次元大本 ...
- python学习笔记(12)常用模块
一.模块.包 什么是模块? 模块实质上就是一个python文件,它是用来组织代码的,意思就是说把python代码写到里面,文件名就是模块的名称,test.py test就是模块名称. 什么是包? 包, ...
- Different Integers
牛客一 J题 树状数组 题目描述 Given a sequence of integers a1, a2, ..., an and q pairs of integers (l1, r1), (l2, ...
- 简单Arp欺骗
title date layout tags 简单arp欺骗 2018-05-08 post Python #-*- coding:utf-8 -*- from scapy.all import Et ...
- Fire-Fighting Hero(多源最短路和单源最短路)
题:https://nanti.jisuanke.com/t/41349 分析:对于hero来说,走单源最短路,然后遍历dis数组中的最大值即可找到,对于消防员来说,走多源最短路,只需要建个超级起点连 ...
- mysql挖掘与探索------第一章(简介)
一.数据库简介: 1按照数据库发展时间,主要出现下面几个类型的数据库系统: a 网状型数据库 b 层次型数据库 c 关系型数据库 d 面向对象数据库 上面4中数据库系统中,关系型数据库使用最为广泛.面 ...
- react全家桶从0搭建一个完整的react项目(react-router4、redux、redux-saga)
react全家桶从0到1(最新) 本文从零开始,逐步讲解如何用react全家桶搭建一个完整的react项目.文中针对react.webpack.babel.react-route.redux.redu ...
- <SCOI2008>奖励关
emmm第一道期望dp+个状压 真有趣.. #include<cstdio> #include<iostream> #include<cstring> #inclu ...