4.1 *EventLib 事件系统

4.1.1 事件系统原理

事件系统大致分为三个模块:EventMgr(事件管理者)、EventLib(事件)、Eventname(事件码)。事件管理者(EventMgr)负责事件的广播和注册,注册的事件会新建一个事件对象(EventLib)并存储在一个events列表当中,事件码作为这个表的key。每个事件都需要注册一个事件码(Eventname)用于区分,在C#里通常是用枚举类型实现,而在lua里通过表和字符串的形式实现。而function类型的方法则会存储在handlers中,在C#里一般是用delegate字段定义成委托类型,而在lua里可以直接把方法作为参数进行传递。注意,在此处function是以key的形式存储,而value值统一赋一个true的值。当事件管理者触发事件进行广播之后,就会执行事件列表里的所有方法。

4.1.2 事件码的注册

当我们需要新定义一个事件的时候,需要先在event_name中定义一个event_name类的字符串变量,字符串的内容最好与变量名保持一致。并在当前一行写好注释,以供他人复用。

4.1.3 事件的触发

在需要触发事件的地方用EventMgr提供的Instance单例接口执行Fire方法,传入事件码以及若干个参数。

EventMgr.Instance:Fire(event_name.backpack_change, baseIdDict)

4.1.4 事件的监听

进行事件监听之前需要用EventMgr提供的Instance单例接口执行AddListener方法,添加相应事件码以及要执行的方法。而这一步通常是在对象初始化阶段进行,并且要在对象销毁后执行RemoveListener方法进行解除。

4.2 *Tween 动画类

框架的Tween二次封装了LeanTween的一些常用API,主要分为三种类型:动画操控、动画管理、动画运动类型设置。动画操控包括有物体大小、位置、旋转、颜色等的变化以及数值变换。而动画管理负责动画的停止、暂停、继续、查询状态等。运动类型设置则是设置动画运动的曲线。

4.2.1 动画操控

动画操控的方法参数依次为物体、目标值、动画完成时长、动画执行完毕的回调、缓动类型。其中物体可以为GameObject或RectTransform,使用移动类型方法时会对应改变position或anchoredPosition。而目标值可以为Vector矢量也可以为transform组件,按前者执行的目标是固定的,不会随着坐标变化而变化。而按后者执行的目标是动态的,会随组件的变化而变化。缓动类型是变化速率的曲线,具体类型可翻阅资料。此类方法最终都会返回一个值,该值是本次动画的具体信息类,具有唯一性,我们可以通过该值进行一些处理,例如后续的管理。

4.2.2 动画管理

动画的管理是通过上述提到的返回的信息类实现的,将该信息类作为参数调用管理的方法可进行停止、暂停、继续、查询动态等操作。在一个用到tween动画的类的销毁里面就会用到Cancel的方法。

4.3 *Timer 计时器

4.3.1 计时器原理

框架内提供的计时器是通过Update帧更新实现的。通过ModuleManager.realtimeSinceStartup - self.initTime,即每帧更新的时间戳减去本对象初始化的时间戳得到时间长度,再用此时间长度去和设置的时间间隔做对比。

if (self._leftTime > ModuleManager.realtimeSinceStartup - self.initTime) thenreturn trueend

self._leftTime初始值为0(使用持续定时器的情况),此时不会被返回,进而继续执行xpcall(zfun,errFunc)即定时执行的方法。之后self._leftTime会进行一个与设置时间间隔等长的累加,这样直到下次帧更新到同样时间长度时才会再次执行方法并累加,否则都会被返回。

local result = truelocal status, err = xpcall(zfun, errFunc)if status thenresult = errelseresult = falseendself._leftTime = self._leftTime  + self._durationreturn result ~= false

4.3.2 计时器用法

框架提供的计时器分为两种,循环计时器和一次性计时器。而这两种计时器都通过TimerManager.Add(...)进行添加,并根据传入的参数不同而调用对应的计时器。传入参数为三个时,调用添加循环计时器的方法,参数依次为无意义参数(默认0,该参数不影响程序执行)、时间间隔、需要执行的方法(function)。传入参数为两个时,调用添加一次性计时器的方法,传入参数依次为时间间隔、需要执行的方法(function)。注意,此处时间单位为毫秒,当要传入的时间单位为秒,则需要手动*1000.

local num_args = select("#", ...)if num_args == 2 thenreturn TimerManager.getInstance():AddOnceTimer(select(1, ...)/1000, true, select(2, ...))elseif num_args == 3 thenreturn TimerManager.getInstance():AddRepeatTimer(select(2, ...)/1000, true, select(3, ...))elseLogError("Timer参数错误")end

该方法会返回一个id,该id是通过或的位运算获得。当需要将计时器销毁时,就需要用到对应的id进行删除。

4.4 *Runner 帧更新

4.4.1 帧更新原理

框架中Runner的Update、LateUpdate帧更新都是依托Unity的MnonBehaviour的帧更新实现的。而其他脚本想要实现帧更新可以借助Runner里的帧更新实现。

4.5 *RedManager 红点模块

4.5.1 红点逻辑

红点模块是用表嵌套的形式构造了一个树形结构,公共UI与个体UI构成父子关系,当任一子节点有红点时父子节点也有红点。而父节点的红点主动消除则不会影响子节点的红点状态,直到下一次子节点的红点状态有更改,父节点的红点才会重新出现。

4.5.2 红点树的构造

使用红点模块就要构造一棵红点树,首先要在RedEnum中注册红点。在RedEnum.RED_ID_LIST中添加叶子节点,在RedGroupName中添加父节点。最后RedEnum.RedGroup中把子节点添加进父节点的表中,表中的元素就作为该表红点的子节点。RedGroupName中的节点不一定为根节点,它们同样可以作为其他节点的子节点。定义好树形关系后,RedManager会在__init()阶段将红点树构造出来。

4.5.3 红点逻辑的绑定

红点逻辑需要搭建一个关联,将红点id与更新后的红点状态绑定起来。由于红点在外层UI也会显示,无论相关面板打开与否,都要进行红点的检测,所以这一步需要在Manager类中进行。在RedManager.Instance:bindRedHandler(id,func)传入红点id和带有红点状态返回值(boolean)的方法。而该方法涉及到相关数据的获取,因此一般定义在model类中,进行数据的计算与对比,并返回一个boolean值,代表红点的显示与否。而红点的绑定就是将该方法传递到对应的red_vo对象的func当中。

4.5.4 红点计算

在涉及或监听到红点状态改变的地方调用RedManager.Instance:doRedpointDelay(id,delay,...)方法,方法参数依次为红点id、计算延迟值、若干个需要传递的参数。延迟参数不填,默认为0。该方法最终会调用red_vo对象的func,即上述绑定步骤中传入的计算红点的方法,然后将该boolean赋值给red_vo对象的red_status。

4.5.5 监听红点事件

红点的显示是在view类中实现的,因此红点的监听也是在view中进行。与事件系统类似,监听也是添加相应的红点id以及需要执行的方法。在该方法再调用RedManager.Instance:getRedStatus(id)获取对应的红点状态,据此显示或隐藏红点。当view类销毁时,同样需要手动移除红点监听。

Lua游戏客户端框架通用功能模块相关推荐

  1. 借Google Guava学习发现和开发通用功能模块

    如何发现通用的功能模块? 很多人觉得做业务开发没有挑战,实际上,做业务开发也会涉及很多非业务功能的开发,比如我们前面讲到的 ID 生成器.性能计数器.EventBus.DI 容器,以及后面会讲到的限流 ...

  2. 微擎we7微赞官方通用功能模块插件带XML文件分享

    1.微赞we7模块 - 微商城 微商城是基于当前很受欢迎的微信的一种传媒方式中的一种商业运用,微信的当前的火热是一个商机,基于微信的传播速度,及其简便等优点,为商家提供一个平台,在这个更简便的.方便的 ...

  3. image加载图片 ui unity_【Unity游戏客户端框架搭建】四、资源管理之理论篇

    先抛出个问题: 我们在谈论资源管理的时候,是在讨论什么? 整理了一下内容,大概就以下几点: 目录规划 内存管理 包体大小控制 AB打包粒度 一.目录规划 在开始资源管理之前,先讲一下目录规划. 实际的 ...

  4. slg游戏客户端框架简析

    前言 从18年3月开始,进入新公司,参与一款slg海战类游戏的开发,全程负责slg海战类游戏大地图模块的开发,以及部分框架的完善和其他内容的开发.游戏已经正式上线一段时间了,工作空闲了一些,趁空闲的这 ...

  5. 学习Struts--Chap02:Struts2框架各个功能模块和程序执行流程的介绍

    1.Struts2的系统架构: 2.架构中不同Key的作用介绍: servlet Filters:过滤器链,client的全部请求都要经过Filter链的处理. Struts Core:Struts2 ...

  6. golang Leaf 游戏服务器框架简介

    Leaf 是一个由 Go 语言(golang)编写的开发效率和执行效率并重的开源游戏服务器框架.Leaf 适用于各类游戏服务器的开发,包括 H5(HTML5)游戏服务器. Leaf 的关注点: 良好的 ...

  7. 【游戏客户端与服务器面试题】-- 2022年最新游戏客户端与服务器面试(lua篇持续更新)

    [游戏客户端与服务器面试题干货]-- 2022年度最新游戏客户端面试干货(lua篇) 文章目录 一.Lua的8种数据类型 (1) nil 类型 (2) boolean类型 (3) number类型 1 ...

  8. 【游戏客户端面试题干货】--2021年最新游戏客户端面试干货(lua篇)

      [游戏客户端面试题干货]-- 2021年度最新游戏客户端面试干货(lua篇)     大家好,我是Lampard~~   经过春招一番艰苦奋战之后,我终于是进入了心仪的公司.   今天给大家分享一 ...

  9. 浅谈游戏服务器---功能模块上来看

    游戏服务器在网游上的作用不容考虑,游戏能做大到什么程度,还是有很大的依靠的,这篇文章先从功能模块的角度来谈一个完善的游戏服务器需要实现哪.     一:游戏服务器的作用:连接各个网游客户端,实现各客户 ...

  10. python web自动化测试框架搭建(功能接口)——功能测试模块

    功能测试使用selenium,模块有: 1.futil: 公共方法,如元素高亮显示 # coding=utf-8 """高亮显示元素""" ...

最新文章

  1. spring访问oracle数据库表,Spring访问oracle数据库配置步骤
  2. IBS illustrator for the presentation and visualization of biological sequences 中山大学
  3. 2013杭电warm up1 hdu 4712 Hamming Distance
  4. java解析c上传十六进制_磕代码c/c++/java:十六进制转十进制
  5. 红黑树 删除某节点后 旋转3次 举例
  6. SAP Spartacus Static Multi-Site Configuration
  7. Ubuntu14.04下使用apt-get命令傻瓜式安装ffmepg成功
  8. Python格式化函数format详解
  9. 【进阶篇】Vue Devtools——vue开发调试神器
  10. 基于MRG_MyISAM引擎的Mysql分表
  11. IT30:12年前电脑笔记,回忆杀(1)
  12. 基因工程-5-目的基因导入受体细胞的方法
  13. 微信表情包的制作以及50*50像素图片太模糊的处理方法
  14. 新浪微博登录html代码,新浪微博登录仿DiscuzX1.5论坛QQ登录样式 - YangJunwei
  15. 人工智能AI系列 - 元宇宙 - 2D虚拟人
  16. 浙工大 drcom客户端 嵌入 Linux路由器
  17. 更新Win10版本后,wifi图标不见了,并且连接不到wifi和宽带,以及点击网络和Internet闪退的情况
  18. 视频号领域发布的不同时间,视频号上热门秘诀:国仁楠哥
  19. jit和jitx区别_JIT模式
  20. python1到100奇数相加_Python:从inpu将奇数相加

热门文章

  1. 关于页眉的奇偶页不同设置和奇数页页眉展示每一章名称的设置方法
  2. C51单片机实现 贪吃蛇
  3. 拜耳再投4亿元提升在华处方药产能;阿斯利康进博会公布新冠疫苗最新进展 | 美通企业日报...
  4. 关于mysql插入数据报错:Incorrect string value: '\xE9\x81\x93\xE5\x85\xB7...' for column 'gclass' at...
  5. imx6 android gadget,imx6q安卓启动失败显示Suspending console(s)(已解决)
  6. qq空间显示手机型号android,qq空间如何设置显示手机型号
  7. 双屏计算机主机是什么,电脑双屏显示有人知道关于一个主机两个显示器的问题吗 爱问知识人...
  8. iOS 开发实践之Auto Layout(From Vincent Sit)
  9. poi 移除图片_用poi替换ppt中的文字和图片
  10. 2011年中国大陆十佳IC设计公司