/// <summary> /// 设置UI遮罩背景 /// </summary> void SetBg(UIToolData data) { mBgUI = data; Background.planeDistance = data.MyCanvas.planeDistance + BackgroundDis; //设置遮罩层位置 Background.sortingOrder = UIMaxDepth - (int)Background.planeDistance; Background.gameObject.SetActive(true); }
/// <summary> /// 隐藏UI /// </summary> void MyHideUI(UIToolData _data) { if (!_data.IsShowed) { return; } _data.IsShowed = false; //设置标记 //播放此UI关闭动画 //先隐藏UI if (_data.ConfigTable.IsHide == 1) { _data.MyCanvas.gameObject.SetActive(false); } //调整同层UI深度 ResetUILocation(_data); //还原上个UI的背景 if (_data.ConfigTable.IsNeedBackground == 1) { //需要所有UI的深度调整完毕后,背景才能进行还原 SetBackground(_data); //还原完毕后当前UI的前UI背景ID清空 _data.LinkedListBreak(); } //判断此UI是否关闭销毁 if (_data.ConfigTable.DestroyType == 2) { //PoolTool.RemoveGameObject(_data.MyCanvas.transform, true); //销毁UI(不走池了) DestroyImmediate(_data.MyCanvas.gameObject); _AllUI.Remove(_data.Id); //将彻底隐藏的UI进行销毁 } }
/// <summary> /// 设置UI父物体 /// </summary> void SetUIParent(uint id) { if (_AllUI.ContainsKey(id)) { UIToolData _data = _AllUI[id]; Transform _trans = _data.MyCanvas.transform; switch (_data.ConfigTable.Hierarchy) { case "HUD": _trans.SetParent(HUDTrans, false); break; case "Joystick": //_trans.parent = JoystickTrans; _trans.SetParent(JoystickTrans, false); break; case "Normal": //_trans.parent = NormalTrans; _trans.SetParent(NormalTrans, false); break; case "Fixation": //_trans.parent = FixationTrans; _trans.SetParent(FixationTrans, false); break; case "PopUp": //_trans.parent = PopUpTrans; _trans.SetParent(PopUpTrans, false); break; case "Guide": //_trans.parent = GuideTrans; _trans.SetParent(GuideTrans, false); break; case "Loading": //_trans.parent = LoadingTrans; _trans.SetParent(LoadingTrans, false); break; case "PopTop": //_trans.parent = PopTopTrans; _trans.SetParent(PopTopTrans, false); break; default: break; } _trans.localScale = Vector3.one; _trans.localPosition = Vector3.zero; } }
/// <summary> /// 添加一个自己的前置数据 /// </summary> public void LinkedListAddBefor(UIToolData _data) { BgBefore = _data; if (_data != null) { if (_data.BgLater != null) { _data.BgLater.BgBefore = this; } BgLater = _data.BgLater; _data.BgLater = this; } }
/// <summary> /// 自己从链表中出去 /// </summary> public void LinkedListBreak() { if (BgLater != null) { BgLater.BgBefore = BgBefore; } if (BgBefore != null) { BgBefore.BgLater = BgLater; } BgLater = null; BgBefore = null; }
/// <summary> /// C#调用 /// 关闭UI。并传入是否播放关闭动画(优先级高于配置) /// </summary> public void HideCSUI(uint id, bool isAnim = false, Action <GameObject> callback = null) { if (_AllUI.ContainsKey(id)) { LoggerHelper.Debug("一个UI隐藏了: " + _AllUI[id].ConfigTable.Name); UIToolData _data = _AllUI[id]; MyHideUI(_data); //隐藏UI方法 //发送MVC消息 Facade.Instance.SendNotification(string.Concat(_data.ConfigTable.Name, MVCNameConst.UI_UIHide)); if (callback != null) { callback.Invoke(_data.MyCanvas.gameObject); } } }
/// <summary> /// UI关闭时,重置同层UI的位置 /// </summary> void ResetUILocation(UIToolData data) { float _baseDis = data.MyCanvas.planeDistance; //获取当前深度 float _depthSpeed = data.ConfigTable.DepthSpeed; //获取此UI占用深度 //将此层所有显示的UI进行深度排序 UIToolData[] _items = _AllUI.Values.Where(p => p.IsShowed && p.ConfigTable.Hierarchy == data.ConfigTable.Hierarchy).ToArray(); int _count = _items.Length; //将所有同层的UI的深度,进行调整 for (int i = 0; i < _count; i++) { float _nowDis = _items[i].MyCanvas.planeDistance; if (_nowDis < _baseDis) { _items[i].MyCanvas.planeDistance = _nowDis + _depthSpeed; } } }
/// <summary> /// 显示UI /// </summary> void MyShowUI(uint id) { SetUILocation(id); //设置自己所在层的位置 //播放此UI打开动画 UIToolData _data = _AllUI[id]; if (_data.IsShowed) { return; } _data.IsShowed = true; _data.MyCanvas.gameObject.SetActive(true); if (_data.ConfigTable.IsNeedBackground == 1) { _data.LinkedListAddBefor(mBgUI); //新建背景时,需要赋值自己打开时,上个有背景的UI的值 SetBg(_data); //设置背景遮罩 } }
/// <summary> /// 设置UI遮罩背景 /// </summary> void SetBackground(UIToolData _data) { if (_data.BgBefore != null) { //如果当前id对应的UI尚未关闭,则设置到对应的UI下,否则直接隐藏 if (_data.BgBefore.MyCanvas.gameObject != null && _data.BgBefore.MyCanvas.gameObject.activeSelf) { SetBg(_data.BgBefore); } else { Debug.LogError("出现了一个隐藏的界面,但链表中没有去掉"); } } else { //隐藏背景 Background.gameObject.SetActive(false); mBgUI = null; } }
//-----------------内部方法------------------ #region 内部方法 /// <summary> /// UI加载成功后,会直接调用对应UI的创建成功方法 /// </summary> void LoadUIBack(PoolLoadData _data) { //将加载完的UI,放在临时存储中 UIConfigTable tData = _data.data as UIConfigTable; UIToolData tToolData = new UIToolData(tData.Id, _data.transform, tData); tToolData.MyCanvas.renderMode = RenderMode.ScreenSpaceCamera; tToolData.MyCanvas.worldCamera = UICamera; //设置父物体 _AllUI.Add(tToolData.Id, tToolData); SetUIParent(tToolData.Id); //显示UI MyShowUI(tToolData.Id); //创建成功后,将obj传过去 if (_Callback.ContainsKey(tData.Id)) { _Callback[tData.Id].Invoke(_data.transform.gameObject); _Callback.Remove(tData.Id); } //发送MVC消息 Facade.Instance.SendNotification(string.Concat(_data.transform.gameObject.name, MVCNameConst.UI_UIShow)); }
/// <summary> /// UI打开时,设置自己在同层UI位置 /// </summary> void SetUILocation(uint id) { if (_AllUI.ContainsKey(id)) { UIToolData _data = _AllUI[id]; UIToolData[] _items = _AllUI.Values.Where(p => p.IsShowed && p.ConfigTable.Hierarchy == _data.ConfigTable.Hierarchy).ToArray(); float _minDis = 0; float _depthSpeed = 0; int _count = _items.Length; if (_count != 0) //此层有UI { for (int i = 0; i < _count; i++) { float _nowDis = _items[i].MyCanvas.planeDistance; if (_minDis == 0 || _nowDis < _minDis) { _minDis = _nowDis; _depthSpeed = _items[i].ConfigTable.DepthSpeed; } } } else //此层无显示的UI,直接设置为基础层 { switch (_data.ConfigTable.Hierarchy) { case "HUD": _minDis = HUDPos; break; case "Joystick": _minDis = JoystickPos; break; case "Fixation": _minDis = FixationPos; break; case "Normal": _minDis = NormalPos; break; case "PopUp": _minDis = PopUpPos; break; case "Guide": _minDis = GuidePos; break; case "Loading": _minDis = LoadingPos; break; case "PopTop": _minDis = PopTopPos; break; default: break; } } _data.MyCanvas.planeDistance = _minDis - _depthSpeed; //将其设置在最高层 _data.MyCanvas.sortingOrder = UIMaxDepth - (int)_data.MyCanvas.planeDistance; //设置orderInLayer实属无奈,错开order是为了防止同order的ScreenSpace-Camera类型canvas点击穿透 } }