Addressables is Unity's system for loading assets from anywhere – local disk or remote server. Instead of storing everything in memory, you load assets on demand.
- Load levels, characters, or items only when needed
- Reduce game size and memory usage
- Update content without rebuilding the whole game
Installing Addressables
- Window -> Package Manager.
- Search "Addressables" -> Install.
- Window -> Asset Management -> Addressables -> Groups.

Marking Assets as Addressable
- Method 1: Select asset in Project window - Check "Addressable" in Inspector.
- Method 2: Drag asset into Addressables Groups window.
Loading Assets by Address
Load an asset using its address name.
using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.AsyncOperations;
public class AddressableLoader : MonoBehaviour
{
public string assetAddress = "MyCharacter";
void Start()
{
LoadAsset();
}
void LoadAsset()
{
Addressables.LoadAssetAsync<GameObject>(assetAddress).Completed += OnAssetLoaded;
}
void OnAssetLoaded(AsyncOperationHandle<GameObject> handle)
{
if (handle.Status == AsyncOperationStatus.Succeeded)
{
GameObject obj = Instantiate(handle.Result);
Debug.Log("Asset loaded: " + obj.name);
}
else
{
Debug.LogError("Failed to load asset");
}
}
}
LoadAssetAsync() loads the asset in background. Game continues running while loading. Completed event fires when done.
Loading and Instantiating Together
Load and instantiate an asset with one line.
public class Spawner : MonoBehaviour
{
public string enemyAddress = "Enemy_Goblin";
void SpawnEnemy()
{
Addressables.InstantiateAsync(enemyAddress, transform.position, Quaternion.identity);
}
}
InstantiateAsync() loads the prefab and creates an instance at specified position and rotation.
Releasing Assets
Important to release assets to free memory.
public class AssetManager : MonoBehaviour
{
private AsyncOperationHandle<GameObject> handle;
private GameObject spawnedObject;
void LoadAndSpawn()
{
handle = Addressables.LoadAssetAsync<GameObject>("MyAsset");
handle.Completed += (op) =>
{
spawnedObject = Instantiate(op.Result);
};
}
void ReleaseAsset()
{
if (spawnedObject != null)
Destroy(spawnedObject);
Addressables.Release(handle); // Release memory
}
}
Always release assets you no longer need. Otherwise, memory leaks occur.
Loading Scene with Addressables
Load scenes that are marked as Addressable.
public class LevelLoader : MonoBehaviour
{
public string levelAddress = "Level_Boss";
public void LoadBossLevel()
{
Addressables.LoadSceneAsync(levelAddress, UnityEngine.SceneManagement.LoadSceneMode.Single);
}
}
Remote Content Delivery (Update without Rebuild)
Addressables can load assets from a server. Update game content without rebuilding the app.
- Setup: Window -> Asset Management -> Addressables -> Settings
- Set Remote Load Path to your server URL.
public class RemoteLoader : MonoBehaviour
{
async void Start()
{
await Addressables.InitializeAsync();
// Check for updates
var checkHandle = Addressables.CheckForCatalogUpdates();
await checkHandle.Task;
if (checkHandle.Result.Count > 0)
{
var updateHandle = Addressables.UpdateCatalogs();
await updateHandle.Task;
Debug.Log("Content updated!");
}
}
}
Addressables Groups
Create groups to organize assets:
- AlwaysLoaded: UI, player character (load at start)
- LevelAssets: Props, enemies for current level
- DLCContent: Optional downloadable content