Пример #1
0
        /// <summary>
        /// 关闭UI后执行一个回调
        /// </summary>
        /// <param name="uiName">UI名字</param>
        /// <param name="callback">关闭回调</param>
        public void CloseWithCallback(string uiName, Action callback)
        {
            UIContext uiContext = FindUIContext(uiName);

            if (uiContext != null)
            {
                IUIContainer uiContainer = null;
                if (showDic.TryGetValue(uiContext.UIData.UIType, out uiContainer))
                {
                    if (uiContainer is UIStackContainer)
                    {
                        //当前UI在栈顶才能被关闭
                        UIStackContainer uiStackContainer = uiContainer as UIStackContainer;
                        string           topUiName        = uiStackContainer.Peek();
                        if (topUiName == uiName)
                        {
                            uiContainer?.Pop(callback);
                        }
                    }
                    else
                    {
                        uiContainer?.Close(uiName, callback);
                    }
                }
            }
        }
Пример #2
0
        /// <summary>
        /// 切换UIRoot
        /// </summary>
        /// <param name="uiRoot"></param>
        void ChangeUIRoot(Transform uiRoot)
        {
            if (uiRoot == null)
            {
                return;
            }

            //先记录旧的UIRoot
            Transform oldUIRoot = this.uiRoot;

            this.uiRoot = uiRoot;
            hudCamera   = uiRoot.gameObject.FindComponent <Camera>("CameraHUD");
            uiCamera    = uiRoot.gameObject.FindComponent <Camera>("Camera");
            poolCanvas  = uiRoot.FindTransform("CanvasPool");

            foreach (UIType uiType in Enum.GetValues(typeof(UIType)))
            {
                if (uiType == UIType.Child)
                {
                    continue;
                }

                Canvas tempCanvas = uiRoot.gameObject.FindComponent <Canvas>($"Canvas{uiType}");
                canvasDic[uiType] = tempCanvas;

                if (!showDic.ContainsKey(uiType))
                {
                    if ((uiType & StackType) != 0)
                    {
                        showDic[uiType] = new UIStackContainer(uiType, tempCanvas.sortingOrder);
                    }
                    else
                    {
                        showDic[uiType] = new UIListContainer(uiType, tempCanvas.sortingOrder);
                    }
                }
            }

            //改变池中UI的父节点
            foreach (var kv in poolDic)
            {
                if (kv.Value.UI != null && kv.Value.UI.Transform != null)
                {
                    if (kv.Value.UI.Transform.parent != poolCanvas)
                    {
                        kv.Value.UI.Transform.SetParent(poolCanvas, true);
                    }
                }
            }

            //改变ui的父节点
            for (int i = 0; i < uiList.Count; i++)
            {
                UIContext uiContex = uiList[i];
                if (uiContex != null && uiContex.UI != null && uiContex.UI.Transform != null)
                {
                    SetUIParent(uiContex.UI.Transform, uiContex.UIData.UIType, true);
                }
            }

            if (oldUIRoot != null)
            {
                GameObject.Destroy(oldUIRoot.gameObject);
                oldUIRoot = null;
            }
        }