예제 #1
0
        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();
        }
예제 #2
0
        /// <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);
        }
예제 #3
0
        /// <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);
        }
예제 #4
0
 /// <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));
 }