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

ops/2025/2/27 12:45:25/

/****************************************************文件: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() { }
}
/****************************************************文件: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;}
}
/****************************************************文件:GameController.cs作者:Edision日期:#CreateTime#功能:游戏控制
*****************************************************/using UnityEngine;public class GameController : MonoBehaviour
{private void Start(){MainMenuPanel mainMenuPanel = UIManager.Instance.GetPanel<MainMenuPanel>();// 显示主菜单UIManager.Instance.PushPanel(mainMenuPanel);}
}
/****************************************************文件: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>());}}
/****************************************************文件: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();}
}
/****************************************************文件: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();}
}


http://www.ppmy.cn/ops/161675.html

相关文章

AI DEV 人工智能能做的工作,在开发运维安全方面以及企业成本降低方面所起的作用和相应的提示词。

这个查询是用中文提出的&#xff0c;询问人工智能在开发、运维、安全方面以及企业成本降低方面的作用和相应的提示词。我应该用中文回答&#xff0c;并涵盖以下几个方面&#xff1a; AI在软件开发中的应用AI在IT运维中的应用AI在网络安全中的应用AI如何帮助企业降低成本针对这…

DeepSeek 提示词:基础结构

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编…

Mysql基础-多表查询(详细版)

目录 一、表的关系类型与适用场景二、连接方式与使用场景三、易错点与注意事项四、总结 一、表的关系类型与适用场景 1. 一对一关系 场景&#xff1a;一个表的记录对应另一个表的唯一记录 案例&#xff1a;用户表 用户详情表 CREATE TABLE users (id INT PRIMARY KEY,name…

ZIP64扩展和普通ZIP文件有什么区别?

ZIP64扩展是ZIP文件格式的一个扩展&#xff0c;旨在解决传统ZIP格式的限制&#xff0c;尤其是文件大小和数量的限制。以下是ZIP64扩展与普通ZIP文件的主要区别&#xff1a; 1. 文件大小限制 普通ZIP文件&#xff1a; 单个文件大小限制为 4GB&#xff08;2^32字节&#xff09;。…

bash脚本----变量的算术运算

整数运算&#xff1a;推荐使用 $((...)) 或 ((...))&#xff0c;因为它们是现代 Bash 的标准语法&#xff0c;效率高且语法简洁。 浮点运算&#xff1a;可以使用 bc 或 awk&#xff0c;具体选择取决于你的需求和偏好。 兼容性&#xff1a;如果需要兼容 POSIX 标准&#xff0c…

OpenCV(10):视频目标跟踪、视频背景减除

1 视频目标跟踪 在计算机视觉领域&#xff0c;视频目标跟踪是一个非常重要的任务。视频目标跟踪广泛应用于监控、自动驾驶、人机交互等多个领域。OpenCV 提供了多种目标跟踪算法&#xff0c;其中 MeanShift 和 CamShift 是两种经典且常用的算法。本文将详细讲解这两种算法的原理…

Git原理+使用(超详细)

Git初识 当我们写项目代码时&#xff0c;需要不断的更新版本&#xff0c;那么就需要一个东西去管理这些不同版本的文件—版本控制器。 目前最主流的版本控制器就是Git。它是一个可以记录工程的每一次改动和版本迭代的管理系统&#xff0c;同时方便多人协同作业。 &#xff0…

el-table

el-table合并 参考&#xff1a; https://www.jianshu.com/p/6067708bd1ee https://blog.csdn.net/weixin_43862642/article/details/122055745 某个列合并&#xff0c;前面序号也要跟着对应合并 <el-table:data"list":span-method"objectSpanMethod" …