/// <summary> /// 异步加载接口 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="assetName"></param> /// <param name="callback"></param> /// <returns></returns> public int AsyncLoad <T>(string assetName, Action <T> callback) where T : UnityEngine.Object { if (!this.loder.Manifest.IsHashName) { assetName = string.Format(RUNTIME, assetName.ToLower()); } else { assetName = assetName.ToLower(); } List <LoaderTaskData> taskQueue = new List <LoaderTaskData>(); //获取依赖 var mainItem = loder.Manifest.GetManifest(assetName); if (mainItem != null) { //依赖资源 foreach (var r in mainItem.Depend) { var task = new LoaderTaskData(r, typeof(Object)); taskQueue.Add(task); } //主资源, var mainTask = new LoaderTaskData(mainItem.Path, typeof(Object), true); taskQueue.Add(mainTask); //添加任务组 var taskGroup = new LoaderTaskGroup(this, assetName, mainItem, taskQueue, //Loader接口 (p, obj) => { //完成回调 callback(obj as T); }); taskGroup.Id = this.taskIDCounter++; AddTaskGroup(taskGroup); //开始任务 DoNextTask(); return(taskGroup.Id); } else { BDebug.LogError("资源不存在:" + assetName); } return(-1); }
/// <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); //开始task curDoTask.DoNextTask(); //注册完成回调 curDoTask.OnAllTaskCompleteCallback += (a, b) => { // DoNextTask(); }; } }
/// <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 { path = string.Format(RUNTIME, path.ToLower()); List <LoaderTaskData> taskQueue = new List <LoaderTaskData>(); //获取依赖 var mainItem = loder.Manifest.GetManifest(path); if (mainItem != null) { //依赖任务 foreach (var r in mainItem.Depend) { var task = new LoaderTaskData(r, typeof(Object)); taskQueue.Add(task); } //主任务 var mainTask = new LoaderTaskData(mainItem.Path, typeof(Object)); taskQueue.Add(mainTask); //添加任务组 LoaderTaskGroup taskGroup = new LoaderTaskGroup(mainItem.Path, ASYNC_TASK_UNIT, taskQueue, AsyncLoadAssetBundle, //Loader接口 (p, obj) => { //完成回调 callback(obj as T); }); taskGroup.Id = this.taskIDCounter++; AddTaskGroup(taskGroup); //开始任务 DoNextTask(); return(taskGroup.Id); } return(-1); }
/// <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 = loder.Manifest.GetManifest(curDoTask.MainAsset); BDebug.LogFormat(">>>>任务组|id:{0} 任务数:{1} - {2}", curDoTask.Id, curDoTask.TaskQueueNum, item.Path); //开始task curDoTask.DoNextTask(); //注册完成回调 curDoTask.onTaskCompleteCallback += (a, b) => { // DoNextTask(); }; } }
/// <summary> /// 添加一个任务组 /// </summary> /// <param name="taskGroup"></param> public void AddTaskGroup(LoaderTaskGroup taskGroup) { this.allTaskGroupList.Add(taskGroup); }
/// <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 assetPath in assetsPath) { var path = string.Format(RUNTIME, assetPath.ToLower()); // var mainItem = loder.Manifest.GetManifest(path); List <LoaderTaskData> taskQueue = new List <LoaderTaskData>(); //获取依赖 if (mainItem == null) { BDebug.LogError("不存在:" + path); total--; continue; } //依赖任务 foreach (var r in mainItem.Depend) { var task = new LoaderTaskData(r, typeof(Object)); taskQueue.Add(task); } //主任务 var mainTask = new LoaderTaskData(mainItem.Path, typeof(Object)); taskQueue.Add(mainTask); //添加任务组 //加载颗粒度10个 LoaderTaskGroup taskGroup = new LoaderTaskGroup(mainItem.Path, ASYNC_TASK_UNIT, taskQueue, AsyncLoadAssetBundle, //Load接口 (p, obj) => { counter++; //注意返回加载的id,不是具体地址的id retMap[assetPath] = 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); }
public void RunNext() { LoaderTaskGroup.ReinitLoader(this); State = LoaderState.Running; DoWork(); }