/// <summary> /// 异步加载接口 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="path"></param> /// <param name="callback"></param> /// <returns></returns> public int AsyncLoad <T>(string path, Action <T> callback) where T : UnityEngine.Object { List <LoaderTaskData> taskQueue = new List <LoaderTaskData>(); //获取依赖 var dependAssets = config.Manifest.GetDirectDependenciesByName(path); if (dependAssets == null) { return(-1); } // foreach (var r in dependAssets) { var task = new LoaderTaskData(r, typeof(Object)); taskQueue.Add(task); } var mainAsset = dependAssets[dependAssets.Length - 1]; //添加任务组 LoaderTaskGroup taskGroup = new LoaderTaskGroup(mainAsset, 10, taskQueue, AsyncLoadAssetBundle, (p, obj) => { callback(obj as T); }); taskGroup.Id = this.taskIDCounter++; AddTaskGroup(taskGroup); //开始任务 DoNextTask(); return(taskGroup.Id); }
/// <summary> /// 异步加载接口 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="path"></param> /// <param name="callback"></param> /// <returns></returns> public int AsyncLoad <T>(string path, Action <T> callback) where T : UnityEngine.Object { Queue <LoaderTaskData> taskQueue = new Queue <LoaderTaskData>(); //获取依赖 path = GetExistPath(path); var res = manifest.Manifest.GetDirectDependencies(path); foreach (var r in res) { var task = new LoaderTaskData(r, typeof(Object)); taskQueue.Enqueue(task); } //添加任务组 LoaderTaskGroup taskGroup = new LoaderTaskGroup(5, taskQueue, AsyncLoadAssetBundle, (p, obj) => { callback(obj as T); }); taskGroup.Id = this.taskIDCounter++; AddTaskGroup(taskGroup); //开始任务 DoNextTask(); return(taskGroup.Id); }
/// <summary> /// 异步加载 多个 /// </summary> /// <param name="assetsPath">资源</param> /// <param name="onLoadComplete">加载结束</param> /// <param name="onLoadProcess">进度</param> /// <returns>taskid</returns> public List <int> AsyncLoad(IList <string> assetsPath, Action <IDictionary <string, Object> > onLoadComplete, Action <int, int> onLoadProcess) { List <int> idList = new List <int>(); IDictionary <string, Object> retMap = new Dictionary <string, Object>(); assetsPath = assetsPath.Distinct().ToList(); //去重 int total = assetsPath.Count; //source int counter = 0; foreach (var asset in assetsPath) { var _asset = asset; List <LoaderTaskData> taskQueue = new List <LoaderTaskData>(); var dependAssets = config.Manifest.GetDirectDependenciesByName(asset); //获取依赖 if (dependAssets == null) { total--; continue; } foreach (var r in dependAssets) { var task = new LoaderTaskData(r, typeof(Object)); taskQueue.Add(task); } var mainAsset = dependAssets[dependAssets.Length - 1]; //添加任务组 //加载颗粒度10个 LoaderTaskGroup taskGroup = new LoaderTaskGroup(mainAsset, 10, taskQueue, AsyncLoadAssetBundle, (p, obj) => { counter++; //注意返回加载的id,不是具体地址的id retMap[_asset] = obj; if (onLoadProcess != null) { onLoadProcess(counter, total); } //完成 if (retMap.Count == total) { onLoadComplete(retMap); } }); taskGroup.Id = this.taskIDCounter++; AddTaskGroup(taskGroup); idList.Add(taskGroup.Id); } //开始任务 DoNextTask(); // return(idList); }
/// <summary> /// 异步加载 多个 /// </summary> /// <param name="assetsPath">资源</param> /// <param name="onLoadComplete">加载结束</param> /// <param name="onLoadProcess">进度</param> /// <returns>taskid</returns> public List <int> AsyncLoad(IList <string> assetsPath, Action <IDictionary <string, Object> > onLoadComplete, Action <int, int> onLoadProcess) { List <int> idList = new List <int>(); IDictionary <string, Object> retMap = new Dictionary <string, Object>(); assetsPath = assetsPath.Distinct().ToList(); //去重 int total = assetsPath.Count; //source int counter = 0; foreach (var asset in assetsPath) { var _asset = asset; Queue <LoaderTaskData> taskQueue = new Queue <LoaderTaskData>(); //获取依赖 var path = GetExistPath(_asset); if (string.IsNullOrEmpty(path)) { Debug.LogError("不存在资源:" + _asset); total--; continue; } var res = manifest.Manifest.GetDirectDependencies(path); foreach (var r in res) { var task = new LoaderTaskData(r, typeof(Object)); taskQueue.Enqueue(task); } //添加任务组 //加载颗粒度10个 LoaderTaskGroup taskGroup = new LoaderTaskGroup(10, taskQueue, AsyncLoadAssetBundle, (p, obj) => { counter++; //注意返回加载的id,不是具体地址的id retMap[_asset] = obj; if (onLoadProcess != null) { onLoadProcess(counter, total); } //完成 if (retMap.Count == total) { onLoadComplete(retMap); } }); taskGroup.Id = this.taskIDCounter++; AddTaskGroup(taskGroup); idList.Add(taskGroup.Id); } //开始任务 DoNextTask(); // return(idList); }
/// <summary> /// 核心功能,所有任务靠这个推进度 /// 执行下个任务 /// </summary> void DoNextTask() { if (this.allTaskGroupList.Count == 0) { return; } //当前任务组执行完毕,执行下一个 if ((curDoTask == null || curDoTask.IsComplete) && this.allTaskGroupList.Count > 0) { curDoTask = this.allTaskGroupList[0]; this.allTaskGroupList.RemoveAt(0); var item = config.Manifest.GetManifestItemByHash(curDoTask.MainAsset); BDebug.LogFormat(">>>>任务组|id:{0} 任务数:{1} - {2}", curDoTask.Id, curDoTask.TaskQueueNum, item.Name); //开始task curDoTask.DoNextTask(); //注册完成回调 curDoTask.onTaskCompleteCallback += (a, b) => { DoNextTask(); }; } }
/// <summary> /// 核心功能,所有任务靠这个推进度 /// 执行下个任务 /// </summary> void DoNextTask() { if (this.allTaskGroupList.Count == 0) { return; } //当前任务组执行完毕,执行下一个 if ((curDoTask == null || curDoTask.IsComplete) && this.allTaskGroupList.Count > 0) { curDoTask = this.allTaskGroupList[0]; this.allTaskGroupList.RemoveAt(0); BDebug.LogFormat(">>>>任务组|id:{1} count:{0} mainasset:{2}", curDoTask.TaskQueueNum, curDoTask.Id, curDoTask.MainAsset); //开始task curDoTask.DoNextTask(); //注册完成回调 curDoTask.onTaskCompleteCallback += (a, b) => { DoNextTask(); }; } }
/// <summary> /// 添加一个任务组 /// </summary> /// <param name="taskGroup"></param> public void AddTaskGroup(LoaderTaskGroup taskGroup) { this.allTaskGroupList.Add(taskGroup); }