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();
    }
}
相关推荐
公子小六10 小时前
基于.NET的Windows窗体编程之WinForms数据持久化(1)
windows·microsoft·c#·.net·winforms
三雷科技11 小时前
第6章第4节:自定义分词器
开发语言·c#
路灯上の马陈12 小时前
Java 内部类 学习笔记
笔记·学习
FungLeo12 小时前
成为全栈·Vue 管理后台篇·Vue3 + Vite + Naive UI:后台工程基座怎么搭
前端·vue.js·ui·typescript·vite·前端工程化·biome
前进的李工12 小时前
Agent 学习笔记 12:Agent 的工具应该怎么设计
人工智能·笔记·学习·agent·工具调用·skill·工具设计
li星野13 小时前
从 DICOM 到声学属性学习记录:HU 值怎么变成密度和声速
学习
自信1504130575913 小时前
重生之从0开始学习c++之——vector-中篇
c++·学习·算法
zhanghaha131413 小时前
C# 系列教程_12 字符串 string 保姆级系统教程(面向新手,大量示例 + 原理讲解)
开发语言·数据库·c#
架构师伯子明13 小时前
ffmpeg学习4:opencv在音视频领域常用指令
opencv·学习·ffmpeg
wangqiaowq1 天前
Ontology 学习
学习