/// <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); } } } }
/// <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; } }