前言
项目中有一些通用功能供业务层开发使用,这些通用功能必须优先于玩法的开发,因为玩法开发时会大量的使用这些功能。假设在开发期间没有通用功能,后期肯定要边骂边修改成通用功能。下面我会罗列一下项目中常用的通用功能,最必要的是S级,建议项目开始的时候优先开发,重要的是A级,不太紧急的是B级,前期开发不着急的是C级。
资源配表与ResourceManager(S级)
尽量一切资源用配表,一个类型的资源共用一个Sheet页。GameObject、UI预设、场景、特效、Texture、图集、shader、音频、AnimatorController等
业务层想要加载一个粒子特效,通过中间层Loader调用ResourceManager.LoadGameObject(资源Id)并返回到业务层。这样做的好处是,业务层只关心资源Id就好了,其他的不care。再进一步优化这个资源Id以后也是由策划去配置,比如有个系统参数表,程序通过读该表拿到值,再用该值去调用加载接口。
既然有加载方案了那么还要有对象池以及对象池释放策略。这个涉及资源管理方案设计,该方案应该有加载、卸载、对象池、引用计数等功能,这是一个庞大的系统本篇不过度深入。
有限状态机(S级)
状态机没啥好说的,控制整个游戏的流程,有了状态机的概念让游戏运行阶段有了清晰的区分。
事件系统EventManager(S级)
事件系统最大的贡献就是让功能与功能之间解耦,该系统应当实现同步发送和下一帧发等接口。
玩法间跳转管理器JumpMamanger(B级)
这是一个非常常见的功能,比如从任务UI跳转到具体的刷关玩法,帮助玩家快速完成任务。
音频播放器AudioMamanger(B级)
业务层想要播放一个音乐,只需要关心播放资源Id和接口>>AudioManager.PlaySound(资源Id)
红点系统RedDotManager(C级)
红点系统对于一个程序的游戏框架还是很有存在的必要的,由于红点显示逻辑杂乱,对业务开发的小伙伴来说自己去维护费力不讨好,有红点系统真香。不过红点系统可以到上线前再做,这个模块建议必须开发, 但优先级弱于业务开发
网络模块NetManager(A级)
网络模块的核心是前后端通信,涉及到Socket、protocol Buffer协议、大小端、数据池缓存等内容,这里就不讨论网络框架了,下面讨论一下网络框架面对业务开发该有的功能。
网络模块面对业务开发的基础功能有:注册成功回调、注册错误回调、发送协议消息
项目中注册网络协议回调一般有两种
- 写在一个文件中集中管理
- 写在每个业务Manager的初始化函数中
这两种写法在项目中都见识过,区别并不是很大。
发送消息的原理:框架把业务层的消息序列化成Bytes通过Socket发送给服务器,服务器处理协议数据后再通过Socket发给客户端,客户端解析数据包后再找到对应的回到函数发给它,让它处理自己的业务。
UI管理UIManager(S级)
游戏中一切玩法皆离不开UI,因此UI管理器可以说是一个游戏的重中之重了。
UIManager应该有的基础功能是:加载UI、显示UI、隐藏UI、回收UI、生命周期事件(OnAwake、OnEnable、OnDisable、OnDestroy),业务开发层一般也需要有Update函数处理一些功能,在Tolua框架下是没有Update的,建议开发者用框架封装的倒计时控制器,如果倒计时控制器也不满足需求,则去UpdateManager里注册Update
一级优化:加个层级的概念,把UI层分为Base基础层、Top1、Top2、Top3层,每个UI应该在哪一层由配表决定,例如UI配置表,表内除了层级概念还可以有层级偏移概念,比如两个UI都在Top1层, 但想区分它们的显示优先级,则加一个Offset值,以NGUI为例其底层原理就是对SortingOrder值进行了修改,从而影响了UIPanel的渲染顺序。
二级优化:
新手引导框架(A级-B级)
新手引导功能一般都是所有功能开发完后做,但是!!新手引导的开发工作依赖UI玩法以及战斗系统,这个功能设计不好是及其操蛋的。前期在开发UI框架时应当多为新手引导考虑一下,如何锁UI、锁按钮、跳转层级等。
UI通用控件(A级)
1、UIButton按钮组件
Button最好是用个脚本来控制(UIButton),UIButton支持输入按钮ID,将来配合UI的Id和按钮ID就可以实现按钮锁定、过滤等功能,方便新手引导功能开发。按钮还有另外一功能就是播放音乐,UIButton脚本支持输入音频资源Id,点击自动加载音频资源,这个没啥好说的。
2、Lua开发如何获取UI上的目标组件
UI预设显示后不要用Find的方式去找子物体的组件然后缓存下来,查找效率有大问题,项目中建议的方式是写一个序列化工具,然后预设挂上这么一个序列化脚本,再把所有的目标组件拖上去。
该工具支持:1:自定义组件名 2:UIElement嵌套UIElement,启动后递归解析存储 3:预设加载成功后把C#数据传给Lua,在Lua内根据名字直接拿到组件。
3、高效的Scrollview
(①滚动控件刷新复用(假设ScrollView高度为1000,控件宽度为200,5个控件就可以摆满屏幕,6个控件就可实现无缝滚动 ②Lua实现供上层开发使用的class类,例如CommonWrapContent类,该类内有构造函数负责存储滚动数据、初始化复制条目数量等以及上层实现的业务Class类,该业务class就是CommonWapContent和业务代码之间的桥梁与刷新UI工具,其次是要有刷新全部,刷新单条、位移到指定index,位移到具体Pos,还可以添加点击函数等,点击事件这一块根据项目需求可有可无,一般得有)
4、高效且支持非固定高度的Scrollview
5、物品通用预设
这个非常重要!!!例如道具、礼包、
6、UITopBar
很多游戏会有顶部条的概念、展示玩法名称、有返回按钮、活动时间、帮助按钮等,这是一个通用功能,千万不要每个玩法自己去写!!!!!项目中通用的功能,一定不要嫌麻烦!一定要做成通用的
可以新建一个表格实现玩法名称的配置,如果是多语言游戏,也可以用多语言表去配置。
5、Input控件
Lua层CommonLuaInput类实现C#层各种事件的回调供业务层使用,还要实现输入检测掩码,默认检查空字符、最小长度、最大长度、屏蔽字符、非法字符、敏感字符等功能
6、UILabel多语言
一般来说多语言的实现是在预设上填字符串的配表Id,配表的每一行数据有多个语言的版本,在开发前期一定要考虑好要不要多语言,如果项目后期再接入多语言,会异常的麻烦,不仅要手动输入资源Id,还要考虑公共文字库,重复出现的文字比如确认取消这种就不要重复配置了。
通用提示框TipsManager(C级)
通用提示框的作用就是弹出Yes No供玩家选择,上层代码决定Yes和No按钮的回调,以及是否显示No按钮
UpdateManager(B级)
提示:只有Lua框架需要向C#注册Update的调用,如果是纯C#开发本来就有,不过纯C#开发的手游项目压根不存在,lua热更几乎是个必然选择。
计时器管理TimerManager(B级)
倒计时在业务开发中是一个常用功能,当时间结束时回调给业务的函数。
业务层的需求:告诉控制器回调时间、回调次数,
计时器通常有三种类型,1:单次倒计时 2:按固定事件执行倒计时 3:按帧执行倒计时
回调函数接收到的数据:本次是否结束、剩余次数等
切记这里要做对象池、避免重复创建对象。
时间戳工具TimeStampUtility(C级)
业务层显示玩法的时间是一个常用功能,比如某个玩法X年X月X日开启,敬请期待,服务器发过来的数据肯定是时间戳,然后在客户端把时间戳转换成具体时间。时间戳工具该有的功能有
- 时间戳转年月日时分秒
- 两个时间戳计算时差
- 当前时间戳时间距离目标时间戳差值,返回年月日时分秒(当前时间戳心跳包已经有了,所以只需要目标时间戳就可以知道距离时间啦)
-
指定时间戳已经经过了多久(某些玩法会用到)
- 时间戳单位是秒还是毫秒的判定
字符串工具StringUtility(C级)
由于Lua层没有C#这么强大的字符串功能,需要封装
获取字符串的字符数量
截取字符串子串