/// <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();
                };
            }
        }
예제 #3
0
        /// <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);
        }
예제 #4
0
        /// <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();
                };
            }
        }
예제 #5
0
 /// <summary>
 /// 添加一个任务组
 /// </summary>
 /// <param name="taskGroup"></param>
 public void AddTaskGroup(LoaderTaskGroup taskGroup)
 {
     this.allTaskGroupList.Add(taskGroup);
 }
예제 #6
0
        /// <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);
        }
예제 #7
0
 public void RunNext()
 {
     LoaderTaskGroup.ReinitLoader(this);
     State = LoaderState.Running;
     DoWork();
 }