游戏的UI管理的完整机制总结及框架展示

目录

UI管理机制总结

层级管理

显示类型

SoringLayer

使用列表记录处于不同状态的页面

供外调用的增删改查函数

资源预加载函数

外部回调执行函数

遮罩效果

还原界面

事件系统

垃圾回收


UI管理机制总结

自己根据源码总结出的一套UI管理机制,大概讲述了如何实现游戏中的UI管理。以下是具体的各种管理机制。

层级管理

在ViewManager这个函数中,给UI设定了不同的深度层级,这些层级对应UI的显示优先级或者叠放次序,例如,新手引导层可能会覆盖在普通UI层之上,

然后定义了每个UI深度层级所对应的z轴深度区间。这在渲染UI时非常重要,确保每个UI都在其应有的深度区间内。

还会定义当某个层级下的页面数量达到了该层级所对应的z轴深度区间的最大值时,就需要重新调整该层级下所有页面的显示层级,以确保它们都在其应有的深度区间内的函数,如下面的updateViewsDepth函数。

显示类型

还需要定义UI显示的类型,比如全覆盖和弹窗类型

像全覆盖类型就会有相关的处理函数保证界面的正确显示。

比如出现全覆盖类型时,会将其他UI移动到屏幕外或者设置为不可见,然后会把这些记录下来,在关闭全覆盖视图时,使用 resetOutScreenViews() 函数将这些视图还原或重新定位到正确的位置,保证它们能够被正确显示和交互。

SoringLayer

为每个UI设置其在Unity的SortingLayer的属性。sorting layer用于控制场景中不同对象之间的绘制顺序,以确保它们按正确的顺序呈现。每个sorting layer都有一个唯一的整数值,越小的值将在渲染时先被绘制。这使得开发人员能够更好地控制2D和3D场景中的深度排序,从而避免对象之间的遮挡问题,并且可以轻松地创建层叠效果。

使用列表记录处于不同状态的页面

还会有一系列的table去记录当前正在显示、添加、加载的页面等,在一系列有关页面操作的流程中会去修改这些表以记录处于各种状态的页面。

供外调用的增删改查函数

还提供了一些供外调用的addView,这个函数会加载相应的资源并显示界面,removeView函数会删除指定的界面,还有像getView,这些增删改查的函数。

资源预加载函数

还有一些预加载的函数,它确保在打开特定界面之前,所有相关的Lua脚本和数据都已经被加载,从而减少打开界面时的延迟。如loadPreData和addPreMapData。

外部回调执行函数

还会有一些执行外部提供的回调函数的方法,比如执行一些界面加载完成的回调,弹窗动画的回调。

遮罩效果

还有给界面添加上点击遮罩,可以用于模糊弹出窗口后的背景,添加半透明或者纯黑的效果,或者点击事件的屏蔽。

还原界面

还有一些关闭界面后,返回原界面,需要作出的一些还原界面的操作。

事件系统

还会声明一系列的事件类型,比如开始添加界面,界面添加完毕,移除界面的事件类型,这些事件将由于实现模块间的一个通信交互以触发某些界面状态变化。(比如在开始添加界面的事件中,ViewMask 类会自动为该视图添加一个遮罩(boxCollider),以防止用户在视图未加载完成前进行其他操作,还有添加一个正在加载中的特效。)

垃圾回收

还会处理某个界面销毁后,会检查Mono堆的使用情况,如果差异大于某个数则进行一次垃圾回收。(这里还实现了一个优化,进行垃圾回收时,程序的其他部分通常需要暂停,直到垃圾回收完成。因此,"延迟垃圾回收"的策略是在一个更合适的时间点执行垃圾回收,垃圾回收不是在每次对象销毁时立即发生,而是在达到一定的内存使用阈值后。这样可以减少垃圾回收的频率,从而减少由于垃圾回收引起的性能问题。)

总体而言,ViewManager提供了一整套完整的UI管理解决方案,从UI的加载、显示、交互到销毁,都有对应的处理机制。

大致框架及核心函数如下:

-- 定义 ViewManager 类
ViewManager = {}-- 定义 UI 层级深度
ViewManager.layerDepths = {["Guide"] = {min = 100, max = 200},["Normal"] = {min = 0, max = 100}
}-- 定义 UI 显示类型
ViewManager.displayTypes = {["Full"] = 1,["Popup"] = 2
}-- 定义 SortingLayer
ViewManager.sortingLayers = {["Background"] = 0,["Foreground"] = 1
}-- 定义记录页面状态的表
ViewManager.pageStatus = {}-- 定义添加界面的函数
function ViewManager:addView(viewType, viewData)-- 添加界面逻辑
end-- 定义移除界面的函数
function ViewManager:removeView(viewType, viewId)-- 移除界面逻辑
end-- 定义获取界面的函数
function ViewManager:getView(viewType, viewId)-- 获取界面逻辑
end-- 定义预加载数据的函数
function ViewManager:loadPreData(viewType)-- 预加载数据逻辑
end-- 定义添加预加载地图数据的函数
function ViewManager:addPreMapData(mapData)-- 添加预加载地图数据逻辑
end-- 定义执行外部回调的函数
function ViewManager:executeCallback(callback)-- 执行回调逻辑
end-- 定义给界面添加遮罩的函数
function ViewManager:addMask(viewId, maskType)-- 添加遮罩逻辑
end-- 定义还原界面的函数
function ViewManager:restoreView(viewId)-- 还原界面逻辑
end-- 定义垃圾回收的函数
function ViewManager:garbageCollection(viewId)-- 垃圾回收逻辑
end---处理指定的全覆盖视图下的其他视图,将它们移动到屏幕外部或设置为不可见。
function ViewManager:outScreenViwes(view)end---处理关闭全覆盖视图,还原之前被移动到屏幕外部或者不可见的视图,确保下方的视图能够被正确显示出来的函数
function ViewManager:resetOutScreenViews(view)
end--- 更新指定层级的所有页面的显示层级。当一个页面的层级即将超过某个上限时,会调用此函数来重新调整所有相关页面的层级,从最基础的层级开始。
function ViewManager:updateViewsDepth(depthLayer)
end-- 定义事件类型
ViewManager.eventTypes = {["StartAddView"] = 1,["FinishAddView"] = 2,["RemoveView"] = 3
}-- 返回 ViewManager 类
return ViewManager

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

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

相关文章

网络调试助手 连接Onenet 多协议接入平台 TCP透传协议

onenet文档链接 多协议接入地址 打开Onenet平台,多协议接入 选择TCP透传协议,点击添加产品,输入信息,点击确认 点击设备列表,添加设备 下面需要上传一个解析脚本文件该文件的下载地址lua文件下载地址 建立连接 设备…

策略模式终极解决方案之策略机

我们在开发时经常会遇到一堆的if else …, 或者switch, 比如我们常见的全局异常处理等, 像类似这种很多if else 或者多场景模式下, 策略模式是非常受欢迎的一种设计模式, 然而, 一个好的策略模式却不是那么容易写出来. 我在工作中也因为写烦了switch,if else 觉得很不优雅, 因…

2022 China Collegiate Programming Contest (CCPC) Guilin Site

A.Lily Problem - A - Codeforces 题意 思路 数所有周围没L的格子 #include <bits/stdc.h>using i64 long long;constexpr int N 2e5 10; constexpr int mod 1e9 7; constexpr int Inf 0x3f3f3f3f; constexpr double eps 1e-10;std::string s;int n;void solv…

cv2.threshold 图像二值化

图像二值化 whatparameters示例 what cv2.threshold是OpenCV中用于进行图像二值化的函数。它的作用是将输入图像的像素值转换为两个可能的值之一&#xff0c;通常是0&#xff08;黑色&#xff09;或255&#xff08;白色&#xff09;&#xff0c;根据一个设定的阈值。图像二值化…

DAPP开发【04】测试驱动开发

测试驱动开发(Test Driven Development)&#xff0c;是一种不同于传统软件开发流程的新型的开发方法。它要求在编写某个功能的代码之前先编写测试代码&#xff0c;然后只编写使测试通过的功能代码通过测试来推动整个开发的进行。这有助于编写简洁可用和高质量的代码&#xff0c…

主题色变量和var实现多套主题换肤

文章目录 一、前言1.1、[VueElementUI实现多套主题换肤](https://blog.csdn.net/u012804440/article/details/133975511)1.2、[VueElementUI实现在线动态换肤](https://blog.csdn.net/u012804440/article/details/133975570) 二、实现2.1、多主题色定义2.2、根节点属性修改2.2.…

RK3568平台开发系列讲解(Linux系统篇)device_node 转换成 platform_device

🚀返回专栏总目录 文章目录 一、DTB转换规则二、转换源码分析沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇将介绍通过设备树 device_node 转换成 platform_device 一、DTB转换规则 device 部分是用 platform_device 结构体来描述硬件资源的, 所以内核最终会将…

NodeJs脚手架(Koa)的简单使用

文章目录 前言一、与express的区别express-generator 提供的功能如下koa-generator 提供的功能如下两个生成器共同支持的项目骨架描述如下 二、使用步骤安装 Koa 生成器使用koa2创建项目PM2的使用 三、基础目录说明配置文件package.json入口文件 bin/www核心文件 app.jsroutes …

剑指 Offer(第2版)面试题 17:打印从 1 到最大的 n 位数

剑指 Offer&#xff08;第2版&#xff09;面试题 17&#xff1a;打印从 1 到最大的 n 位数 剑指 Offer&#xff08;第2版&#xff09;面试题 17&#xff1a;打印从 1 到最大的 n 位数解法1&#xff1a;字符数组解法2&#xff1a;全排列 剑指 Offer&#xff08;第2版&#xff09…

前端实现token无感刷新的原因和步骤

前端实现无感刷新 需要这么做的原因 在使用过程中&#xff0c;如果token过期&#xff0c;再操作页面可能就需要重新返回登录页获取token了&#xff0c;在持续使用的过程中可能会出现多次跳去登录页的情况&#xff0c;用户体验很不好。所以需要做无感刷新 做token无感刷新的方…

windows下ffmpeg源码编译

参考&#xff1a;windows上使用vs2019和msys64编译 ffmpeg 4.3 | 码农家园 (codenong.com) 安装命令&#xff1a; pacman -S nasm pacman -S yasm pacman -S make pacman -S cmake pacman -S diffutils pacman -S pkg-config pacman -S git 1.编译 x264 将 x264放到home文件下…

mfc 设置excel 单元格的列宽

CString strTL, strBR;strTL.Format(L"%s%d", GetExcelColName(cd.nCol), cd.nRow);strBR strTL;CRange rangeMerge range.get_Range(_variant_t(strTL), _variant_t(strBR));rangeMerge.put_ColumnWidth(_variant_t((long)(20))); 宽度设置函数为 &#xff1a; pu…

CSS新手入门笔记整理:CSS背景样式

背景颜色&#xff1a;background-color 语法 background-color:颜色值; 颜色值有两种 一种是“关键字”&#xff0c;指的是颜色的英文名称&#xff0c;如red、green、blue等。参考CSS 颜色名称。另外一种是“十六进制RGB值”&#xff0c;类似“#FBE9D0”形式的值。参考十六…

HT78621 3.5A开关限流降压变换器基本参数信息

HT78621是一款高压降压开关稳压器&#xff0c;可向负载提供高达2A的连续电流。 HT78621 特性&#xff1a; ・宽输入电压: 5V – 60V ・峰值开关电流限值典型3.5A ・Z高1MHz开关频率 ・支持PWM调光控制输入&#xff0c;应用于LED ・集成G端MOSFET的短路保护 ・200μA静态电…

CentOS7 防火墙常用命令

以下是在 CentOS 7 上使用 firewall-cmd 命令管理防火墙时的一些常用命令&#xff1a; 检查防火墙状态&#xff1a; sudo firewall-cmd --state 启动防火墙&#xff1a; sudo systemctl start firewalld 停止防火墙&#xff1a; sudo systemctl stop firewalld 重启防火墙&…

启动 AWS Academy Learner Lab【教学】(Hadoop实验)

&#x1f525;博客主页&#xff1a; A_SHOWY&#x1f3a5;系列专栏&#xff1a;力扣刷题总结录 数据结构 云计算 第一部分 创建实例过程 首先&#xff0c;需要创建3台EC2&#xff0c;一台作主节点 (master node)&#xff0c;两台作从节点 (slaves node)。 1.镜像选择 EC2&…

如何基于Akamai IoT边缘平台打造一个无服务器的位置分享应用

与地理位置有关的应用相信大家都很熟悉了&#xff0c;无论是IM软件里的位置共享或是电商、外卖应用中的配送地址匹配&#xff0c;我们几乎每天都在使用类似的功能与服务。不过你有没有想过&#xff0c;如何在自己开发的应用中嵌入类似的功能&#xff1f; 本文Akamai将为大家提…

梯度上升和随机梯度上升

目录 梯度上升算法&#xff1a; 代码&#xff1a; 随机梯度上升算法&#xff1a; 代码&#xff1a; 实验&#xff1a; 做图代码&#xff1a; 疑问&#xff1a; 1.梯度上升算法不适应大的数据集&#xff0c;改用随机梯度上升更合适。 2.改进过的随机梯度算法&#xff0…

Android Edittext进阶版(Textfieids)

一、Text fieids 允许用户在 UI 中输入文本&#xff0c;TextInputLayout TextInputEditText。 在 Text fieids 没出来(我不知道)前&#xff0c;想实现这个功能就需要自己自定义控件来实现这个功能。 几年前做个上面这种样式(filled 填充型)。需要多个控件组合 动画才能实现&a…

游戏开发增笑-扣扣死-Editor的脚本属性自定义定制-还写的挺详细的,旧版本反而更好

2012年在官方论坛注册的一个号&#xff0c;居然被禁言了&#xff0c;不知道官方现在是什么辣鸡&#xff0c;算了&#xff0c;大人不记狗子过 ”后来提交问题给CEO了&#xff0c;结果CEO百忙之中居然回复了&#xff0c;也是很低调的一个人&#xff0c;毕竟做技术的有什么坏心思呢…