/// <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); }
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 }
/// <inheritdoc /> protected override void AssetLoaded() { OnAssetLoaded?.Invoke(Key, this); }
static void AssetLoadedCallback(object key, AsyncOperationHandle handle) { OnAssetLoaded?.Invoke(key, handle); }