/// <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; }
/// <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; }
/// <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); }
/// <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; }
/// <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(); }
/// <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(); }
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); }
/// <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); }
/// <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); }
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); }