UUIRequest Load(string _name, bool _preloading, EOpenMode _openMode) { UUIWorker outWorker; //LOADING_AGAIN: if (TryGetWoker(_name, out outWorker)) { //> 已经加载完毕了 if (outWorker.State == EWorkerState.Loading || outWorker.State == EWorkerState.Working) { return(outWorker.Request); } else { //> 这段代码是不会发生的 /*if (null == outWorker.Script) * { * RemoveFromContainer(outWorker); * UnloadResourceByInfo(outWorker.Info); * goto LOADING_AGAIN; * }*/ if (_preloading) { outWorker.SetRest(); } else { WorkLine.Add(outWorker); if (WorkLine.Count > 1) { WorkLine[WorkLine.Count - 2].SetDownward(); } outWorker.SetOpen(); outWorker.SetUpward(); } return(outWorker.Request); } } else { UUIInfo outUIInfo; if (Manager.TryGetUIInfo(_name, out outUIInfo) == false) { Output.Error("没有找到 {0} 的信息,加载UI失败!", _name); return(null); } var worker = LoadUI(outUIInfo, _preloading ? EWorkerState.Resting : EWorkerState.Working, (WORKER, TEMPLATE) => { //> 加载完成,但是资源不存在 if (TEMPLATE == null) { RemoveFromContainer(WORKER); UnloadResourceByInfo(WORKER.Info); Output.Error("UI对象为空:{0}", outUIInfo.GetName()); return; } //> 在加载期间调用了Dispose if (Container.Contains(WORKER) == false) { if (false == WORKER.Info.IsSceneObject) { GameObject.Destroy(TEMPLATE); } UnloadResourceByInfo(WORKER.Info); Output.Warning("不存在的容器实例:{0}", WORKER.Info.GetName()); return; } if (false == WORKER.Info.IsSceneObject) { GameObject.DontDestroyOnLoad(TEMPLATE); } //> 对象身上没有挂在UUI脚本 if (false == WORKER.SetLoaded(Manager, TEMPLATE)) { Output.Error("在UI对象{0}身上没有发现UUI脚本对象", _name); UnloadWorker(WORKER, TEMPLATE); return; } WORKER.Request.InitScript(TEMPLATE.GetComponent <UUIView>()); //> 处理下一个环节的工作 if (WORKER.NextState == EWorkerState.Working) { WORKER.SetOpen(); if (WorkLine[WorkLine.Count - 1] != WORKER) { WORKER.SetDownward(); } else { WORKER.SetUpward(); } } //> 加载期间被设置了退出 else if (WORKER.NextState == EWorkerState.Exiting) { WORKER.SetClose(WORKER.NextExitState); } }); if (_preloading == false && WorkLine.Count > 1) { WorkLine[WorkLine.Count - 2].SetDownward(); } //> 根据工作模式,清理工作队列 if (_preloading == false && _openMode == EOpenMode.Single) { int idx = WorkLine.FindIndex((v) => worker == v); if (idx > 0) { List <UUIWorker> temp = new List <UUIWorker>(); for (int i = 0; i < idx; i++) { temp.Insert(0, WorkLine[i]); } WorkLine.RemoveRange(0, idx); //> 处理需要下岗的工人 foreach (var v in temp) { v.SetClose(false); } temp.Clear(); } } return(worker?.Request); } }
public UUIRequest Open(string _name, bool _preloading = false, EOpenMode _openMode = EOpenMode.Additive) { return(Load(_name, _preloading, _openMode)); }