docs.unity3d.com
Search Results for

    Show / Hide Table of Contents

    Wait for asynchronous loads with async and await

    AsyncOperationHandle provides a Task object that you can use with the C# async and await keywords to sequence code that calls asynchronous methods and handles the results.

    The following example loads Addressable assets using a list of keys. The differences between this task-based approach and the coroutine or event-based approaches are in the signature of the calling method. This method must include the async and await keywords with the operation handle's Task property. The calling method, Start in this case, suspends operation while the task finishes. Execution then resumes and the example instantiates all the loaded prefabs in a grid pattern.

    
    using System.Collections.Generic;
    using UnityEngine;
    using UnityEngine.AddressableAssets;
    using UnityEngine.ResourceManagement.AsyncOperations;
    
    internal class LoadWithTask : MonoBehaviour
    {
        // Label or address strings to load
        public List<string> keys = new List<string>() {"characters", "animals"};
    
        // Operation handle used to load and release assets
        AsyncOperationHandle<IList<GameObject>> loadHandle;
    
        public async void Start()
        {
            loadHandle = Addressables.LoadAssetsAsync<GameObject>(
                keys, // Either a single key or a List of keys
                addressable =>
                {
                    // Called for every loaded asset
                    Debug.Log(addressable.name);
                }, Addressables.MergeMode.Union, // How to combine multiple labels
                false); // Whether to fail if any asset fails to load
    
            // Wait for the operation to finish in the background
            await loadHandle.Task;
    
            // Instantiate the results
            float x = 0, z = 0;
            foreach (var addressable in loadHandle.Result)
            {
                if (addressable != null)
                {
                    Instantiate<GameObject>(addressable,
                        new Vector3(x++ * 2.0f, 0, z * 2.0f),
                        Quaternion.identity,
                        transform); // make child of this object
    
                    if (x > 9)
                    {
                        x = 0;
                        z++;
                    }
                }
            }
        }
    
        private void OnDestroy()
        {
            loadHandle.Release();
            // Release all the loaded assets associated with loadHandle
            // Note that if you do not make loaded addressables a child of this object,
            // then you will need to devise another way of releasing the handle when
            // all the individual addressables are destroyed.
        }
    }
    
    

    When you use Task-based operation handling, you can use the C# Task class methods such as WhenAll to control which operations you run in parallel and which you want to run in sequence. The following example illustrates how to wait for more than one operation to finish before moving onto the next task:

    
    // Load the Prefabs
    var prefabOpHandle = Addressables.LoadAssetsAsync<GameObject>(
        keys, null, Addressables.MergeMode.Union, false);
    
    // Load a Scene additively
    var sceneOpHandle
        = Addressables.LoadSceneAsync(nextScene,
            UnityEngine.SceneManagement.LoadSceneMode.Additive);
    
    await System.Threading.Tasks.Task.WhenAll(prefabOpHandle.Task, sceneOpHandle.Task);
    
    

    Additional resources

    • Asynchronous programming scenarios
    • Wait for asynchronous loads to complete
    • Wait for asynchronous loads with coroutines
    • Wait for asynchronous loads with events
    In This Article
    Back to top
    Copyright © 2025 Unity Technologies — Trademarks and terms of use
    • Legal
    • Privacy Policy
    • Cookie Policy
    • Do Not Sell or Share My Personal Information
    • Your Privacy Choices (Cookie Settings)