Update Mobile Game Content Without a Store Rebuild Using Unity Addressables
Load Unity assets by address at runtime, bundle UI content separately, and avoid full store rebuilds for small fixes.
17 Nov 2025, 12:32 UTC

Hard references force a full store update for every art fix
You release a mobile game. Two weeks later, a designer spots a typo on a UI button or a level prefab has a missing collider. With ordinary scene references, that asset is baked into the application build. Fixing it means rebuilding the player, uploading a new binary, and waiting for app store review—even though the change is only a few kilobytes of content.
Unity Addressables let you load assets by address at runtime instead of hard references. The content is packaged into AssetBundles separate from the main player build, so you can update a bundle on a server and have clients download it without a new store submission.
Set up a group and load a prefab by address
Open the Addressables Groups window (Window > Asset Management > Addressables > Groups). Create a group named UI_Elements, drag a prefab into it, and set its address to ui/start_button. The address is the runtime key you use to request the asset.
Build the content by selecting Build > New Build > Default Build Script from the Groups window. This writes bundle metadata and binary bundles under Library/com.unity.addressables/ for the current platform. Verify the folder appears after the build; if it does not, the Addressables package may not be installed or the group may be empty.
Run this in the Unity Editor on a target platform build target, such as Android or iOS, to catch platform-specific bundle issues early. Required permissions are standard Editor permissions; no admin rights are needed.
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.AsyncOperations;
public class ButtonLoader : MonoBehaviour
{
AsyncOperationHandle<GameObject> _buttonHandle;
async void Start()
{
await Addressables.InitializeAsync();
_buttonHandle = Addressables.LoadAssetAsync<GameObject>("ui/start_button");
await _buttonHandle.Task;
if (_buttonHandle.Status == AsyncOperationStatus.Succeeded)
{
Instantiate(_buttonHandle.Result);
}
else
{
Debug.LogError("Failed to load addressable: ui/start_button");
}
}
void OnDestroy()
{
if (_buttonHandle.IsValid())
{
Addressables.Release(_buttonHandle);
}
}
}
The expected check is that the button appears in the scene and the Addressables Profiler shows a load event followed by a release event when the object is destroyed. A key risk is forgetting to call Release: every LoadAssetAsync handle must be released, or native memory is retained and mobile devices can crash gradually over a session.
Remote bundles and catalog versioning
Groups can be bundled separately and uploaded to a remote server. Clients download the catalog and bundles at runtime, enabling post-launch content updates. The remote URL must match the platform and build target; an Android bundle will not load on an iOS client, and a bundle built for a different Unity version may fail to load.
Version mismatches between the local player and the remote catalog cause load failures or missing content. Before publishing a remote update, test the download flow on an actual device, not only in the Editor simulator. Check Package Manager for the installed Addressables version and compare it against your target Unity LTS release notes, because behavior differs between URP, Built-in, and HDRP pipelines.
Trade-offs and limitations
- Build times increase because Addressables rebuilds bundle metadata for changed groups.
- Synchronous
LoadAssetAPIs block the main thread; prefer async handles. - Initial setup adds build complexity and requires testing on target devices.
- Missing
Releasecalls cause retained native memory and gradual crashes on mobile.
Check the result before shipping
Open the Addressables Profiler (Window > Analysis > Addressables Profiler) and confirm that asset load and unload events match your Release calls. Build a small scene that loads a remote asset by address after Addressables.InitializeAsync completes, and verify it appears on a device. If you need to roll back a content build, remove the group from the Addressables Groups window, rebuild Player Content, and redeploy the previous player bundle if remote content was already published.
Addressables are worth the complexity when you need to update content outside the app store cycle, but they trade build simplicity for runtime delivery flexibility. Start with one group, measure load and release events in the profiler, and expand only after the handle lifecycle is predictable on target hardware.
0 replies
A thoughtful contribution can make all the difference. Be the first to share one.