Beispiel #1
0
        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);
            }
        }
Beispiel #2
0
 public UUIRequest Open(string _name, bool _preloading = false, EOpenMode _openMode = EOpenMode.Additive)
 {
     return(Load(_name, _preloading, _openMode));
 }