using System; using System.Collections.Generic; using FairyGUI; using Object = UnityEngine.Object; namespace Game { public class UIManager : ManagerBase { public readonly UIPoolManager Creator = new UIPoolManager(); private readonly Dictionary _mUIDict = new Dictionary(); private readonly Stack _mUIStack = new Stack(); private IUIPageBase _mCurPage; public override void OnCreate() { StageCamera.CheckMainCamera(); StageCamera.main.nearClipPlane = 0; StageCamera.main.gameObject.layer = 5; //UILayer Object.DontDestroyOnLoad(StageCamera.main.gameObject); foreach (var package in Enum.GetValues(typeof(EuiPackage))) { //导入包 var packageStr = package.ToString(); UIPackage.AddPackage($"UIRes/{packageStr}"); //绑定view类 var binderType = System.Type.GetType($"Game.{packageStr}.{packageStr}Binder"); binderType?.GetMethod("BindAll")?.Invoke(null, null); } // Cursor.visible = false; } public override void Update() { foreach (var kvp in _mUIDict) { var page = kvp.Value; if (page.IsActive()) { page.Update(); } } } public override void FixedUpdate() { foreach (var kvp in _mUIDict) { var page = kvp.Value; if (page.IsActive()) { page.FixedUpdate(); } } } public override void OnDestroy() { } /// /// 打开页面,如果是全屏页面则入栈 /// /// public void Open(EuiPage page, params object[] values) { if (!_mUIDict.ContainsKey(page)) { var uiObj = (IUIPageBase)typeof(IUIPageBase).Assembly.CreateInstance($"Game.Page{page.ToString()}"); _mUIDict[page] = uiObj; _mUIDict[page].Create(page); } if (_mUIDict[page].IsFullPage()) { if (_mUIStack.Count > 0) { CloseTop(); } _mUIStack.Push(page); _mCurPage = _mUIDict[page]; } else { if (_mCurPage == null) { return; //非全屏页面不能单独存在 } _mCurPage.AddSubPage(page); } _mUIDict[page].Open(values); } /// /// 栈顶全屏页面退栈 /// public void Close() { if (_mCurPage == null) { return; } _mUIStack.Pop(); CloseTop(); if (_mUIStack.Count > 0) { var pageCur = _mUIStack.Peek(); _mCurPage = _mUIDict[pageCur]; _mUIDict[pageCur].Open(); } else { _mCurPage = null; } } private void CloseTop() { _mCurPage.Close(); foreach (var item in _mCurPage.GetSubPages()) { if (_mUIDict[item].IsActive()) { _mUIDict[item].Close(); } } _mCurPage.RemoveSubPageAll(); } /// /// 关闭指定页面,如果是全屏页面则不操作 /// /// public void Close(EuiPage page) { if (_mUIDict.ContainsKey(page) && !_mUIDict[page].IsFullPage()) { _mUIDict[page].Close(); } } public void OpenInNew(EuiPage page, params object[] values) { CloseAll(); Open(page, values); } public void CloseAll() { while (_mUIStack.Count > 0) { Close(); } } } }