[游戏开发]项目开发中的通用功能

前言

 项目中有一些通用功能供业务层开发使用,这些通用功能必须优先于玩法的开发,因为玩法开发时会大量的使用这些功能。假设在开发期间没有通用功能,后期肯定要边骂边修改成通用功能。下面我会罗列一下项目中常用的通用功能,最必要的是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协议、大小端、数据池缓存等内容,这里就不讨论网络框架了,下面讨论一下网络框架面对业务开发该有的功能。

网络模块面对业务开发的基础功能有:注册成功回调、注册错误回调、发送协议消息

项目中注册网络协议回调一般有两种

  1. 写在一个文件中集中管理
  2. 写在每个业务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日开启,敬请期待,服务器发过来的数据肯定是时间戳,然后在客户端把时间戳转换成具体时间。时间戳工具该有的功能有

  1. 时间戳转年月日时分秒
  2. 两个时间戳计算时差
  3. 当前时间戳时间距离目标时间戳差值,返回年月日时分秒(当前时间戳心跳包已经有了,所以只需要目标时间戳就可以知道距离时间啦)
  4. 指定时间戳已经经过了多久(某些玩法会用到)

  5. 时间戳单位是秒还是毫秒的判定

 字符串工具StringUtility(C级)

由于Lua层没有C#这么强大的字符串功能,需要封装

获取字符串的字符数量

截取字符串子串

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Little丶Seven

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值