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

news/2025/2/20 19:57:13/

/****************************************************文件: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/news/1573386.html

相关文章

AI提示词进阶:RTGO与CO-STAR框架实战指南

掌握提示词设计是解锁AI生产力的关键。本文将深入解析两大顶尖框架RTGO与CO-STAR&#xff0c;通过程序员视角拆解技术原理&#xff0c;配合真实案例演示如何根据场景精准选型。 一、框架定位与技术特性对比 维度RTGO框架CO-STAR框架架构四层递进式结构六维网状结构响应速度0.8…

mysql查询判断函数,类似decode

mysql中没有decode函数&#xff0c;如果使用的话&#xff0c;会报如下错误&#xff1a;Error Code: 1305. FUNCTION stockdb.decode does not exist 如果要实现像 Oracle 数据库那样原生的 DECODE 函数&#xff0c;可以通过以下几种方式来实现类似 DECODE 函数的功能。 -- 创建…

计算机毕业设计Tensorflow+LSTM空气质量监测及预测系统 天气预测系统 Spark Hadoop 深度学习 机器学习 人工智能

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

cs*n 网页内容转为html 加入 onenote

csdn上有好用的内容&#xff0c;我们怎么将它们加到 onenote 里吃灰呢。 一、创建 新html create_html.py import sysdef create_html_file(filename):# 检查是否提供了文件名if not filename:print("请提供HTML文件名")return# 创建HTML内容html_content f"…

Python 日志记录全解析:从入门到进阶的实用指南

本文全面深入地介绍了 Python 的日志记录功能&#xff0c;从基础概念、何时使用日志&#xff0c;到如何进行基础日志操作&#xff08;如记录到文件、记录变量数据、更改消息格式等&#xff09;&#xff0c;再到进阶的日志组件&#xff08;记录器、处理器、过滤器和格式器&#…

Django 美化使用ModelForm的输入框

在初次使用ModelForm时&#xff0c;我的html文件代码如下&#xff0c;主要内容是显示一个卡片式表单&#xff0c;通过循环遍历 form 对象动态生成表单字段 {% extends layout.html %}{% block content %} <div class"container"><div class"c1"&g…

数据结构之BST、AVL、红黑树、哈夫曼树与B族树

数据结构之BST、AVL、红黑树、哈夫曼树与B族树 数据结构之BST、AVL、红黑树、哈夫曼树与B族树一、二叉搜索树&#xff08;Binary Search Tree, BST&#xff09;1. 什么是二叉搜索树&#xff1f;重要性质 2. 二叉搜索树实现1. 节点结构定义2. 核心操作接口3. 插入算法实现4. 删除…

二、几何体BufferGeometry顶点笔记

一、几何体顶点位置数据和点模型 1、缓冲类型几何体BufferGeometry threejs的长方体BoxGeometry、球体SphereGeometry等几何体都是基于BufferGeometry类构建的&#xff0c;BufferGeometry是一个没有任何形状的空几何体&#xff0c;你可以通过BufferGeometry自定义任何几何形状…