以MMORPG为例,谈谈战斗系统该如何实现?
讲师简介:姜海涛,腾讯互动娱乐北极光工作室群后台开发高级工程师。5年程序开发经验,参与过《天涯明月刀》游戏开发。下文为《MMORPG AI系统设计与实现》内容节选文末进入小程序可查看系列课程完整内容
战斗系统,程序负责搭建核心框架,而策划负责填充配置,在实际的开发中,策划和程序要一起对每一个技能进行打磨。本次课程,将以行业内最复杂的MMORPG游戏战斗系统为例,介绍战斗系统的基本框架和组成部分,以及在实际运营中,可能会遇到的问题和应对方式。
什么是战斗系统
施法者放出技能击中了目标,伴随发生伤害输出、仇恨结算、位移以及技能表现,这便是游戏中一个最基本的战斗过程。战斗系统的最上层是客户端和服务器的分工,其中客户端负责接收玩家战斗指令,根据服务的驱动进行表现,而服务器则主要负责逻辑驱动。
战斗系统比较特殊,它需要通过策划配置来实现,而不是程序员直接在代码里写死,因为只有策划最了解每一个技能,它要实现成什么效果以及每一帧需要表现出来的细节。 每一个技能都是由不同的技能阶段组合而成的,比如以下技能阶段:Start(技能开始)、Cost(消耗处理)、Reading(吟唱)、Channeling(引导)、OnCast(出手)、Project(弹道飞行中)、OnHit(击中)、Finish(技能结束)。
想要实现技能更好的效果,就要把阶段拆的更细,因为阶段越细,策划能实现的效果就越多。技能分不同的类型,比如瞬发技、吟唱技、引导技等等,不同类型的技能,它的阶段也不一样。
战斗系统中的核心组件
01
Buff
和通常意义上理解的游戏中的buff效果不同,战斗系统中的buff承载了技能这一套阶段对外界的反馈,实际上它是依附于实体数据上的,持续一段时间的可交互对象。这里所说的对象即是数据和逻辑,实体则包括技能的释放者、技能的目标或者技能的协作者。
举一个简单的实现案例:比如玩家给自身上一个魔法盾的buff,在buff持续期间,任何HP伤害都会被转化成MP伤害,其对应的实现方式就是在SkillIn阶段,将所有的HP伤害Effect转化为MP伤害Effect。这里的buff是target身上的一块数据,其中有个skill_in阶段,挂一个函数(从资源文件加载),把伤害type从hp改为mp。
02
Cooperator和目标扫描
技能效果的实现需要Cooperator(协作者)。Cooperator可以当做一些效果的参考点,比如玩家施放一个技能,但是这个技能是从玩家自身以外的另一个对象发出,这时候就需要引入协作者的概念,它是类似于施法者的一个轻量级的实体。这里会引出了另一个问题,就是技能是需要目标扫描的,而目标扫描会跟地图数据产生关联。它需要一些计算,才能扫描出地图上的目标,也因此这一部分消耗会比较大。
03
修饰系统
修饰系统就是静态修饰,比如玩家在游戏中点了一些天赋点,会修改他身上的技能,这个数据量会比buff大很多,是成千上万的量级,实时演算的话会出现性能过载的情况,因为需要通过静态修饰的方式预先生成被修饰过的技能,然后通过一定的索引关系来索引这一块数据。
实际运营时会遇到的问题
01
网络
在大规模项目开发和网络运营环境下,战斗系统可能会出现很多问题,首当其冲的就是网络问题。如果出现网络波动,玩家在施放技能时,可能会有粘滞感;Combo技能,即快节奏的连击技能也将无法顺利施放;还有特殊引导技,本来很流畅的一套流程,很可能会表现得断断续续。 02
性能
如果玩家平均分布在一张大地图上,服务器的压力并不大,但当玩家聚集起来,群体混战时,服务器的压力剧增,甚至可能导致服务器出现毛刺和雪崩。一般来说,服务器会面临四个物理瓶颈:就是CPU、流量、内存、数据库。对于战斗系统而言,并没有数据库的压力,因为战斗的实时效果都不是立即存盘的。因此,程序员需要用一些手段,优化CPU、流量、内存的性能。 03
可维护性
除了每周定时停服维护之外,游戏需要保持24小时运营,所以我们还要考虑可维护性问题,比如容灾。当群体PK性能波动太大时,我们一定要有底线思维,不让服务器发生雪崩。
页:
[1]