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#
		
	
| 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();
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| } |