游戏UI管理的一点思考:如何优雅地处理复杂的窗口层级

界面是界面,层级本来就是固定的,如果想附着到某个节点,这是更细的业务逻辑,和界面本身无关

你这个太复杂了,用一个队列管理简单明了,一个层级完全足够。
我的方案是界面显示和关闭都是全局管理的,与界面本身无关,显示或关闭只要派发一个全局事件就够了,还能异步处理。
先定义一个界面打开事件


在其它地方发送一个事件:sendMessage(new OpenMessage({ viewName: Names.HelpPanel, closeView: ‘all’ }), true); // true参数表示异步处理

那是因为你只碰到这种一个队列层级就能搞定的游戏,这个分层不是画蛇添足来的,只能说大多数情况下一个队列层级够,但这也只是多层情况下的默认窗口队列

点了你先打开界面在加载资源,他说你的界面会闪,你先加载资源再打开界面他说卡

我就分2层, windowLayer, alertLayer
一般情况,所有UI都在windowLayer层,警告,断网等在alertLayer,
每个UI都有自己的配置(全屏/弹窗等),弹窗有半透明黑色背景

大部分90%情况都在用这两层。但是从框架设计上还是会尽可能预留多几层,满足所有需求:
Bottom
Base
Popup
Guide
Tip
Top
做过最多6层,Bot和Top纯预留,几乎用不到

对头,可以不用,但是需要支持

我是UI管理思路和楼主的差不多,不过也有一些差别,差别就是解决你说的这些问题的,我在UIBase类定义了一个获取资源包的接口,子类UI实现这个函数,可以把需要动态计算的资源放到这个函数里面,加载UI时调用函数获取资源列表。对于mask,我主张每个UI用自己的mask,没必要复用,而且直观来讲,分层UI,多层叠加的时候,本来就应该越往底层越暗,然后就是打开和关闭动画,我是在UIBase里面实现了一个预制的动画,子类不想要预制效果,直接重写就可以了,而且动画不是强制调用,而且是生命周期onShow里面子类自己决定要不要调用打开动画,关闭时,close(参数)决定动画类型。

跟我一样, mask问题没必要复用 因为如果遇到mask样式和产品那边需求的变化 这一改 直接改基类了, 而且这玩意很多人写的时候 认为是基类 代码风格和质量特别不好, 我之前遇见过 其次就是弹出关闭动画问题 我跟这位朋友一样 分两个生命周期 自己选择调用什么类型的动画 也可以选择不调用 更多的自定义权交给使用者 我认为这种的复用性高参考不是在一个公司 复用多种项目, 而是能换公司 也能复用

mask叠加的情况至少我这边90%遇到是策划不想看到的,两三层就太黑了。mask复用情况下也支持各自窗口加自己的mask,复用的那个mask禁用调就行。

1赞

我有一计,在游戏加载阶段把所有弹窗和资源都加载了,并且还实例化好了,挂载好了,然后隐藏。
等策划要的时候就可以秒开,然后他再蛐蛐游戏加载慢的话,告诉他花钱换手机换硬件 :rofl: :rofl: :rofl:

1赞

策划:加载太慢了