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();
    }
}
相关推荐
bruk_spp几秒前
drm edp屏加载学习
学习
码匠许师傅18 分钟前
【设计模式精讲】25.状态模式(State)
c++·ui·设计模式·状态模式·uml
Linux-lucky33 分钟前
36-Linux学习之旅之MySQL主从复制
linux·运维·学习·mysql·ubuntu
SatanII39 分钟前
华为云ECS实践:从创建、镜像制作到弹性伸缩完整实操指南
linux·运维·服务器·学习·centos·华为云
留白_1 小时前
【tableau入门学习】1、数据预处理
学习
小弥儿1 小时前
GitHub今日热榜 | 2026-09-08:微软 markitdown 冲进前三
学习·microsoft·开源·github
是隼人1 小时前
buuctf-pwn bypwn(ret2shellcode)题解(学习过程持续更新)
c语言·学习·安全·pwn入门·ctf入门
kyrie_sakura1 小时前
MySQL数据库学习笔记3--关联(联合)查询
数据库·学习·mysql
软件黑马王子2 小时前
19.资源加载模块:主要作用和基本原理
开发语言·前端框架·c#