【Unity笔记01】基于单例模式的简单UI框架

单例模式的UIManager

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class UIManager 
{private static UIManager _instance;public Dictionary<string, string> pathDict;public Dictionary<string, GameObject> prefabDict;public Dictionary<string, BasePanel> panelDict;private Transform _uiRoot;//单例模式public static UIManager Instance{get{if( _instance == null ){_instance = new UIManager();}return _instance;}}private UIManager(){Init();}private void Init(){prefabDict = new Dictionary<string, GameObject>();panelDict = new Dictionary<string, BasePanel>();pathDict = new Dictionary<string, string>(){{UIConst.Menu,"Prefabs/Pop/Menu" },{UIConst.SettingPop,"Prefabs/Pop/SettingPop" },{UIConst.OtherPop,"Prefabs/Pop/OtherPop" }};}public Transform UIRoot{get{if( _uiRoot == null ){_uiRoot = GameObject.Find("Canvas").transform;}return _uiRoot;}}public BasePanel OpenPanel(string name, bool isOnly = true){//如果要只显示一个弹窗的话if(isOnly){CloseAllPops(name);}BasePanel panel = null;if(panelDict.TryGetValue(name, out panel)){Debug.Log("界面已经打开过" + name);panel.OpenPanel(name);return null;}string path = "";if( !pathDict.TryGetValue(name, out path) ){Debug.Log("路径错误"+path);return null;}GameObject panelPrefab = null;if(!panelDict.TryGetValue(name, out panel)){string realPath =path;panelPrefab=Resources.Load<GameObject>(realPath);prefabDict.Add(name, panelPrefab);}//openGameObject panelObject = GameObject.Instantiate(panelPrefab, UIRoot, false);Debug.Log(panelObject.name);panel= panelObject.GetComponent<BasePanel>();if( panel == null ){Debug.Log("没有脚本哦");}panelDict.Add(name,panel);panel.OpenPanel(name);return panel;}public bool ClosePanel(string name){BasePanel panel= null;if(! panelDict.TryGetValue(name,out panel)){Debug.Log("界面未打开");return false;}panel.ClosePanel();return true;}public void CloseAllPops(string name){foreach(var pair in panelDict){if (pair.Key == name) continue;pair.Value.ClosePanel();}}
}

面板的基类 

控制面板的打开和关闭,带动画

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using DG.Tweening;public class BasePanel : MonoBehaviour
{private bool isRemove = false;private string name;public virtual void OpenPanel(string name){this.name = name;gameObject.SetActive(true);OpenAnimation(gameObject);}public virtual void ClosePanel(){isRemove = true;CloseAnimation(gameObject).OnComplete(() =>{gameObject.SetActive(false);});//gameObject.SetActive(false);}public void OpenAnimation(GameObject gameObject){//用dotween 从0%放大到105% 再缩小到95% 再到100%//初始缩放为 0gameObject.transform.localScale = Vector3.zero;//创建动画序列Sequence scaleSequence = DOTween.Sequence();// 添加动画步骤scaleSequence.Append(gameObject.transform.DOScale(1.05f, 0.3f)); // 放大到 105%scaleSequence.Append(gameObject.transform.DOScale(0.95f, 0.3f)); // 缩小到 95%scaleSequence.Append(gameObject.transform.DOScale(1.0f, 0.3f));  // 回到 100%// 缓动scaleSequence.SetEase(Ease.OutBack);}public Tween CloseAnimation(GameObject gameObject){Sequence scaleSequence = DOTween.Sequence();scaleSequence.Append(gameObject.transform.DOScale(0f, 0.2f));return scaleSequence;}
}

常量

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class UIConst 
{public const string Menu = "Menu";public const string SettingPop = "SettingPop";public const string OtherPop = "OtherPop";
}

使用

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class MenuPanel : BasePanel
{public void OpenNest(){UIManager.Instance.OpenPanel(UIConst.OtherPop);}public void Close(){UIManager.Instance.ClosePanel(UIConst.Menu);}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/87516.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/87516.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入解析 OPC UA:工业自动化与物联网的关键技术

在当今快速发展的工业自动化和物联网&#xff08;IoT&#xff09;领域&#xff0c;数据的无缝交换和集成变得至关重要。OPC UA&#xff08;Open Platform Communications Unified Architecture&#xff09;作为一种开放的、跨平台的工业通信协议&#xff0c;正在成为这一领域的…

MCP 协议的未来发展趋势与学习路径

MCP 协议的未来发展趋势 6.1 MCP 技术演进与更新 MCP 协议正在快速发展&#xff0c;不断引入新的功能和改进。根据 2025 年 3 月 26 日发布的协议规范&#xff0c;MCP 的最新版本已经引入了多项重要更新&#xff1a; 1.HTTP Transport 正式转正&#xff1a;引入 Streamable …

硬件嵌入式学习路线大总结(一):C语言与linux。内功心法——从入门到精通,彻底打通你的任督二脉!

嵌入式工程师学习路线大总结&#xff08;一&#xff09; 引言&#xff1a;C语言——嵌入式领域的“屠龙宝刀”&#xff01; 兄弟们&#xff0c;如果你想在嵌入式领域闯出一片天地&#xff0c;C语言就是你手里那把最锋利的“屠龙宝刀”&#xff01;它不像Python那样优雅&#xf…

MCP server资源网站去哪找?国内MCP服务合集平台有哪些?

在人工智能飞速发展的今天&#xff0c;AI模型与外部世界的交互变得愈发重要。一个好的工具不仅能提升开发效率&#xff0c;还能激发更多的创意。今天&#xff0c;我要给大家介绍一个宝藏平台——AIbase&#xff08;<https://mcp.aibase.cn/>&#xff09;&#xff0c;一个…

修改Spatial-MLLM项目,使其专注于无人机航拍视频的空间理解

修改Spatial-MLLM项目&#xff0c;使其专注于无人机航拍视频的空间理解。以下是修改方案和关键代码实现&#xff1a; 修改思路 输入处理&#xff1a;将原项目的视频文本输入改为单一无人机航拍视频/图像输入问题生成&#xff1a;自动生成空间理解相关的问题&#xff08;无需用户…

攻防世界-Reverse-insanity

知识点 1.ELF文件逆向 2.IDApro的使用 3.strings的使用 步骤 方法一&#xff1a;IDA 使用exeinfo打开&#xff0c;发现是32位ELF文件&#xff0c;然后用ida32打开。 找到main函数&#xff0c;然后F5反编译&#xff0c;得到flag。 tip&#xff1a;该程序是根据随机函数生成…

【openp2p】 学习1:P2PApp和优秀的go跨平台项目

P2PApp下面给出一个基于 RESTful 风格的 P2PApp 管理方案示例,供二次开发或 API 对接参考。核心思路就是把每个 P2PApp 当成一个可创建、查询、修改、启动/停止、删除的资源来管理。 一、P2PApp 资源模型 P2PApp:id: string # 唯一标识name: string # …

边缘设备上部署模型的限制之一——显存占用:模型的参数量只是冰山一角

边缘设备上部署模型的限制之一——显存占用&#xff1a;模型的参数量只是冰山一角 在边缘设备上部署深度学习模型已成为趋势&#xff0c;但资源限制是其核心挑战之一。其中&#xff0c;显存&#xff08;或更广义的内存&#xff09;占用是开发者们必须仔细考量的重要因素。许多…

脑机新手指南(二十一)基于 Brainstorm 的 MEG/EEG 数据分析(上篇)

一、脑机接口与神经电生理技术概述 脑机接口&#xff08;Brain-Computer Interface, BCI&#xff09;是一种在大脑与外部设备之间建立直接通信通道的技术&#xff0c;它通过采集和分析大脑信号来实现对设备的控制或信息的输出。神经电生理信号作为脑机接口的重要数据来源&…

[Linux]内核态与用户态详解

内核态和用户态是针对CPU状态的描述。在内核态可以执行一切特权代码&#xff0c;在用户态只能执行那些受限级别的代码。如果需要调用特权代码需要进行内核态切换。 一、内核态和用户态概况 内核态&#xff1a; 系统中既有操作系统的程序&#xff0c;也有普通用户程序。为了安…

如何查看每个磁盘都安装了哪些软件或程序并卸载?

步骤如下&#xff1a; 1、点击电脑桌面左下角&#xff1a; 2、选择【应用和功能】 3、点击下拉框&#xff0c;选择想要查看的磁盘&#xff0c;下方显示的就是所有C磁盘下安装的软件和程序 卸载方法&#xff1a; 点击对应的应用&#xff0c;然后点击卸载即可&#xff1a;

记录一次莫名奇妙的跨域502(badgateway)错误

这里图片加载不了&#xff0c;原文请访问&#xff1a;原文链接 公司的项目&#xff0c;这几天添加了一个统计功能&#xff0c; 本地测试没太大问题&#xff0c;上线后有一个问题&#xff0c;具体现象描述如下&#xff1a; 统计首页接口大约有5-6个&#xff0c;也就是同时需要…

Linux之线程

Linux之线程 线程之形线程接口线程安全互斥锁条件变量&信号量生产者与消费者模型线程池 线程之形 进程是资源分配的基本单位&#xff0c;而线程是进程内部的一个执行单元&#xff0c;也是 CPU 调度的基本单位。 线程之间共享进程地址空间、文件描述符与信号处理&#xff0…

snail-job的oracle sql(oracle 11g)

官网版本的oracle sql中有自增主键&#xff0c;oracle 11g并不支持&#xff0c;所以改成新建索引和触发器的方式自增主键。&#xff08;tip&#xff1a;snail-job的最新版本1.0.0必须使用JDK17&#xff0c; jdk8会报错&#xff0c;所以最后没用起来&#xff09; /*SnailJob Dat…

Windows VMWare Centos Docker部署Nginx并配置对Springboot应用的访问代理

前置博文 Windows VMWare Centos环境下安装Docker并配置MySqlhttps://blog.csdn.net/u013224722/article/details/148928081 Windows VMWare Centos Docker部署Springboot应用https://blog.csdn.net/u013224722/article/details/148958480 # 将已存在的容器设置为宿主机重启后…

暑期数据结构第一天

暑期数据结构第一天 数据元素与数据对象 数据元素--组成数据的基本单位 与数据的关系&#xff1a;是集合的个体 数据对象--性质相同的数据元素的集合 与数据的关系&#xff1a;集合的子集 逻辑结构 &#xff08;1&#xff09;线性结构&#xff0c;所有结点都最多有一个直…

vsCode 扩展中 package.nls.json 文件的作用国际化支持

package.nls.json 代表英文语言文件 {"command.favourite.addtofavourite": "Add to Favourite","command.favourite.deletefavourite": "Remove from Favourite","command.favourite.moveup": "Move Up" } 在 …

结构型智能科技的关键可行性——信息型智能向结构型智能的转换(提纲)

结构型智能科技的关键可行性 ——信息型智能向结构型智能的转换 1.信息型智能科技概述 1.1传统计算机科技的信息型继承者 1.2 信息型智能环境 1.3信息型智能主体 1.4机器学习创造的智能 1.5信息型智能科技的问题 2.结构型智能科技概述 2.1传统计算机科技向真实生命结构…

Excel 数据合并助手SheetDataMerge智能识别同类数据,销售报表处理提升效率

各位Excel小能手们&#xff01;今天给大家介绍个超厉害的玩意儿——SheetDataMerge&#xff0c;这可是专注Excel数据处理的实用工具&#xff01;它就像个数据小管家&#xff0c;核心功能就是智能合并工作表里的同类数据。 软件下载地址安装包 它有多牛呢&#xff1f;能自动识别…

AIStarter平台使用指南:如何一键卸载已下载的AI项目(最新版操作教程)

如果你正在使用 AIStarter 平台&#xff0c;但不知道如何卸载不再需要的 AI 项目&#xff0c;那么这篇简明教程将为你提供清晰的操作指引。 AIStarter 是由知名创作者“熊哥”打造的一款 AI 工具启动器平台&#xff0c;旨在帮助用户快速部署和运行各类 AI 项目。随着平台不断更…