导言
一直想要做一个像DOTA那样灵活,可扩展,可配置的战斗框架,可以用在多个类型的游戏中如RTS,ARPG,战棋等等。可是自己水平不够,看了一些现有的框架,感觉又不够符合自己想要的样子。所以记录一下自己的学习和思考,也是梳理自己的思路,来一步步实现。
参考:UNITY-GAS https://github.com/sjai013/unity-gameplay-ability-systemhttps://github.com/sjai013/unity-gameplay-ability-system
(15 封私信 / 19 条消息) 如何设计一个易扩展的游戏技能系统? - 知乎 (zhihu.com)https://www.zhihu.com/question/29545727
基于行为树的MOBA技能系统:总目录 | 登峰造极者,殊途亦同归。 (lfzxb.top)https://www.lfzxb.top/nkgmoba-totaltabs/
战斗流程
在dota2中的战斗流程,大概总结如下
1,检查是否可以施放技能(普通攻击视为一种特殊的技能)(检查MP,是否被沉默,是否被缴械,目标是否是技能目标等)
2,选中目标/区域,角色开始进行施法前摇
3,施法前摇结束,再次检查是否可施放技能,然后施放技能
4,技能根据触发方式(飞行道具碰撞、AOE范围等)来决定受击方
5,根据攻击/受击双方属性、BUFF状态计算技能结果。
从这个流程我们抽象出几个对象
1,战斗实体CombatEntity:战斗中角色的抽象,一个战斗实体应该包含战斗所需要的数据,相应的能力逻辑组件(如移动能力,施放技能能力等,对应状态的眩晕沉默等来实现禁止移动、禁止施法)
2,战斗行为CombatAction:作为系统战斗逻辑的处理,对攻击力、护甲如何换算为伤害的换算公式和处理在这个类中。
3,技能释放器, 施放技能,确认命中,触发实施战斗行为计算
4,
在战斗实体下面,又有几个主要的组件
1,能力Ability,移动的能力,攻击的能力,使用技能的能力,修改属性的能力(比如禁止回血),使用装备的能力等等,有了能力这个抽象层级,我们不需要在entity里塞进很多的方法最后导致类的膨胀和难以维护,也对
2,效果管理器 EffectManager 控制效果的添加、移除、更新等逻辑
3,属性 提供基础属性、BUFF、装备的加减乘除等计算,输出结果
暂时想到这么多,后面开始随写随改。