Пример #1
0
        /// <summary>
        /// 从本地缓存中加载
        /// </summary>
        /// <param name="assetBundle"></param>
        /// <param name="scriptObj"></param>
        /// <param name="srcPath">资源路径</param>
        /// <param name="srcName"></param>
        /// <param name="type"></param>
        /// <param name="order"></param>
        /// <param name="isInstance"></param>
        /// <param name="progress">进度回调</param>
        /// <param name="complete"></param>
        /// <param name="args"></param>
        public void LoadFromAssetBundle(AssetBundle assetBundle, System.Object scriptObj, string srcPath, string srcName, ResourceType type, Order order, bool isInstance, LoadingProgressCallback progress, LoadCompleteCallback complete, params string[] args)
        {
            m_assetBundle = assetBundle;

            if (scriptObj != null)
            {
                m_scriptObj = scriptObj;
                m_hasScript = true;
            }
            else
            {
                m_hasScript = false;
            }

            m_scriptObj        = scriptObj;
            m_srcPath          = srcPath;
            m_srcName          = srcName;
            m_type             = type;
            m_order            = order;
            m_isInstance       = isInstance;
            m_progressCallback = progress;
            m_completeCallback = complete;
            m_customData       = args;
            m_isDestroyed      = false;
            m_isLoading        = true;
            m_loadType         = LoadType.fromAssetBundle;
        }
Пример #2
0
        /// <summary>
        /// 开始加载
        /// </summary>
        /// <param name="scriptObj">请求的脚本</param>
        /// <param name="srcPath">资源路径</param>
        /// <param name="srcName">资源名</param>
        /// <param name="type">ResourceType</param>
        /// <param name="order">Order</param>
        /// <param name="isInstance">是否实例化</param>
        /// <param name="isDownload">是否需要下载</param>
        /// <param name="progress">进度回调</param>
        /// <param name="complete">结束回调</param>
        /// <param name="args">自定义参数</param>
        public void LoadFromWWW(System.Object scriptObj, string srcPath, string srcName, ResourceType type, Order order, bool isInstance, bool isDownload, LoadingProgressCallback progress, LoadCompleteCallback complete, params string[] args)
        {
            if (scriptObj != null)
            {
                m_scriptObj = scriptObj;
                m_hasScript = true;
            }
            else
            {
                m_hasScript = false;
            }

            m_scriptObj        = scriptObj;
            m_srcPath          = srcPath;
            m_srcName          = srcName;
            m_type             = type;
            m_order            = order;
            m_isInstance       = isInstance;
            m_isNeedDownload   = isDownload;
            m_progressCallback = progress;
            m_completeCallback = complete;
            m_customData       = args;
            m_isDestroyed      = false;

            if (m_Www == null)
            {
                if (m_isNeedDownload)
                {
                    m_Www       = new WWW(GetPath(m_srcPath));
                    m_isLoading = true;
                }
            }

            m_loadType = LoadType.fromWWW;
        }
Пример #3
0
        /// <summary>
        /// 创建加载信息
        /// </summary>
        /// <param name="scriptObj">请求的脚本</param>
        /// <param name="srcPath">资源路径</param>
        /// <param name="srcName">资源名</param>
        /// <param name="type">ResourceType</param>
        /// <param name="isInstance">是否实例化</param>
        /// <param name="isCache">是否缓存资源,可实例化的资源在引用计数为0时也不销毁,不可实例化资源跟引用计数无关</param>
        /// <param name="progress">进度回调</param>
        /// <param name="complete">结束回调</param>
        /// <param name="args">自定义参数</param>
        public static LoaderInfo CreateLoaderInfo(System.Object scriptObj, LoadingProgressCallback progress, LoadCompleteCallback complete, params string[] args)
        {
            LoaderInfo t_loaderInfo = new LoaderInfo();

            t_loaderInfo.scriptObj        = scriptObj;
            t_loaderInfo.progressCallback = progress;
            t_loaderInfo.completeCallback = complete;
            t_loaderInfo.customData       = args;

            return(t_loaderInfo);
        }
Пример #4
0
        /// <summary>
        /// 回收后可以再利用
        /// </summary>
        /// <param name="destory"></param>
        public void Release(bool destory = false)
        {
            m_loaded      = 0;
            m_isLoading   = false;
            m_isDestroyed = true;

            m_assetBundle = null;

            if (m_Www != null)
            {
                if (destory && string.IsNullOrEmpty(m_Www.error) && m_Www.assetBundle != null)
                {
                    m_Www.assetBundle.Unload(true);
                }

                m_Www.Dispose();
                m_Www = null;
            }

            m_progressCallback = null;
            m_completeCallback = null;
            m_customData       = null;
        }
Пример #5
0
        /// <summary>
        /// 提前预加载的所有资源,都需要由提供加载列表的指定脚本调用资源管理器的DiscardUsage销毁
        /// </summary>
        /// <param name="list"></param>
        /// <param name="onComplete">全部完成回调</param>
        /// <param name="onProgress">总进度</param>
        public void Load(List <TaskDesc> list, Action onComplete, TaskLoadingProgress onProgress = null)
        {
            if (list.Count < 1)
            {
                return;
            }

            if (m_queue == null)
            {
                m_queue = new Dictionary <string, TaskDesc>();
            }

            m_onComplete  = onComplete;
            m_onProgress  = onProgress;
            m_loadedCount = 0;

            LoadingProgressCallback t_progress = null;

            if (onProgress != null)
            {
                t_progress = OnProgress;
            }

            UnityEngine.Object t_obj = null;

            foreach (var item in list)
            {
                if (!m_assetsMgr.GetResource(item.script, item.path, item.name, item.instance, item.type, out t_obj))
                {
                    m_queue.Add(item.path, item);
                    m_assetsMgr.GetResource(item.script, item.path, item.name, t_progress, OnComplete, item.type, item.instance, item.isCache, item.args);
                }
            }

            m_totalProgress = m_queue.Count;
            list.Clear();
        }
Пример #6
0
        /// <summary>
        /// 提前预加载的所有资源,都需要由提供加载列表的指定脚本调用资源管理器的DiscardUsage销毁
        /// </summary>
        /// <param name="list"></param>
        /// <param name="onComplete">全部完成回调</param>
        /// <param name="onProgress">总进度</param>
        public void Load(List <QueueLoaderDesc> list, Action onComplete, QueueLoadingProgress onProgress = null)
        {
            if (list.Count < 1)
            {
                return;
            }

            if (m_queue == null)
            {
                m_queue = new Dictionary <string, QueueLoaderDesc>();
            }

            m_onComplete  = onComplete;
            m_onProgress  = onProgress;
            m_loadedCount = 0;

            LoadingProgressCallback t_progress = null;

            if (onProgress != null)
            {
                t_progress = OnProgress;
            }

            UnityEngine.Object t_obj = null;

            foreach (var item in list)
            {
                //if (!Global.It.LocalResMgr.GetLocalResource(item.script, item.path, item.name, item.instance,item.type, out t_obj))
                //{
                //    m_queue.Add(item.path, item);
                //    Global.It.LocalResMgr.GetLocalResource(item.script, item.path, item.name, t_progress, OnComplete, item.type, item.order, item.instance, item.args);
                //}
            }

            m_totalProgress = m_queue.Count;
            list.Clear();
        }
Пример #7
0
        private Queue <AssetLoader> m_loaderPool = new Queue <AssetLoader>();                           //加载器缓存池

        /// <summary>
        /// 获取资源
        /// 场景不会返回对象资源,文本是同步加载,并且它们都不缓存
        /// </summary>
        /// <param name="scriptObject">引用资源的脚本</param>
        /// <param name="path">资源包全路径(带名字)</param>
        /// <param name="name">要请求的资源名</param>
        /// <param name="progress"></param>
        /// <param name="complete"></param>
        /// <param name="type">ResourceType</param>
        /// <param name="isInstance">是否实例化</param>
        /// <param name="isCache">是否缓存资源,可实例化的资源在引用计数为0时也不销毁,不可实例化资源跟引用计数无关</param>
        /// <param name="args"></param>
        /// <returns>原始对象,如果能直接得到则为从缓存中取出</returns>
        public Object GetResource(System.Object scriptObject, string path, string name, LoadingProgressCallback progress, LoadCompleteCallback complete, AssetType type, bool isInstance, bool isCache, params string[] args)
        {
            Asset       t_asset;
            AssetLoader t_loader;
            LoaderInfo  t_loaderInfo;

            if (m_dictResource.TryGetValue(path, out t_asset))
            {
                if (t_asset.OriginalObj != null)
                {
                    if (progress != null)
                    {
                        progress(path, name, 1f, args);
                    }

                    if (complete != null)
                    {
                        if (IsNeedIncreaseRefCount(type, isInstance))
                        {
                            t_asset.AddRefCount(scriptObject);
                        }

                        return(ResCallBackReady(path, name, t_asset.OriginalObj, isInstance, complete, args));
                    }

                    return(null);
                }
                else//第一个加载此路径的资源包还未加载完成,第2次已经请求了
                {
                    if (IsNeedIncreaseRefCount(type, isInstance))
                    {
                        t_asset.AddRefCount(scriptObject);
                    }

                    t_loaderInfo = AssetLoader.CreateLoaderInfo(scriptObject, progress, complete, args);
                    m_dictLoader[path].Add(t_loaderInfo);
                }
            }
            else//加载资源包
            {
                t_asset = new Asset(name, path, isCache);
                m_dictResource.Add(path, t_asset);

                if (IsNeedIncreaseRefCount(type, isInstance))
                {
                    t_asset.AddRefCount(scriptObject);
                }

                t_loader     = PoolFrom();
                t_loaderInfo = AssetLoader.CreateLoaderInfo(scriptObject, progress, complete, args);
                t_loader.Add(t_loaderInfo);
                t_loader.Load(path, name, type, isInstance, isCache);
                m_dictLoader.Add(path, t_loader);
            }

            return(null);
        }
Пример #8
0
        /// <summary>
        /// 获取资源
        /// 场景不会返回对象资源,文本是同步加载,并且它们都不缓存
        /// </summary>
        /// <param name="scriptObject">引用资源的脚本</param>
        /// <param name="path">资源包全路径(带名字)</param>
        /// <param name="name">要请求的资源名</param>
        /// <param name="progress"></param>
        /// <param name="complete"></param>
        /// <param name="type">ResourceType</param>
        /// <param name="order">优先级</param>
        /// <param name="isInstance">是否实例化</param>
        /// <param name="args"></param>
        /// <returns>原始对象,如果能直接得到则为从缓存中取出</returns>
        public Object GetLocalResource(System.Object scriptObject, string path, string name, LoadingProgressCallback progress, LoadCompleteCallback complete, ResourceType type, Order order, bool isInstance, params string[] args)
        {
            ResInfo   t_info;
            ResLoader t_loader;
            bool      t_isNeedDownload = true;

            if (m_dictLocalResource.TryGetValue(path, out t_info))
            {
                if (t_info.assetBundle != null)//之前已经加载过相同路径的资源
                {
                    Object t_assetObj = t_info.GetAsset(name);

                    if (t_assetObj != null)
                    {
#if Debug
                        Debug.Log("from cache");
#endif
                        if (progress != null)
                        {
                            progress(path, name, 1f, args);
                        }

                        if (complete != null)
                        {
                            if (IsNeedIncreaseRefCount(type, isInstance))
                            {
                                t_info.AddRefCount(scriptObject);
                            }

                            return(ResCallBackReady(path, name, complete, t_assetObj, isInstance, args));
                        }

                        return(null);
                    }
                    else
                    {
                        if (IsNeedIncreaseRefCount(type, isInstance))
                        {
                            t_info.AddRefCount(scriptObject);
                        }

                        t_loader = new ResLoader();
                        t_loader.LoadFromAssetBundle(t_info.assetBundle, scriptObject, path, name, type, order, isInstance, progress, complete, args);
                        m_dictDownload[(int)order].Add(t_loader);
                        ++m_loaderCount;
                        return(null);
                    }
                }
                else//第一个加载此路径的资源包还未加载完成,第2次已经请求了
                {
                    if (IsNeedIncreaseRefCount(type, isInstance))
                    {
                        t_info.AddRefCount(scriptObject);
                    }

                    t_isNeedDownload = false;
                }
            }
            else//加载资源包
            {
                t_info = new ResInfo(path);
                m_dictLocalResource.Add(path, t_info);

                if (IsNeedIncreaseRefCount(type, isInstance))
                {
                    t_info.AddRefCount(scriptObject);
                }
            }

            t_loader = new ResLoader();
            t_loader.LoadFromWWW(scriptObject, path, name, type, order, isInstance, t_isNeedDownload, progress, complete, args);
            m_dictDownload[(int)order].Add(t_loader);
            ++m_loaderCount;
            return(null);
        }
Пример #9
0
 /// <summary>
 /// 初始化资源,会实例化
 /// 场景不会返回对象资源,文本是同步加载,并且它们都不缓存
 /// </summary>
 /// <param name="scriptObject">引用资源的脚本</param>
 /// <param name="path">资源包全路径(带名字)</param>
 /// <param name="name">要请求的资源名</param>
 /// <param name="progress"></param>
 /// <param name="complete"></param>
 /// <param name="type">ResourceType</param>
 /// <param name="order">优先级</param>
 /// <param name="args"></param>
 /// <returns></returns>
 public void GetLocalResource(System.Object scriptObject, string path, string name, LoadingProgressCallback progress, LoadCompleteCallback complete, ResourceType type, Order order, params string[] args)
 {
     GetLocalResource(scriptObject, path, name, progress, complete, type, order, true, args);
 }
Пример #10
0
        private int m_loaderCount = 0;                                                                //统计所有加载器,!!!需要与实际加载器数同步?

        /// <summary>
        /// 获取实例化后的资源,默认类型为gameobject,默认优先级
        /// 场景不会返回对象资源,文本是同步加载,并且它们都不缓存
        /// </summary>
        /// <param name="scriptObject">引用资源的脚本</param>
        /// <param name="path">资源包全路径(带名字)</param>
        /// <param name="name">要请求的资源名</param>
        /// <param name="progress"></param>
        /// <param name="complete"></param>
        /// <param name="args"></param>
        public void GetLocalResource(System.Object scriptObject, string path, string name, LoadingProgressCallback progress, LoadCompleteCallback complete, params string[] args)
        {
            GetLocalResource(scriptObject, path, name, progress, complete, ResourceType.gameobject, Order.o_default, args);
        }