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 分钟前
Qt的ui文件的编译和使用
ui
Love__Tay2 小时前
笔记/云计算基础
笔记·学习·云计算
小老鼠爱大米3 小时前
C# WPF - Prism 学习篇:搭建项目(一)
c#·wpf·prism
wuxuanok5 小时前
Web后端开发-分层解耦
java·笔记·后端·学习
&芒果冰沙&5 小时前
【Axure RP】什么是Axure?Axure可以用来做什么?
ui·axure·ux
wuxuanok6 小时前
Web后端开发-请求响应
java·开发语言·笔记·学习
Thomas_YXQ6 小时前
Unity3D游戏内存优化指南
游戏·unity·职场和发展·性能优化·蓝桥杯·游戏引擎·unity3d
i7i8i9com6 小时前
后端微服务基础架构Spring Cloud
学习
chillxiaohan7 小时前
Unity接入Steamworks.NET实现通信功能
unity