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();
    }
}
相关推荐
roman_日积跬步-终至千里1 小时前
【强化学习基础(2)】被动强化学习:学习价值函数
学习
芳草萋萋鹦鹉洲哦1 小时前
【elemen/js】阻塞UI线程导致的开关卡顿如何优化
开发语言·javascript·ui
逢考必过@k1 小时前
6级550学习ing
学习
大侠课堂2 小时前
C#经典面试题100道
开发语言·c#
陈天伟教授3 小时前
基于学习的人工智能(7)机器学习基本框架
人工智能·学习
时光追逐者3 小时前
Visual Studio 2026 现已正式发布,更快、更智能!
ide·c#·.net·visual studio
Z***G4794 小时前
网络爬虫学习:借助DeepSeek完善爬虫软件,实现模拟鼠标右键点击,将链接另存为本地文件
爬虫·学习·计算机外设
周杰伦fans5 小时前
C# 正则表达式完全指南
mysql·正则表达式·c#
我命由我123455 小时前
微信开发者工具 - 模拟器分离窗口与关闭分离窗口
前端·javascript·学习·微信小程序·前端框架·html·js
DKPT5 小时前
ZGC和G1收集器相比哪个更好?
java·jvm·笔记·学习·spring