
cs
/****************************************************
文件:BasePanel.cs
作者:Edision
日期:#CreateTime#
功能:面板基类
*****************************************************/
using UnityEngine;
public class BasePanel : MonoBehaviour
{
protected CanvasGroup canvasGroup;
protected virtual void Awake()
{
UIManager.Instance.RegisterPanel(this.GetType(), gameObject);
gameObject.SetActive(false);
canvasGroup = this.GetComponent<CanvasGroup>();
}
public virtual void OnEnter() { }
public virtual void OnExit() { }
public virtual void OnPause() { }
public virtual void OnResume() { }
}
cs
/****************************************************
文件:UIManager.cs
作者:Edision
日期:#CreateTime#
功能:UI管理
*****************************************************/
using System;
using System.Collections.Generic;
using UnityEngine;
public class UIManager : MonoBehaviour
{
private static UIManager _instance;
public static UIManager Instance => _instance;
/// <summary>
/// 面板栈,用于管理面板层级
/// </summary>
private Stack<BasePanel> _panelStack = new Stack<BasePanel>();
private Dictionary<Type, GameObject> _uiPanelDict = new Dictionary<Type, GameObject>();
private void Awake()
{
if (_instance == null)
{
_instance = this;
}
else
{
Destroy(gameObject);
}
}
public void RegisterPanel(Type panelType, GameObject panel)
{
if (!_uiPanelDict.ContainsKey(panelType))
{
_uiPanelDict.Add(panelType, panel);
}
}
/// <summary>
/// 显示新面板
/// </summary>
/// <param name="panel">要显示的面板</param>
public void PushPanel(BasePanel panel)
{
if (_panelStack.Count > 0)
{
// 暂停当前面板
_panelStack.Peek().OnPause();
}
// 显示新面板
_panelStack.Push(panel);
panel.OnEnter();
}
/// <summary>
/// 关闭当前面板
/// </summary>
public void PopPanel()
{
if (_panelStack.Count > 0)
{
// 关闭当前面板
BasePanel panel = _panelStack.Pop();
panel.OnExit();
}
if (_panelStack.Count > 0)
{
// 恢复上一个面板
_panelStack.Peek().OnResume();
}
}
/// <summary>
/// 获取当前显示的面板
/// </summary>
public BasePanel GetCurrentPanel()
{
return _panelStack.Count > 0 ? _panelStack.Peek() : null;
}
/// <summary>
/// 获取面板 T 类型
/// </summary>
/// <typeparam name="T">面板类型</typeparam>
/// <returns>面板组件</returns>
public T GetPanel<T>() where T : BasePanel
{
Type panelType = typeof(T);
if (_uiPanelDict.ContainsKey(panelType))
{
GameObject panelObject = _uiPanelDict[panelType];
return panelObject.GetComponent<T>();
}
return null;
}
}
cs
/****************************************************
文件:GameController.cs
作者:Edision
日期:#CreateTime#
功能:游戏控制
*****************************************************/
using UnityEngine;
public class GameController : MonoBehaviour
{
private void Start()
{
MainMenuPanel mainMenuPanel = UIManager.Instance.GetPanel<MainMenuPanel>();
// 显示主菜单
UIManager.Instance.PushPanel(mainMenuPanel);
}
}
cs
/****************************************************
文件:MainMenuPanel.cs
作者:Edision
日期:#CreateTime#
功能:主菜单界面
*****************************************************/
using UnityEngine;
using UnityEngine.UI;
public class MainMenuPanel : BasePanel
{
public Button heroSelectButton; // 打开英雄选择面板的按钮
public Button settingsButton; // 打开设置面板的按钮
protected override void Awake()
{
base.Awake();
}
private void Start()
{
// 绑定按钮事件
heroSelectButton.onClick.AddListener(OnHeroSelectButtonClicked);
settingsButton.onClick.AddListener(OnSettingsButtonClicked);
}
public override void OnEnter()
{
// 启用面板
gameObject.SetActive(true);
canvasGroup.interactable = true;
}
public override void OnExit()
{
// 完全关闭面板
gameObject.SetActive(false);
canvasGroup.interactable = false;
}
public override void OnPause()
{
// 暂停面板:禁用交互
// 可以在这里添加额外的逻辑
canvasGroup.interactable = false;
}
public override void OnResume()
{
// 恢复面板:重新启用交互
// 可以在这里添加额外的逻辑
canvasGroup.interactable = true;
}
private void OnHeroSelectButtonClicked()
{
// 打开英雄选择面板
UIManager.Instance.PushPanel(UIManager.Instance.GetPanel<HeroSelectPanel>());
}
private void OnSettingsButtonClicked()
{
// 打开英雄选择面板
UIManager.Instance.PushPanel(UIManager.Instance.GetPanel<SettingsPanel>());
}
}
cs
/****************************************************
文件:HeroSelectPanel.cs
作者:Edision
日期:#CreateTime#
功能:英雄选择界面
*****************************************************/
using UnityEngine;
using UnityEngine.UI;
public class HeroSelectPanel : BasePanel
{
public Button backButton; // 返回主菜单的按钮
protected override void Awake()
{
base.Awake();
}
private void Start()
{
// 绑定按钮事件
backButton.onClick.AddListener(OnBackButtonClicked);
}
public override void OnEnter()
{
// 启用面板
gameObject.SetActive(true);
canvasGroup.interactable = true;
}
public override void OnExit()
{
// 完全关闭面板
gameObject.SetActive(false);
canvasGroup.interactable = false;
}
public override void OnPause()
{
// 暂停面板:禁用交互
canvasGroup.interactable = false;
}
public override void OnResume()
{
// 恢复面板:重新启用交互
canvasGroup.interactable = true;
}
private void OnBackButtonClicked()
{
// 返回主菜单
UIManager.Instance.PopPanel();
}
}
cs
/****************************************************
文件:SettingsPanel.cs
作者:Edision
日期:#CreateTime#
功能:设置面板
*****************************************************/
using UnityEngine;
using UnityEngine.UI;
public class SettingsPanel : BasePanel
{
public Button backButton; // 返回主菜单的按钮
protected override void Awake()
{
base.Awake();
}
private void Start()
{
// 绑定按钮事件
backButton.onClick.AddListener(OnBackButtonClicked);
}
public override void OnEnter()
{
// 启用面板
gameObject.SetActive(true);
canvasGroup.interactable = true;
}
public override void OnExit()
{
// 完全关闭面板
gameObject.SetActive(false);
canvasGroup.interactable = false;
}
public override void OnPause()
{
// 暂停面板:禁用交互
canvasGroup.interactable = false;
}
public override void OnResume()
{
// 恢复面板:重新启用交互
canvasGroup.interactable = true;
}
private void OnBackButtonClicked()
{
// 返回主菜单
UIManager.Instance.PopPanel();
}
}