立即注册找回密码

QQ登录

只需一步,快速开始

微信登录

微信扫一扫,快速登录

手机动态码快速登录

手机号快速注册登录

搜索

图文播报

查看: 231|回复: 0

[讨论] 技能释放流程

[复制链接]
发表于 2025-5-30 18:47 | 显示全部楼层 |阅读模式

登陆有奖并可浏览互动!

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录 手机动态码快速登录

×
前言

    今天想讲一讲技能释放的流程,我从15年开始接触战斗以来,经历了很多公司和项目的战斗系统,各有千秋同时也有好有坏。可能战斗系统对大部分游戏程序员并不陌生,大体的感受都是没做战斗之前兴奋,做了半年之后觉得乏味,因为战斗系统的上限确实不高,那为什么今天要讲这个呢,一是很多没那么成熟的公司面对战斗还是有些迷茫,不确定自己做的是不是最优方案;二是多年来我只是想当然的传承了端游时代前辈的思路,只觉得用起来顺手、开发效率高、扩展性强,但没真正归纳过底层的规律。所以我想从最基础的本质来挖一挖技能的内在逻辑。
进化过程

    下面我们从技能最底层的规律讲起,就像三体中提出“生存是文明的第一需要”的公理一样,层层递进,演进出一个技能的完整释放流程
    第一需要:

        技能的最终目的是:打谁怎么打
        打谁:我要打击的目标是谁,单个敌人、单个队友、圆形范围内敌人,圆形范围内队友、扇形范围内敌人、我的召唤物、我当前锁定的目标……学名叫选敌(SelectTarget)
        怎么打:这里的“打“其实是泛指对目标造成的效果,比如伤害、buff、击退、冲锋、子弹(子弹碰撞监听暂时不考虑)、召唤物……学名叫技能效果(SkillEffect)
        把打谁和怎么打任意组合,就产生了技能最基础的单位Hit,举几个例子:

  • 造成单体伤害:单个敌人(打谁)、伤害(怎么打)
  • 圆形范围内对敌人伤害:圆形范围内敌人、伤害(怎么打)
  • 追踪弹:单个敌人(打谁)、发射子弹(怎么打)
  • ……
        当然并不是所有的选敌、技能效果的组合都是合理的,例如

  • 圆形范围内敌人+子弹:出来的效果就是对范围内的所有N个敌人都发射子弹,那一共发射了N个子弹,除非策划这样设计,否则有些夸张了
  • 圆形范围内敌人+冲锋:这种组合就是不对的,需要在代码中限制,你可以选择一个敌人 对他冲锋,也可以选择一个位置  朝着位置点的方向冲锋。“向圆形范围内的一群选出来的N个敌人进行冲锋”从语文的角度上讲也是说不通的。
        强调:不管你使用多么华丽的动作和特效,你最终的目的都是选择N个目标、对目标造成技能效果
演进:怎么选敌

       刚才说选敌包括单个敌人、单个队友、圆形范围内敌人,圆形范围内队友、扇形范围内敌人、我的召唤物……,先修正一下,以“单个敌人”为例,修正为单个目标,因为敌人=目标(人)+关系(敌),所以说选敌实际分为两步:选目标和根据关系过滤目标,策划在大多数情况下肯定不希望技能是能伤害队友的,那么:

  • 选目标:就是我把能命中的范围内或指向单体的目标找出来
  • 过滤目标:根据我和目标的关系进行过滤,比如阵营、势力、组队、好友关系、战斗模式(pk模式、杀戮模式、和平模式)、是否红名、技能是有利技能还是有害技能……此外还和场景玩法相关,例如大世界中同帮派不能攻击、战场中地方队的同帮派基友可以攻击。。。
过滤目标可能会比较复杂,具体按策划需求实现,在后面的叙述中用选敌代表选目标+过滤目标,选敌比较顺口,在业界流行度较高
通常在选敌之后我们还需要对选敌的人数限制上限,在某种极端情况下,范围技能命中了数以万计(夸张的修辞手法)的敌人,为减少性能压力,同上会限制命中上限
演进:一次选敌多个技能效果

      我们认为选敌的成本是比较大的,对于选自己、选队友(有组队模块)、选宠物(有召唤物模块)……,选敌的时间复杂度为O(1),但对于范围选敌,我们要从AOI中遍历筛选出范围内的敌人,再进行时间判断时间复杂度为O(N),对于每个目标还要进行复杂过滤判断。
      大部分时候,当我们选出来N个敌人之后,要对这N个敌人进行多次技能效果,比如对圆形范围内敌人造成伤害并施加减速buff,圆形范围内敌人执行一次就好。
演进:时间轴

我们把选敌和技能效果的组合叫做Hit,但是似乎缺少了点什么——时间轴。除了瞬发技能没有时间轴之外,其他技能都有时间轴,通过时间轴来触发一连串的hit,那么就变成了在什么时间、打谁、怎么打,学名打击点(HitPoint)
时间轴的实现方案有很多,比如后端的话定时任务、tick检查时间,前端的话可以用动画时间轴,如果是同构框架那就更好了,前后端都可以用动画时间轴,通常动画时间轴不只是时间流逝的顺序,还可能在某个时间范围内循环,扩展了技能的丰富度。
      那么一个时间轴就代表了在该时间轴范围内不同时间点的多个打击点
以前我们用前摇、引导、蓄力、激发、后摇描述技能的释放流程,本质是给时间轴划分了几个固定的阶段,但不是全部技能都有引导、蓄力,而且引导和蓄力可以用打击点实现。从概念上要牢记前摇、引导、蓄力、激发、后摇,因为阶段对技能的指定是具有意义的,但在代码实现上模糊掉阶段的概念
演进:看似一个简单的技能完成了

有了以上的进化,那么一个简单的技能就诞生了,执行一个时间轴就执行了一个技能,再加上点包装,比如技能执行前的检查:检查蓝量、检查技能施法距离判断……技能执行中:在时间轴上的某个合适的时间点扣蓝。
演进:一个简单的技能终于完成了

缺少参考点
      如果仔细思考的话技能从始至终都有一个非常大漏洞,这个问题发生在选敌的时候,比如:

  • 选择圆形范围内目标:这个圆应该由center点和radius构成,那么这个center是在哪个位置呢,是以我为圆心还是以我锁定的敌人为圆心亦或是以我面前N米处为圆心。此时我们需要一个参考点,这个案例中参考点就是我、或锁定的敌人或我面前N米处的位置
这样的话在选敌之前首先要有个参考点,参考点可以是人也可以是点,所以选择参考点可分为两种:选人、选点
就像选敌和技能效果不能任意组合一样,选参考点和选敌也不能任意组合,要符合常理,举个反例:

  • 追踪子弹:追踪子弹跟踪一个目标敌人,随着敌人的移动 子弹跟随移动,但如果选参考点时配置的选点,那么子弹会因为在执行跟踪逻辑时需求敌人id,但无法获得id而中断逻辑。
所以选敌前要选择参考点,参考点的种类有:选我、选正在锁定的目标、选扇形范围内最近的敌人、选我前方N米处的位置……具体按策划需求,根据技能的特点选择不同的参考点,否则会出现“我明明想攻击眼前的敌人,但技能系统非要让我攻击我正在锁定的远处的敌人“
前端选参考点还是后端选参考点
为了让玩家有更好的体验感,对于玩家而言以玩家看到的为准,所以由前端选择参考点,而且有些时候选敌时以镜头的方向为准,而后端只是做参考点的距离验证,在3D游戏中(非射击游戏)服务器对玩家方向不敏感,玩家的方向往往对收益也没有影响,所以后端只做距离验证即可;对于AI控制的怪物、NPC而言由后端选参考点,不只是选参考点,而是所有的逻辑都由后端AI控制
什么时候选参考点
选参考点貌似放在选敌之前就可以,但具体什么时候呢?
      先假设放到技能开始之后、每次选敌之前,这会造成技能已经释放了,但后端发现参考点距离不合法或选择的目标已经死亡,增加了技能释放检查的不通过率;还有更严重的情况,前端发送释放技能协议,然后再HitPoint之前发送选参考点,用这种方式的话,考虑到网络情况,如果选参考点的协议延迟了,那么后端要么按时间轴继续执行  忽略掉过期的选参考点协议,要么等待前端选参考点协议  从而阻塞技能  变向拉长了技能的释放时间,别的玩家就无法预测卡顿玩家的技能真正造成伤害的时间。
      那么就得出了一个规律,在技能释放期间,前端不要有影响后端技能逻辑的协议,因为协议的到达时间不确定。(但是警告)
      但是,某些特殊技能如蓄力技能、瞄准技能、重新选目标技能(砍一个敌人,摇杆操作选朝着另一个方向砍)……这就不得不需要技能在执行中产生前端向后端的交互了,服务器最好保底,防止玩家技能中掉线导致表现上卡在技能释放中的动作
      那么最终的结论是:选参考点放在技能执行之前,不但可以作为技能能否释放的检查,还可以减少服务器验证不通过而回退预表现的机率,还能防止在网络不好的情况下导致的阻塞服务器技能问题。
演进:一个简单技能释放流程

      先总结一下整个技能释放的层次结构

  • 技能层:判断cd、技能消耗、选参考点、释放技能、执行时间轴
  • 时间轴层:在时间点上触发HitPoint
  • 打击层:选敌、过滤敌人、对敌人造成技能效果
名字都是瞎起的,重要的是每一层到下一层是包含关系,时间轴和打击点作为执行单元,流程图如下


程序上只要重载选目标、选敌、技能效果,策划配置技能即可完成大部分技能种类
演进:复杂技能

      当面对复杂技能时候刚才的流程就显得单薄了,如蓄力、在地面执行正常技能 在空中执行空中技能、短按放一个技能长按放另一个技能……经过归纳可以发现,本质都是在什么条件下执行什么时间轴(前端是动画),例如蓄力1秒执行某个时间轴、蓄力2秒执行另一个时间轴,在地面播放地面攻击的时间轴、在空中播放空中攻击的时间轴。
      甚至还可能执行完一个时间轴还要再经过条件判断执行另一个时间轴……
条件判断、切换时间轴、条件判断、切换时间轴……,这刚好符合状态机的形态,根据condition,transition到某个state那么技能的流程如下


总结

      自此,在开发一个新技能的时候,程序只需要面向选目标、选敌、技能效果、配置状态机(condition、Action)其中的某个环节进行开发,再由策划配置组装为一个最终的技能。
在此不能一一穷尽所有技能种类了,具体实现中难免遇到打破规则的技能,大部分也只需要在原有流程基础的某个环节前后加一些特殊逻辑。
      如果每个环节抽象好的话,可以实现技能的动态组合玩法,技能+宝石1+宝石2,宝石修改技能的效果,通过制定合理的组合规则实现N*N*N种技能,例如增加冲锋距离、冲锋段数增多、冲锋后加一个砸地眩晕效果、燃烧buff燃烧N次后加一个眩晕buff、一个子弹变为三个子弹、增加子弹宽度、变换攻击属性……
      打击点是对某个目标效果效果的最小单元,不但可以用于技能系统,还可以用于物品系统(例如使用物品加buff)、吃鸡玩法扣血……等等想给目标施加效果的系统中。

原文地址:https://zhuanlan.zhihu.com/p/5933153600
楼主热帖
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册 微信登录 手机动态码快速登录

本版积分规则

关闭

官方推荐 上一条 /3 下一条

快速回复 返回列表 客服中心 搜索 官方QQ群 洽谈合作
快速回复返回顶部 返回列表