docs.unity3d.com
Search Results for

    Show / Hide Table of Contents

    Create asset reference fields

    To add an AssetReference or one of its subclasses, to a MonoBehaviour or ScriptableObject, declare it as a serializable field in the class:

    
    using System;
    using UnityEngine;
    using UnityEngine.AddressableAssets;
    
    internal class DeclaringReferences : MonoBehaviour
    {
        // Any asset type
        public AssetReference reference;
    
        // Prefab assets
        public AssetReferenceGameObject gameObjectReference;
    
        // Sprite asset types
        public AssetReferenceSprite spriteReference;
        public AssetReferenceAtlasedSprite atlasSpriteReference;
    
        // Texture asset types
        public AssetReferenceTexture textureReference;
        public AssetReferenceTexture2D texture2DReference;
        public AssetReferenceTexture3D texture3DReference;
    
        // Any asset type with the specified labels
        [AssetReferenceUILabelRestriction("animals", "characters")]
        public AssetReference labelRestrictedReference;
    
        // Generic asset type (Unity 2020.3+)
        public AssetReferenceT<AudioClip> typedReference;
    
        // Custom asset reference class
        public AssetReferenceMaterial materialReference;
    
        [Serializable]
        public class AssetReferenceMaterial : AssetReferenceT<Material>
        {
            public AssetReferenceMaterial(string guid) : base(guid)
            {
            }
        }
    
        private void Start()
        {
            // Load assets...
        }
    
        private void OnDestroy()
        {
            // Release assets...
        }
    }
    
    
    Note

    Before Unity 2020.1, the Inspector window couldn't display generic fields by default. In earlier versions of Unity, you must make your own non-generic subclass of AssetReferenceT instead. For more information, refer to Create a concrete subclass.

    Load and release asset references

    The AssetReference class provides its own methods to load, instantiate, and release a referenced asset. You can also use an AssetReference instance as a key to any Addressables class method that loads assets.

    The following example instantiates an AssetReference as a child of the current GameObject and releases it when the parent is destroyed:

    
    using UnityEngine;
    using UnityEngine.AddressableAssets;
    
    internal class InstantiateReference : MonoBehaviour
    {
        [SerializeField]
        private AssetReferenceGameObject reference;
    
        void Start()
        {
            if (reference != null)
                reference.InstantiateAsync(this.transform);
        }
    
        private void OnDestroy()
        {
            if (reference != null && reference.IsValid())
                reference.ReleaseAsset();
        }
    }
    
    

    Refer to Load an AssetReference for more information and examples about loading assets using AssetReferences.

    Use labels with asset references

    Use the AssetReferenceUILabelRestriction attribute to restrict the assets you can assign to an AssetReference field to those with specific labels. You can use this attribute reference and AssetReference subclasses to restrict assignment by both type and label.

    The following example prevents someone from assigning an Addressable asset to a reference that doesn't have either the label, animals, or the label, characters:

    
    [AssetReferenceUILabelRestriction("animals", "characters")]
    public AssetReference labelRestrictedReference;
    
    

    This attribute only prevents assigning assets without the specified label using an Inspector in the Unity Editor. You can still assign an asset without the label to the field using a script.

    You can't drag non-Addressable assets to a field with the AssetReferenceUILabelRestriction attribute.

    Create a concrete subclass

    If you can't use the generic form of the AssetReference class directly, such as in versions of Unity prior to Unity 2020.1 or when using the CustomPropertyDrawer attribute, you can create a concrete subclass.

    To create a concrete subclass, inherit from the AssetReferenceT class and specify the asset type. You must also pass the GUID string to the base class constructor:

    
    [Serializable]
    internal class AssetReferenceMaterial : AssetReferenceT<Material>
    {
        public AssetReferenceMaterial(string guid) : base(guid)
        {
        }
    }
    
    

    You can use your custom AssetReference subclass in another script the same way as other AssetReference types:

    
    // Custom asset reference class
    public AssetReferenceMaterial materialReference;
    
    
    In This Article
    Back to top
    Copyright © 2024 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)