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
版权归原作者 晴夏。 所有, 如有侵权,请联系我们删除。