You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
	
	
		
			163 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			C#
		
	
		
		
			
		
	
	
			163 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			C#
		
	
| 
											2 years ago
										 | using System; | ||
|  | using System.Collections.Generic; | ||
|  | using FairyGUI; | ||
|  | using Object = UnityEngine.Object; | ||
|  | 
 | ||
|  | namespace Game | ||
|  | { | ||
|  |     public class UIManager : ManagerBase<UIManager> | ||
|  |     { | ||
|  |         public readonly UIPoolManager Creator = new UIPoolManager(); | ||
|  |         private readonly Dictionary<EuiPage, IUIPageBase> _mUIDict = new Dictionary<EuiPage, IUIPageBase>(); | ||
|  |         private readonly Stack<EuiPage> _mUIStack = new Stack<EuiPage>(); | ||
|  |         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() | ||
|  |         { | ||
|  |         } | ||
|  | 
 | ||
|  |         /// <summary> | ||
|  |         /// 打开页面,如果是全屏页面则入栈 | ||
|  |         /// </summary> | ||
|  |         /// <param name="page"></param> | ||
|  |         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); | ||
|  |         } | ||
|  | 
 | ||
|  |         /// <summary> | ||
|  |         /// 栈顶全屏页面退栈 | ||
|  |         /// </summary> | ||
|  |         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(); | ||
|  |         } | ||
|  | 
 | ||
|  |         /// <summary> | ||
|  |         /// 关闭指定页面,如果是全屏页面则不操作 | ||
|  |         /// </summary> | ||
|  |         /// <param name="page"></param> | ||
|  |         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(); | ||
|  |             } | ||
|  |         } | ||
|  |     } | ||
|  | } |