/// <summary>
        /// DO NOT USE FOR <see cref="Component"/>s. Call <see cref="TryGetOrLoadComponentAsync{TComponentType}(UnityEngine.AddressableAssets.AssetReference,out UnityEngine.ResourceManagement.AsyncOperations.AsyncOperationHandle{TComponentType})"/>
        ///
        /// Tries to get an already loaded <see cref="UnityEngine.Object"/> of type <see cref="TObjectType"/>.
        /// Returns <value>true</value> if the object was loaded and sets <paramref name="handle"/> to the completed <see cref="AsyncOperationHandle{TObject}"/>
        /// If the object was not loaded returns <value>false</value>, loads the object and sets <paramref name="handle"/> to the un-completed <see cref="AsyncOperationHandle{TObject}"/>
        /// </summary>
        /// <param name="aRef">The <see cref="AssetReference"/> to load.</param>
        /// <param name="handle">The loading or completed <see cref="AsyncOperationHandle{TObject}"/></param>
        /// <typeparam name="TObjectType">The type of NON-COMPONENT object to load.</typeparam>
        /// <returns><value>true</value> if the object has already been loaded, false otherwise.</returns>
        public static bool TryGetOrLoadObjectAsync <TObjectType>(AssetReference aRef, out AsyncOperationHandle <TObjectType> handle) where TObjectType : Object
        {
            CheckRuntimeKey(aRef);

            var key = aRef.RuntimeKey;

            if (_loadedAssets.ContainsKey(key))
            {
                try
                {
                    handle = _loadedAssets[key].Convert <TObjectType>();
                }
                catch
                {
                    handle = Addressables.ResourceManager.CreateCompletedOperation(_loadedAssets[key].Result as TObjectType, string.Empty);
                }

                return(true);
            }


            if (_loadingAssets.ContainsKey(key))
            {
                try
                {
                    handle = _loadingAssets[key].Convert <TObjectType>();
                }
                catch
                {
                    handle = Addressables.ResourceManager.CreateChainOperation(_loadingAssets[key], chainOp => Addressables.ResourceManager.CreateCompletedOperation(chainOp.Result as TObjectType, string.Empty));
                }
                return(false);
            }


            handle = Addressables.LoadAssetAsync <TObjectType>(aRef);

            _loadingAssets.Add(key, handle);

            handle.Completed += op2 =>
            {
                _loadedAssets.Add(key, op2);
                _loadingAssets.Remove(key);

                OnAssetLoaded?.Invoke(key, op2);
            };

            return(false);
        }
        /// <summary>
        /// DO NOT USE FOR <see cref="UnityEngine.Object"/>s. Call <see cref="TryGetOrLoadObjectAsync{TObjectType}(UnityEngine.AddressableAssets.AssetReference,out UnityEngine.ResourceManagement.AsyncOperations.AsyncOperationHandle{TObjectType})"/>
        ///
        /// Tries to get an already loaded <see cref="Component"/> of type <see cref="TComponentType"/>.
        /// Returns <value>true</value> if the object was loaded and sets <paramref name="handle"/> to the completed <see cref="AsyncOperationHandle{TObject}"/>
        /// If the object was not loaded returns <value>false</value>, loads the object and sets <paramref name="handle"/> to the un-completed <see cref="AsyncOperationHandle{TObject}"/>
        /// </summary>
        /// <param name="aRef">The <see cref="AssetReference"/> to load.</param>
        /// <param name="handle">The loading or completed <see cref="AsyncOperationHandle{TObject}"/></param>
        /// <typeparam name="TComponentType">The type of Component to load.</typeparam>
        /// <returns><value>true</value> if the object has already been loaded, false otherwise.</returns>
        public static bool TryGetOrLoadComponentAsync <TComponentType>(AssetReference aRef, out AsyncOperationHandle <TComponentType> handle) where TComponentType : Component
        {
            CheckRuntimeKey(aRef);

            var key = aRef.RuntimeKey;

            if (_loadedAssets.ContainsKey(key))
            {
                handle = ConvertHandleToComponent <TComponentType>(_loadedAssets[key]);
                return(true);
            }


            if (_loadingAssets.ContainsKey(key))
            {
                handle = Addressables.ResourceManager.CreateChainOperation(_loadingAssets[key], ConvertHandleToComponent <TComponentType>);
                return(false);
            }


            var op = Addressables.LoadAssetAsync <GameObject>(aRef);

            _loadingAssets.Add(key, op);

            op.Completed += op2 =>
            {
                _loadedAssets.Add(key, op2);
                _loadingAssets.Remove(key);

                OnAssetLoaded?.Invoke(key, op2);
            };

            handle = Addressables.ResourceManager.CreateChainOperation <TComponentType, GameObject>(op, chainOp =>
            {
                var go   = chainOp.Result;
                var comp = go.GetComponent <TComponentType>();
                return(Addressables.ResourceManager.CreateCompletedOperation(comp, string.Empty));
            });
            return(false);
        }
예제 #3
0
    public KVResourceLoader(string path = null, Type type = null)
    {
        loadType  = type;
        assetPath = path;
        if (loadType == typeof(Scene))
        {
            loadHandle = Addressables.LoadSceneAsync(path);
        }
        else
        {
            loadHandle = Addressables.LoadAssetAsync <object>(path);
        }

        loadHandle.Completed += handle =>
        {
            if (handle.Status == AsyncOperationStatus.Succeeded)
            {
                Debug.Log($"加载{assetPath}成功: {loadHandle.Result}");
                OnAssetLoaded?.Invoke(loadHandle.Result);
            }
            else
            {
                Debug.LogError($"加载{assetPath}失败: {handle.OperationException}");
            }
        };
#if UNITY_EDITOR
        loadHandle.Completed += handle =>
        {
            if (handle.IsValid() && handle.IsDone)
            {
                GameObject obj = handle.Result as GameObject;
                if (obj != null)
                {
//                    UtilityGame.ShaderRecover(obj);
                }
            }
        };
#endif
    }
예제 #4
0
 /// <inheritdoc />
 protected override void AssetLoaded()
 {
     OnAssetLoaded?.Invoke(Key, this);
 }
 static void AssetLoadedCallback(object key, AsyncOperationHandle handle)
 {
     OnAssetLoaded?.Invoke(key, handle);
 }