Using Unity Addressables to Load Sprites at Runtime Without Rebuilding the Player
Learn how Unity's Addressable Asset System lets you load sprites by address at runtime, cut initial download size, and update content without rebuilding the player.
16 Sept 2026, 23:45 UTC

Problem: Large builds and slow content updates
When a Unity game ships with all textures, models, and audio bundled into the player executable, the initial download can be large and any change to a single asset requires rebuilding and redistributing the whole binary. This workflow slows down iteration and makes live‑ops or DLC delivery cumbersome.
Thesis: Addressables decouple assets from the player build
Unity's Addressable Asset System lets you mark assets as addressable, pack them into separate bundles, and load them by string key at runtime. The player only contains a small bootstrap that knows how to fetch bundles from a local folder or a remote CDN, enabling smaller initial downloads and the ability to update content without touching the player code.
Setting up Addressables
- Open the Package Manager (
Window → Package Manager), add the "Addressables" package if it is not already present. - In the Addressables Groups window (
Window → Asset Management → Addressables → Groups), create a new group (e.g., "Default Local Group"). - Select a sprite in the Project view, click the "Addressable" checkbox in the Inspector, and assign an address such as
mysprite. - Build the player bundles via
Build → New Build → Default Build Script. This creates aBuildfolder containing asset bundles and a content catalog JSON.
Loading an addressable sprite at runtime
Create a C# script that requests the sprite by its address and instantiates it when the operation completes.
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.AsyncOperations;
public class SpriteLoader : MonoBehaviour
{
[Tooltip("Address assigned to the sprite in the Addressables window")]
public string spriteAddress = "mysprite";
private void Start()
{
Addressables.LoadAssetAsync<Sprite>(spriteAddress).Completed += handle =>
{
if (handle.Status == AsyncOperationStatus.Succeeded)
{
Sprite sprite = handle.Result;
GameObject go = new GameObject("SpriteObject");
go.AddComponent<SpriteRenderer>().sprite = sprite;
// Optional: position the sprite
go.transform.position = Vector3.zero;
}
else
{
Debug.LogError("Failed to load addressable sprite: " + handle.OperationException);
}
// Release the handle when you are done with the sprite
Addressables.Release(handle);
};
}
}
Attach this script to any GameObject in your opening scene. When the game runs, Addressables will load the bundle containing the sprite, instantiate a GameObject with a SpriteRenderer, and then release the handle.
Trade‑offs and limitations
- Runtime overhead: Each
LoadAssetAsynccall incurs bundle loading and decompression time. On low‑end devices this can affect frame timing if many assets are loaded simultaneously. Mitigation strategies include pre‑loading critical assets during a splash screen or usingAddressables.DownloadDependenciesAsyncahead of time. - Reference‑counting discipline: Forgetting to call
Addressables.Releaseon a handle leaves the bundle in memory, causing leaks. Always pair every load with a release, or use theAsyncOperationHandlepattern shown above. - Missing content errors: If a script references an address that is not marked as addressable or is omitted from the build, the load will fail at runtime. Verify your build by checking the generated content catalog (
Build\<platform>\<catalog>.json) for the expected address.
Actionable closing steps
- After building the player, run the game and open the Unity Profiler (
Window → Analysis → Profiler). Select the Memory module and watch the total allocated memory before and after the sprite is loaded; a increase followed by a decrease afterReleaseindicates proper reference counting. - To test live updates, change the sprite’s texture, rebuild only the addressable bundles (
Build → New Build → Update a Previous Build), upload the new bundles and catalog to your CDN, and launch the existing player without recompiling. The new texture should appear at runtime. - Automate a sanity check in CI: after a bundle build, parse the catalog JSON and assert that every address used in your scene scripts is present.
0 replies
A thoughtful contribution can make all the difference. Be the first to share one.