//-------------------------------------------------------- // [Author]: 第二世界 // [ Date ]: Tuesday, September 26, 2017 //-------------------------------------------------------- using UnityEngine; using System.Collections; using UnityEngine.UI; using System.Collections.Generic; using System; using System.Reflection; namespace vnxbqy.UI { public class WindowAsyncLoad : MonoBehaviour { List taskQueue = new List(); Task currentTask; public bool busy { get { return currentTask != null; } } public void PushTask(Task _task) { var exist = false; for (int i = taskQueue.Count - 1; i >= 0; i--) { var task = taskQueue[i]; if (task.windowName == _task.windowName) { exist = true; break; } } if (!exist) { taskQueue.Add(_task); } } public void StopTask(string _name) { for (int i = taskQueue.Count - 1; i >= 0; i--) { var task = taskQueue[i]; if (task.windowName == _name) { task.Dispose(); taskQueue.Remove(task); break; } } if (currentTask != null && currentTask.windowName == _name) { currentTask.Dispose(); currentTask = null; NetLinkWin.Hide(); } } public void StopAllTasks() { if (currentTask != null) { currentTask.Dispose(); currentTask = null; } for (int i = 0; i < taskQueue.Count; i++) { var task = taskQueue[i]; task.Dispose(); } taskQueue.Clear(); NetLinkWin.Hide(); } private void LateUpdate() { if (currentTask == null && taskQueue.Count > 0) { currentTask = taskQueue[0]; taskQueue.RemoveAt(0); if (currentTask.windowName != "NetLinkWin") { NetLinkWin.Show(0.5f); } UILoader.LoadWindowAsync(currentTask.windowName, (bool ok, UnityEngine.Object _resource) => { try { if (_resource != null && currentTask != null && currentTask.windowName == _resource.name) { currentTask.Report(ok, _resource); } } catch (Exception ex) { DebugEx.LogError(ex); } finally { currentTask = null; NetLinkWin.Hide(); } }); } } public class TaskGroup { List tasks = new List(); public void AddTask(Task _task) { if (!tasks.Contains(_task)) { tasks.Add(_task); } } public void RemoveTask(Task _task) { if (tasks.Contains(_task)) { tasks.Remove(_task); } } public void NotifyTaskState(Task _task) { bool allReady = true; for (int i = 0; i < tasks.Count; i++) { if (!tasks[i].ready) { allReady = false; break; } } if (allReady) { for (int i = 0; i < tasks.Count; i++) { tasks[i].Done(); } } } } public class Task { public TaskGroup taskGroup { get; private set; } public string windowName { get; private set; } public bool ready = false; Action callBack; bool result = false; UnityEngine.Object asset; public Task(string _windowName, Action _callBack) { windowName = _windowName; callBack = _callBack; } public void Bind(TaskGroup _taskGroup) { taskGroup = _taskGroup; } public void Report(bool _ok, UnityEngine.Object _object) { result = _ok; asset = _object; if (taskGroup != null) { ready = true; taskGroup.NotifyTaskState(this); } else { Done(); } } public void Dispose() { callBack = null; if (taskGroup != null) { taskGroup.RemoveTask(this); } } public void Done() { if (callBack != null) { callBack(result, asset); callBack = null; } } } } }