千锋教育-做有情怀、有良心、有品质的职业教育机构

当前位置:首页  >  关于学院  >  技术干货  >  Unity技术干货  >  正文

Unity如何实现一个弹框队列管理PopManager

来源:千锋教育
发布时间:2022-09-28 17:11:00
分享

  一.前言:

  最近游戏中加的弹窗页面有点多,导致快上线时,频繁出现弹窗的问题,不是冲突了,就是出不来,所以我想从根源上解决这个问题。

  解决弹窗的问题,需要把握好3点:

  1.需要整理各个弹窗的优先级,

  2.需要清除各个弹窗的弹出条件和弹出时机。

  3.需要做好弹窗队列的统一管理。

  二.弹窗配置

  如果想更方便的管理弹窗的优先级,弹出条件,关闭时机等,我们必须有一个弹窗配置表。如下所示:

Unity如何实现一个弹框队列管理PopManager1

  id:就是弹窗的id

  name:每个弹窗的名字,用于打开弹窗UI

  priority:弹窗优先级,默认是按照优先级和先进先出进行排序

  page_mask:基于二进制位存储的数值,每一位可代表一个弹出条件,比如我们有4个页面可以出弹窗,每个弹窗代表1位,我们如果想在4个弹窗都可以弹出就是二进制的1111=十进制的15,如果是想在1和3弹出,就是0101=5。当我们弹出弹窗时,只需要和page_mask进行按位与&一下即可。

  switch_behavior:切换场景后,弹窗管理器挂起,未弹出的剩余弹窗如何处理

  can_repeate:相同弹窗是否可以重复入栈,true,代表相同弹窗但是展示内容不同可以重复,false,代表相同弹窗,不管内容是否相同,我们都只保留最后一个。

  三.弹窗数据包装

  当我们打开一个弹窗,并且希望他进入弹窗管理器的堆栈时,我们需要给弹窗进行一个包装,为了方便存储我们需要用的各个参数。比如优先级等参数

  ignoreGuide:代表弹窗弹出时,如果碰到新手引导之类的强引导,弹窗的行为,如果位true,代表无视引导,直接弹出。false,代表先让引导走完,弹窗等待

  persistent:代表是否持久化弹窗数据。以为有些弹窗触发时机只有一次,如果被其他条件阻塞导致无法弹出,那么玩家退出游戏后,这个弹窗就永远不会再出现,那么就需要我们在游戏挂起后台时,把弹窗数据存储到本地。下次用户打开游戏,那么弹窗数据依然在队列中。

Unity如何实现一个弹框队列管理PopManager2

  四.弹窗管理器

  下面展示了一下弹窗管理器的大致结构,我们可以简单的看下结构:

  popList:存储着我们的弹窗数据,虽然我们说是队列,但其实是个table表,这样方便我们按优先级排序。

  waitList:当我们要弹出下一个弹窗时,如果他不符合弹出条件,我们就把它加入到waitList中。等待下次resume时,重新进入popList。

  curPop:代表当前正在弹出的弹窗

  suspend:弹窗队列的挂起状态,false:代表未挂起,当curPop关闭时,会通过事件通知PopManager,然后队列会再弹出一个新弹窗,直到popList为空。true:代表挂起,当curPop关闭时,不会有下一个弹窗弹出,知道调用Resume,弹窗才再次弹出

Unity如何实现一个弹框队列管理PopManager3

Unity如何实现一个弹框队列管理PopManager4

  五.弹窗的持久化存储

  当系统回调函数,OnApplicationPause调用时,代表App的挂起状态,也就是即将退出状态。所以我们需要把persistent为true的弹窗都序列化到本地,等待下次运行时,初始化到popList中。

Unity如何实现一个弹框队列管理PopManager5

 

  六.弹窗弹出条件判断

Unity如何实现一个弹框队列管理PopManager6

  七.弹窗的使用场景

  下面展示了基本的弹窗使用

  1.只传参数windowName即可,优先级等参数直接读配置表

  2.传windowName和priority,指定优先级后,此弹窗的优先级就不走配置表了,方便灵活配置,

  3.指定忽略引导,NotificationTip,因为特殊的系统级授权弹窗,所以可以无视引导,直接弹出。

  4.ProgressSaving页面,触发时机只有一次,所以指定persistent为true,保证大退后,弹窗一样会在下次打开游戏弹出

  5.在弹窗必要参数后,还可以自定义参数,包括number,string,table类型,甚至funciton类型。

Unity如何实现一个弹框队列管理PopManager7

  默认情况下,我们可能只需要一个windowName+自定义参数,所以可能需要频繁的传参三个nil,有点麻烦,这里可以稍微优化下,比如改为传table,或者重载两个方法。大家可以自己选。

  八.示例代码:

  示例代码,仅供参考:

  PopWrapper.lua

Unity如何实现一个弹框队列管理PopManager8

  PopManager.lua

Unity如何实现一个弹框队列管理PopManager9

Unity如何实现一个弹框队列管理PopManager10

Unity如何实现一个弹框队列管理PopManager11

Unity如何实现一个弹框队列管理PopManager12

Unity如何实现一个弹框队列管理PopManager13

Unity如何实现一个弹框队列管理PopManager14

声明:本站稿件版权均属千锋教育所有,未经许可不得擅自转载。

相关推荐

  • fps低怎么办?什么原因导致的? 低帧率(FPS)通常是指在实时图像渲染或视频播放过程中,每秒显示的帧数较低,导致画面不流畅或卡顿。下面是一些可能导致低帧率的原因和相应的解决方法:1.硬件性能不足:如果计算机或设备的处理能力不够强大,
  • fps低了怎么调高 要提高FPS(FramesPerSecond,每秒帧数)的性能,可以尝试以下方法:1.优化图形设置:降低图形质量和特效,如分辨率、纹理质量、阴影等。这会减少图形渲染的工作量,提高性能。2.关闭后台进程
  • 反射的实现原理? Load(“程序集”)加载程序集,返回类型是一个Assembly,得到程序集中所有类的名称,foreach (Type type in assembly.Type type = assembly.创建此类型实例,MethodInfo mInfo = type.
  • unity如何接入puerts webpack适用于我们执行ts编译为js用的插件,把需要的依赖加入到dependencies标签中,然后在vscode的终端输入npm install 拉取依赖即可,拉取成功后,会生成一-个node_ modules的文件夹,里面就是我们拉取的依赖库,可能很大,这个文件夹最好加入到忽略列表中。代码如下所示:
  • xlua-framework之UI框架 我们前面说过xlua-framework这个框架,是一个纯lua的一个框架,也就是说我们所有的逻辑都可以在lua中实现,只有资源模块和网络模块是c#原生写的,但是也在lua中给我们包装的工具类,让我们更方便的使用。在框架的纯lua代码中,不得不说,ui框架是我最喜欢的,一套基于mvc的一套ui框架。
  • xlua-framework之网络框架 一般我们说到网络框架,主要是指Socket网络框架,如果是Http的话,我们没有必要单独介绍了,简单用可以直接使用WWW或者UnityWebRequest,如果稍微复杂的使用,可以使用RestSharp库。所以我们本章主要讨论的是xlua-framework框架是如何实现socket网络框架的。