2
0
Fork 0
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#

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