DeepSeek教unity------UI框架

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();
    }
}
相关推荐
饮长安千年月2 小时前
Linksys WRT54G路由器溢出漏洞分析–运行环境修复
网络·物联网·学习·安全·机器学习
红花与香菇2____2 小时前
【学习笔记】Cadence电子设计全流程(二)原理图库的创建与设计(上)
笔记·嵌入式硬件·学习·pcb设计·cadence·pcb工艺
laimaxgg2 小时前
Qt常用控件之单选按钮QRadioButton
开发语言·c++·qt·ui·qt5
一天八小时4 小时前
Docker学习进阶
学习·docker·容器
前端没钱4 小时前
前端需要学习 Docker 吗?
前端·学习·docker
拥有一颗学徒的心5 小时前
鸿蒙第三方库MMKV源码学习笔记
笔记·学习·性能优化·harmonyos
车端域控测试工程师5 小时前
【ISO 14229-1:2023 UDS诊断(ECU复位0x11服务)测试用例CAPL代码全解析⑰】
经验分享·学习·汽车·测试用例·capl
车端域控测试工程师5 小时前
【ISO 14229-1:2023 UDS诊断(ECU复位0x11服务)测试用例CAPL代码全解析⑪】
经验分享·学习·汽车·测试用例·capl
黄金小码农5 小时前
c# 2025/2/19 周三
c#
susan花雨7 小时前
C#发送邮件
c#