Unity基础知识学习四,UI框架设计
这个随便照着公司项目搞几下,回答一下就行
1.什么是UI框架
高内聚,低耦合,管理繁杂的UI。
2.为什么要有UI框架
略
3.如何使用UI框架,使用UI框架的不同方案比较
3.1 简单UI框架
4.UI框架源码实现
4.1.设计目的
4.1.1 解决UI控件越来越多,耦合性高,管理混乱。
4.1.2 优化UI重复打开的性能。
4.1.3 管理多个界面重叠显示的情形。
4.2.设计思想:
4.2.1 栈的设计思想。
后进先出,先进后出。后打开的页面覆盖先打开的页面。
每当新打开一个界面,都把一个UIModel放入栈中。每关闭一个界面,从栈中拿出来一个UIModel。
4.2.2 glue胶水的设计思想
在UI执行某个行为之前,对这个行为,遍历一遍glue胶水层。来对这个界面和行为,进行自定义的初始化。有点像流水线模式。
4.2.3 模板的设计思想
模板模式 | 菜鸟教程模板模式 在模板模式(Template Pattern)中,一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。这种类型的设计模式属于行为型模式。 介绍 意图:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 主要解决:一些方法通用,却在每一个子类都重新写了这一方法。 何时使用:有一些通用的方法。..https://www.runoob.com/design-pattern/template-pattern.html基础界面,没有自定义模板就使用默认模板。OnAwake,OnShow,OnAfterShow,OnHide,OnDestroy
4.2.4 缓存池
享元模式 | 菜鸟教程享元模式 享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能。这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式。 享元模式尝试重用现有的同类对象,如果未找到匹配的对象,则创建新对象。我们将通过创建 5 个对象来画出 20 个分布于不同位置的圆来演示这种模式。由于只有 5 种可用的颜色,所以 color 属性被用来检查现有的 Circle 对象。 介..https://www.runoob.com/design-pattern/flyweight-pattern.html重新打开某个界面的时候,不需要重新创建页面,只需要从缓存里面拿出来。
4.3 框架主体结构:
4.3.1 MVVM结构
MVVM框架 - 简书了解MVVM框架吗? Vue.js React.js Angular.js 谈谈你对MVVM的认识? MVVM的定义 M:Model(服务器上的业务逻辑操作)V:View(页...https://www.jianshu.com/p/e4e3519a58a6
MVVM的定义
M:Model(服务器上的业务逻辑操作)
V:View(页面)
VM:ViewModel(Model与View之间核心枢纽,比如Vue.js)
UIMgr控制特定的UIModel,然后UIModel控制特定的View.
4.3.2 UIMgr.类
4.3.2.1 配置显示规则
两种规则UIHideOtherRule.lua和UIOverlayRule.lua,就是隐藏别人和不隐藏叠加。以及一个UIStackRule.lua 维护界面UI的栈。
4.3.2.2 一个缓存池,关页面的时候存入缓存,开页面的时候检测缓存里面有没有值。
4.3.2.3 创建和管理UIModel。
4.3.2.4 执行模板UIDisplay.lua和规则。
4.3.3 UIModel类
根据UIPanelConfig.lua中的lua文件路径,创建一个独立的table环境。
以及存储UI的各种信息。比如说gameobject的节点,比如ui的define名称。
4.3.4 Rule类(重点StackRule)
根据页面打开的param来配置显示的Rule,主要由UIHideOtherRule.lua和UIOverlayRule.lua,就是打开页面时隐藏别人和不隐藏别的界面而叠加。以及一个UIStackRule.lua 维护界面UI的栈。
4.3.5 UIPanelConfig类
存储定义的名称,以及:
PrefabPath
ScriptPath
等信息
4.3.6 Glue胶水
UIMgr.lua控制,执行打开关闭或者某个UI的特定函数的时候,顺带会把初始化好的胶水列表遍历一遍,在胶水中也执行这个特定函数。
比较典型的有组件收集,Coms,某个UI页面,Panel中定义了很多组件,比如CloseBtn,以及这个CloseBtn在界面prefab预制体中的路径,打开页面的时候,顺带会启动组件收集的Glue,把定义的CloseBtn对应的目录,转换成Unity场景中实际的gameobject。这样就能直接调用和操作了。
4.3.7 模板函数
基础界面的模板,对界面操作的时候,也会对模板进行操作。
4.3.8 缓存Cache
一个缓存池,关页面的时候存入缓存,开页面的时候检测缓存里面有没有值。
4.4 基础设计模式封装
4.4.1 工厂模式提供Rule
根据打开界面的type,来选择显示节的Rule
4.4.2 模板模式
有自定义模板就自定义,如果没有就默认模板UIDisplay.lua
5.UI框架关键点,重要节点,疑难杂症场景
5.1 模态窗口和非模态窗口
窗口A弹出窗口B,如果窗口B是模态的,在窗口B关闭前就不可能切换到窗口A;如果B是非模态的,那可以在这两个窗口之间任意切换。
默认时非模态,A窗口背面能点击B窗口,如果要设置为模态,则需要在View的模板中,设置一个透明的幕布挡板,挡住点击事件。
如果要更改stack中的界面的显示层级,则需要涉及到renderOrder。
5.2 关掉栈后面的窗口
直接检索stack和出栈,然后销毁或者回收这个页面就行。
5.3 如何让后面的窗口不让点击
设置为模态,在View的模板中,设置一个透明的幕布挡板,挡住点击事件。
6.参考
MVVM框架 - 简书
基于Unity~UGUI的简单UI框架(附UIFramework源码)_cchoop的博客-CSDN博客_ugui框架
Unity基于UGUI的UI框架_万事屋银ちやん-CSDN博客_unity优秀的ui框架
模态窗口和非模态窗口_阿桑的专栏-CSDN博客_模态窗口
Unity基础知识学习四,UI框架设计相关推荐
- Unity基础知识学习七,帧同步源码学习
前言 在学习帧同步框架源码之前,先过一遍基础知识:Unity基础学习六,网络同步_u013617851的博客-CSDN博客 视频地址:帧同步教程[合集]_哔哩哔哩_bilibili github地址: ...
- Unity基础知识学习五,UGUI优化相关
1.什么是UGUI优化,UGUI优化的理论基础 1.1理论基础 Canvas, 是Unity渲染系统给层状几何体( layered geometry )提供的可以被画入.被放在上面或者放在世界空间的 ...
- Unity基础知识学习笔记二
1,object Instantiate(object original,Vector3 position,Quaternion rotation) 克隆原始物体,并返回克隆物体. 例如:Insta ...
- 【嵌入式Linux】嵌入式Linux驱动开发基础知识之LED驱动框架--面向对象、分层设计思想
文章目录 前言 1.LED驱动程序框架 1.1.对于LED驱动,我们想要什么样的接口? 1.2.LED驱动要怎么写,才能支持多个板子?分层写 1.3.程序分析 驱动程序 应用程序 Makefile 1 ...
- 游戏UI框架设计(四) : 模态窗体管理
我们在开发UI窗体时,对于"弹出窗体"往往因为需要玩家优先处理弹出小窗体,则要求玩家不能(无法)点击"父窗体",这种窗体就是典型的"模态窗体" ...
- 2021-7-19-OpenStack基础知识学习
OpenStack基础知识学习 参考文献:Wolf_Coder,百度百科 1,云计算 1.1,出现原因 由亚马逊公司提出.1.随着业务增加公司内部的服务器不够使用,进行虚拟化技术->2.随着公司 ...
- 【嵌入式Linux】嵌入式Linux驱动开发基础知识之按键驱动框架
文章目录 前言 1.APP怎么读取按键值 1.1.查询方式 1.2.休眠-唤醒方式 1.3.poll方式 1.3.异步通知方式 1.5. 驱动程序提供能力,不提供策略 2.按键驱动程序框架--查询方式 ...
- qt checkbox 选中事件_Qt基础知识学习
Qt基础知识学习 Qt C++ SQLite ★★★★★ Qt · 简介 Qt是由Qt Company开发的面向对象的跨平台C++图形用户界面应用程序开发框架. 前期 · 准备 01 辨析Qt(开 ...
- K8s基础知识学习笔记及部分源码剖析
K8s基础知识学习笔记及部分源码剖析 在学习b站黑马k8s视频资料的基础上,查阅了配套基础知识笔记和源码剖析,仅作个人学习和回顾使用. 参考资料: 概念 | Kubernetes 四层.七层负载均衡的 ...
- Linux操作系统基础知识学习
Q1.什么是GNU?Linux与GNU有什么关系? A: 1)GNU是GNU is Not Unix的递归缩写,是自由软件基金会(Free Software Foundation,FSF)的一个项目, ...
最新文章
- 职校电子计算机专业高考分数线,2015年重庆高考分数线公布:一本文572理573
- pandas 合并数据
- 火爆背后的挑战:直播平台的高并发架构设计
- eclispe快捷键
- scala集合中添加元素_如何在Scala中获得列表的第一个元素?
- servlet25配置和30
- mysql创建虚拟网卡_创建启动虚拟网卡
- 百度风云榜前50名小偷——专门用于提高你网站的流量!
- CloudStack升级中文指南:4.1.x/4.2.x 至4.3版本
- 数字未来,NFT未来,Game Farmer创始人胡烜峰在IGS上讲述FoxNFT和他的故事
- [转] PHP开发通用型标题图片功能
- Gensim库生成与导入W2V模型_CodingPark编程公园
- ROS机器人 Autolabor Pro1与激光雷达 TF坐标变换
- 旅游行业适合做小程序吗?
- Nordic nRF52内部DCDC使能
- spring核心编程思想—beanfacotry和applicationcontext区别
- 网站虚拟空间常见参数介绍 如何选好主机空间
- 关于java.lang.Exception:No tests found matching的一系列解决方法
- 【P4149 [IOI2011]Race】点分治
- thinkphp3的模型类字段
热门文章
- McAfee企业版8.8——病毒库的备份与还原
- Mock.java - 二次封装(基于属性结构类型生成测试数据)
- linux 下载文件 rz,linux rz/sz上传下载文件命令
- java+widthstep,OpenCV 中结构体IplImage 成员width,widthStep使用注意事项
- 教你复制百度文库中的内容
- Diffusion Models:生成扩散模型
- 计算机二级修改并应用基本简历模板,如何通过Office模板轻松快捷创建简历
- 各省简称 拼音 缩写_全国城市拼音 缩写
- Anylogic问题-----模型运行中外部输入控制模型
- SpringBoot 微信H5支付