public void ForceUnloadAssets(MemeryHold hold = MemeryHold.Once) { List <string> tempList = new List <string>(); Dictionary <string, AssetCache> .Enumerator e = m_AssetCaches.GetEnumerator(); while (e.MoveNext()) { if (e.Current.Value.hold <= hold) { tempList.Add(e.Current.Key); } } for (int i = 0; i < tempList.Count; ++i) { // 立即移除 RemoveCachedAsset(tempList[i]); } tempList.Clear(); tempList = null; System.GC.Collect(); }
/// <summary> /// 查找或创建 AssetCache /// </summary> /// <param name="key"></param> /// <param name="assetBundle"></param> /// <param name="assetName"></param> /// <param name="type"></param> /// <param name="hold"></param> /// <param name="preload"></param> /// <returns></returns> private AssetCache GenAssetCache(string key, string assetBundle, string assetName, System.Type type, MemeryHold hold, bool preload = false) { if (m_AssetCaches.TryGetValue(key, out AssetCache cache)) { Debug.Assert(assetBundle == cache.assetbundleName && assetName == cache.assetName && type == cache.type, "Cached Asset is not same."); if (cache.hold < hold) { cache.hold = hold; } if (!preload) { cache.refCount++; } } else { cache = new AssetCache { assetName = assetName, assetbundleName = assetBundle, type = type, hold = hold, refCount = preload ? 0 : 1, }; m_AssetCaches.Add(key, cache); } #if UNITY_EDITOR isDirty = true; #endif return(cache); }
/// <summary> /// Loads the asset async. /// </summary> /// <param name="assetBundle">Asset bundle.</param> /// <param name="assetName">Asset name.</param> /// <param name="type">Type.</param> /// <param name="callback">Callback.</param> /// <param name="preload">If set to <c>true</c> preload asset and if <paramref name="memeryHold"/> is not "Always", ref count will no increase.</param> /// <param name="memeryHold">Memery hold.</param> public string LoadAssetAsync(string assetBundle, string assetName, System.Type type, OnLoadComplete callback = null, bool preload = false, MemeryHold memeryHold = MemeryHold.Once) { if (string.IsNullOrEmpty(assetBundle)) { return(string.Empty); } //Debug.Log(string.Format("LoadAssetAsync {0}, {1}", assetName, Time.frameCount)); // if (type != typeof(UnityEngine.U2D.SpriteAtlas)) // assetBundle = assetBundle.ToLower(); //根据项目 获得资源的主键,主要是处理特殊资源 string key = AssetKey(assetBundle, assetName, type); // 查找或创建一个AssetCache AssetCache cache = GenAssetCache(key, assetBundle, assetName, type, memeryHold, preload); // 判断是否正在Loading if (IsInLoading(key)) { // 如果同一个资源已经在Loading,不用再新开加载 RegistCallback(key, callback); return(key); } // 注册回调 RegistCallback(key, callback); // 如果缓存区已经有资源 if (cache.obj != null) { m_CallbackTemp.Add(key); return(key); } AssetBundleLoadAssetOperation ao = AssetBundleManager.LoadAssetAsync(assetBundle, assetName, type); if (ao != null) { m_InProgressOperations.Add(ao); } return(key); }
/// <summary> /// Loads the asset async. /// </summary> /// <param name="assetBundle">Asset bundle.</param> /// <param name="assetName">Asset name.</param> /// <param name="callback">Callback.</param> /// <param name="preload">If set to <c>true</c> preload.</param> /// <param name="memeryHold">Memery hold.</param> /// <typeparam name="T">The 1st type parameter.</typeparam> public string LoadAssetAsync <T>(string assetBundle, string assetName = null, OnLoadComplete callback = null, bool preload = false, MemeryHold memeryHold = MemeryHold.Once) where T : Object { return(LoadAssetAsync(assetBundle, assetName, typeof(T), callback, preload, memeryHold)); }