当前位置: 首页 > news >正文

【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.dtcms.com/a/266717.html

相关文章:

  • PowerPoint 转 PDF 转换器:Python GUI 工具的深度解析
  • python高级变量XI
  • vue-39(为复杂 Vue 组件编写单元测试)
  • 行阶梯形矩阵和行最简形矩阵的区别
  • HTTP 缓存
  • suricata新增协议处理流程
  • Windows系统x86机器安装麒麟ARM系统(自用记录)
  • 批量印刷拼版助手Quite Imposing Plus:Adobe 专业PDF拼版插件
  • 2025微信小程序wxapkg解包全攻略
  • ESP32S3将摄像头映射到LCD屏
  • Android开发前的准备工作
  • ContextIQ 上线:助力 Copilot 深度洞察你的工作场景
  • vueX和Pinia的区别
  • JavaWeb笔记05
  • HarmonyOS-ArkUI 手势系列4--多层级手势
  • 鸿蒙系统(HarmonyOS)应用开发之手势锁屏密码锁(PatternLock)
  • [Linux]内核如何对信号进行捕捉
  • FastAPI 小白教程:从入门级到实战(源码教程)
  • springboot整合腾讯云cos对象存储,获取临时密钥,前端直传图片文件
  • Spring Cloud网关与CI文件配置请求安全性对比
  • 基于二维码的视频合集高效管理与分发技术
  • monorepo + Turborepo --- 运行任务
  • MySQL ON DUPLICATE KEY UPDATE 用法详解
  • 鸿蒙开发List长按Item拖拽切换效果
  • 基于区块链的物联网(IoT)安全通信与数据共享的典型实例
  • JSONLines和JSON数据格式使用教程
  • AI大模型:(二)1.5 Stable Diffusion中文文生图模型部署
  • 30 秒锁定黑客攻击:SLS SQL 如何从海量乱序日志中“揪”出攻击源
  • 【C语言刷题】第十天:加量加餐继续,代码题训练,融会贯通IO模式
  • 短篇小说7.4