190 lines
5.5 KiB
C#
190 lines
5.5 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using AibisDream.Framework;
|
|
using AibisDream.UI;
|
|
using UnityEngine;
|
|
|
|
namespace AibisDream
|
|
{
|
|
public class UIManager : Kit.Singleton<UIManager>, IUIManager
|
|
{
|
|
#region 索引
|
|
|
|
private Dictionary<Type, IUIPanel> _panelPool;
|
|
private readonly Stack<IUIPanel> _panelStack = new();
|
|
|
|
public RectTransform Canvas { get; private set; }
|
|
public Vector2 Resolution { get; set; }
|
|
|
|
public Camera UICamera { get; private set; }
|
|
public RectTransform DialogCanvas { get; private set; }
|
|
|
|
#endregion
|
|
|
|
public override void OnSingletonInit()
|
|
{
|
|
InitRefs();
|
|
}
|
|
|
|
private void Update()
|
|
{
|
|
if (Input.GetKeyDown(KeyCode.Escape))
|
|
{
|
|
if (_panelStack.Count > 0)
|
|
{
|
|
var lastPanel = _panelStack.Peek();
|
|
HidePanel(lastPanel);
|
|
}
|
|
else
|
|
{
|
|
ShowPanel<SettingPanel>();
|
|
}
|
|
}
|
|
|
|
if (Input.GetKeyDown(KeyCode.C))
|
|
{
|
|
if (GetPanel<MainPanel>().IsOpen)
|
|
{
|
|
HidePanel<MainPanel>();
|
|
}
|
|
else
|
|
{
|
|
ShowPanel<MainPanel>();
|
|
}
|
|
}
|
|
}
|
|
|
|
private void InitRefs()
|
|
{
|
|
UICamera = transform.Find("UI Camera").GetComponent<Camera>();
|
|
// 获取Canvas
|
|
Canvas = transform.Find("UI Canvas").GetComponent<RectTransform>();
|
|
DialogCanvas = transform.Find("Dialog Canvas").GetComponent<RectTransform>();
|
|
// 获取Panel
|
|
var panels = Canvas.GetComponentsInChildren<IUIPanel>(true);
|
|
_panelPool = new Dictionary<Type, IUIPanel>();
|
|
foreach (var panel in panels)
|
|
{
|
|
_panelPool[panel.GetType()] = panel;
|
|
}
|
|
|
|
EnumEventSystem.Global.Register(GameLoopEnum.AppStart, OnAppStart);
|
|
EnumEventSystem.Global.Register(GameLoopEnum.GameStart, OnGameStart);
|
|
EnumEventSystem.Global.Register(GameLoopEnum.GameQuit, OnGameQuit);
|
|
}
|
|
|
|
private void OnAppStart()
|
|
{
|
|
// 游戏打开
|
|
ShowPanel<StartPanel>();
|
|
ShowPanel<PlayToolPanel>();
|
|
|
|
HidePanel<MainPanel>();
|
|
HidePanel<SettingPanel>();
|
|
HidePanel<RecordPanel>();
|
|
HidePanel<EndPanel>();
|
|
}
|
|
|
|
private void OnGameStart()
|
|
{
|
|
// 开始游戏
|
|
HidePanel<StartPanel>();
|
|
ShowPanel<MainPanel>();
|
|
}
|
|
|
|
private void OnGameQuit()
|
|
{
|
|
HidePanel<MainPanel>();
|
|
ShowPanel<StartPanel>();
|
|
}
|
|
|
|
public void ShowPanel<T>(Action<T> call = null) where T : class, IUIPanel
|
|
{
|
|
var type = typeof(T);
|
|
// 从缓存中检查panel
|
|
if (_panelPool.TryGetValue(type, out var panel))
|
|
{
|
|
if (panel.IsOpen) return;
|
|
if (panel.IsCloseable) _panelStack.Push(panel);
|
|
panel.Show();
|
|
call?.Invoke(panel as T);
|
|
}
|
|
else
|
|
{
|
|
Debug.Log($"panel {type} 未注册");
|
|
}
|
|
}
|
|
|
|
public void HidePanel<T>() where T : IUIPanel
|
|
{
|
|
var type = typeof(T);
|
|
// 从缓存中检查panel
|
|
if (_panelPool.TryGetValue(type, out var panel))
|
|
{
|
|
if (!panel.IsOpen) return;
|
|
if (panel.IsCloseable) _panelStack.Pop();
|
|
panel.Hide();
|
|
}
|
|
else
|
|
{
|
|
Debug.Log($"panel {type} 未注册");
|
|
}
|
|
}
|
|
|
|
private void HidePanel<T>(T panel) where T : IUIPanel
|
|
{
|
|
if (_panelPool.ContainsValue(panel))
|
|
{
|
|
if (!panel.IsOpen) return;
|
|
if (panel.IsCloseable) _panelStack.Pop();
|
|
panel.Hide();
|
|
}
|
|
else
|
|
{
|
|
Debug.Log($"panel {typeof(T)} 未注册");
|
|
}
|
|
}
|
|
|
|
public T GetPanel<T>() where T : class, IUIPanel
|
|
{
|
|
if (_panelPool.TryGetValue(typeof(T), out var panel))
|
|
{
|
|
return panel as T;
|
|
}
|
|
|
|
Debug.Log($"没有找到{typeof(T)}");
|
|
return null;
|
|
}
|
|
|
|
public static Vector3 GetDialogUIPos(Vector3 screenPos)
|
|
{
|
|
// 转换为UI坐标
|
|
RectTransformUtility.ScreenPointToLocalPointInRectangle(
|
|
Instance.DialogCanvas,
|
|
screenPos,
|
|
Instance.UICamera,
|
|
out Vector2 localPoint);
|
|
|
|
return localPoint;
|
|
}
|
|
|
|
public bool ScreenPointToLocalPointInRectangle(RectTransform rectTransform, Vector2 screenPos, out Vector2 localPoint)
|
|
{
|
|
return RectTransformUtility.ScreenPointToLocalPointInRectangle(rectTransform, screenPos, UICamera, out localPoint);
|
|
}
|
|
}
|
|
|
|
public interface IUIManager
|
|
{
|
|
void ShowPanel<T>(Action<T> call = null) where T : class, IUIPanel;
|
|
void HidePanel<T>() where T : IUIPanel;
|
|
T GetPanel<T>() where T : class, IUIPanel;
|
|
RectTransform Canvas { get; }
|
|
Vector2 Resolution { get; set; }
|
|
|
|
// 还没想好要不要用栈
|
|
// UIPanel Pop();
|
|
// void Push<T>(T panel) where T : UIPanel;
|
|
}
|
|
}
|