A solution to Sprite Atlas are duplicated into other Asset Bundles.

Jiadong Chen
Nov 5 · 3 min read

0x00 Description

There is a common issue with sprite atlas and asset bundles before Unity 2018.4.6. That is, when using sprite atlas and asset bundle, the sprite atlas texture may be duplicated into other asset bundles. You can find the issue here. This article will discuss how to solve this issue.

0x01 The Issue

First of all, I will demonstrate this issue. There are 4 sprites, which are Icon1, Icon2, Icon3, and SF Window. (They come from Unity Samples: UI) Add them to a Sprite Atlas called new sprite atlas. And there is an uGUI Panel which uses the sprites from the sprite atlas to render some ui elements.

Then I use the AssetBundles-Browser to build the UI Canvas and the Sprite Atlas bundles.

Now, I will use another AssetBundle-related tool called AssetBundle Analyzer to analyze the content of the asset bundles just built. By the way, You need Python 2.7 to run this program. You will also need a tool such as DB Browser for SQLite to query the database.

python analyzer.py /Applications/Unity/Unity.app/Contents/Tools ~/projects/MyGame/AssetBundles

Ok, let’s see what we get there. The main table is called objects and it contains a row for every object in the asset bundles. It’s best to use the object_view view.

As the screenshot shows, the two AssetBundles(canvas and new sprite atlas) include the same texture, the spriteasset texture.

0x02 The Solution

How should we solve this problem now? This problem is caused by the so-called SpriteAtlas dependencies. There is an Include in Build checkbox on the SpriteAtlas inspector editor. When checked, SpriteAtlas will be there as long as you bring the sprite. This is like any asset dependency that Unity check during the conventional build. Which also applies to AssetBundle builds.

When unchecked, on the other hand, the sprite releases its reference to the SpriteAtlas. Therefore, the SpriteAtlas won’t come automatically. And You can use the Late Binding to load the sprite later or at run time.

To do this, let’s disable the Include in Build option. Then at C# script, register the SpriteAtlasManager.atlasRequested callback.

Now let’s analyze the the content of the asset bundles via AssetBundle Analyzer. As you can see, there is only one SpriteAtlas texture now.

Ok, remember what I said at the beginning of the article? Yes, it’s an issue before Unity2018.4.6. At Unity2018.4.6, Unity fixes this issue.

chenjd.xyz

Record work and life. Focus on software development, Unity and C#.

Jiadong Chen

Written by

Programmer | Author | Blogger | Speaker | Microsoft Developer Technologies MVP | @Unity3d China | Views = my own

chenjd.xyz

Record work and life. Focus on software development, Unity and C#.

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade