Unity Asset Delivery: Choosing Addressables, Resources, or StreamingAssets
Use Addressables for most Unity runtime content, Resources only for tiny always-loaded assets, and StreamingAssets for raw platform files.
02 Jan 2026, 12:55 UTC

Runtime Asset Delivery in Unity: Decision and Constraints
You need to load prefabs, textures, or scene content at runtime, but the wrong delivery choice can inflate install size, stall the main thread, or produce addresses that work in the Editor and fail in a standalone build. The useful takeaway is to use the Unity Addressable Asset System for most addressable content, keep Resources.Load for very small assets that are always loaded, and reserve StreamingAssets for raw platform files that Unity must not process or compress.
Constraints That Drive the Decision
- Target platforms: mobile and PC
- Build size cap: under 150 MB
- No post-install content updates required
- Inspector-driven group assignments preferred
Under these constraints, Addressables is the default choice because it supports content groups, labels, dependency tracking, and asynchronous loading without requiring a remote catalog. Resources is acceptable only for a handful of always-loaded assets. StreamingAssets is appropriate only when a file must be copied byte-for-byte into the build, such as a native plugin or video.
Supported Options Comparison
| System | Best use | Loading model | Build impact | Main risk |
|---|---|---|---|---|
| Addressables | Addressable content, medium to large projects | Asynchronous, handle-based | Content build step; groups can be compressed | Requires package setup, content build before player build, and disciplined handle release |
| Resources | Tiny, always-loaded assets | Synchronous by path | Assets packed into resources.blob; linear growth | Startup memory pressure and longer build times as the project grows |
| StreamingAssets | Raw platform files, native plugins, video | Manual file path access | Files copied raw; no Unity compression integration | No dependency management, platform path differences, larger install size |
Trade-offs to Accept
Addressables adds a build-time analysis step. You must build Addressables content before building the player, or addresses may resolve in the Editor but fail in standalone builds. You also must release every AsyncOperationHandle exactly once after a successful load; forgetting this retains native memory. Resources avoids package setup but bundles everything into resources.blob, which can increase startup time and memory. StreamingAssets keeps files untouched but gives you no dependency tracking and requires you to manage paths such as Application.streamingAssetsPath yourself.
Implementation: Load and Release a Prefab
This example assumes Unity 2021 LTS or later with the Addressable Asset System package installed through the Package Manager. Run the code in a MonoBehaviour attached to a GameObject in your scene. No special runtime permissions are required for local content.
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.AsyncOperations;
public class PrefabLoader : MonoBehaviour
{
private AsyncOperationHandle _handle;
private bool _hasHandle;
void Start()
{
// Replace "EnemyPrefab" with the address assigned in the Addressables Groups window.
_handle = Addressables.LoadAssetAsync("EnemyPrefab");
_handle.Completed += OnPrefabLoaded;
_hasHandle = true;
}
void OnPrefabLoaded(AsyncOperationHandle handle)
{
if (handle.Status == AsyncOperationStatus.Succeeded)
{
Instantiate(handle.Result);
}
// Release exactly once per successful load attempt.
Addressables.Release(handle);
_hasHandle = false;
}
void OnDestroy()
{
// Safety net only if the object may be destroyed before the load completes.
// Do not release the same handle twice.
if (_hasHandle && _handle.IsValid())
{
Addressables.Release(_handle);
_hasHandle = false;
}
}
}
Execution context: Unity Editor Play Mode or a standalone player build. Permissions: none for local Addressables content. Risk: calling Addressables.Release more than once for the same handle is undefined behavior and can corrupt the resource manager state. Do not load the same asset through both Addressables and Resources.Load; duplicate copies inflate build size and memory.
Validation Steps
- Open
Window>Asset Management>Addressables>Groups. - Assign a test prefab to a group and note its address.
- Run
Build>New Build>Default Build Scriptto build Addressables player content. - Enter Play Mode and confirm
LoadAssetAsynccompletes withAsyncOperationStatus.Succeededand the prefab instantiates. - Open the Unity Profiler Memory module, capture memory before and after
Addressables.Release, and confirm allocated native memory drops. - Build a standalone player for your target platform and repeat the load path to verify the address is not Editor-only.
Limitations and Verification Required
This guide describes established Addressables behavior, but the steps above have not been executed in this environment. Before adopting this pattern in CI, verify that your Unity version and Addressables package version build content successfully, and compare build size and frame-time samples with and without Addressables for a representative scene to confirm the 150 MB constraint. Remote Addressables hosting is outside the scope of this offline-delivery pattern and requires separate catalog upload and version management.
0 replies
A thoughtful contribution can make all the difference. Be the first to share one.