技能系统-主动技能

技能系统简述

技能系统使用组件式开发,由一个SKillEntity管理所有的Component,Compoent负责实现模块的具体功能,技能分为主动技能和被动技能。

主动技能(SkillEntity)

主动技能有根据释放类型不同分为普通技能、开关技能、蓄力技能、循环技能等…,根据外部系统分为普通攻击、普通技能和大招等…有些特殊的系统会加入其他类型的技能比如QTE之类的。

SkillEntity

  • 释放条件 SkillConditionComponent
  • 技能释放 SkillBasicComponent
  • 技能配置 SkillData

SkillData

技能配置数据由三个部分和一个参数组成

  • ConfData(Excel配置,主要是一些外部系统配置如:技能描述、图标、名字等…,以及一些数值相关的配置如:技能伤害计算相关联属性)
  • EditorData(技能编辑器配置,包含技能目标选择条件、技能范围、释放条件在什么条件下释放什么效果,在什么时间释放什么技能效果播什么动作和音效,技能效果(伤害,位移,发射子物体,子弹时间、时间减速等…))
  • SkillBlock列表(一个技能分为多个SkillBlock,相当于释放技能时根据条件的不同选择释放不同的SkillBlock,释放的Effect是由SkillBlock来管理释放的。如:目标身上有id为2333的buff时释放瞬移到目标位置,没有时释放一个向前的范围伤害,这两个不同的需求算作一个Skill,两个SkillBlock,每个SkillBlock下的Effect不同)
  • EffectData列表 (技能包含的所有Effect)
  • SkillAction列表(技能动作)

img

上图配置是在范围内筛选出一个目标作为技能目标,在范围内可以释放技能,否则朝向目标移动。

SkillBlock

  • **SkillBlockData** Data
  • **List<EffectData>** effectDatas;

img

SkillBlock封装技能具体实现配置,一个完整的技能由多个SkillBlock数据组成,每个SkillBlock都是一个完整的技能表现。

  • 第一部分SkillBlock是技能中的索引配置,当前执行完之后跳转的索引。
  • 第二部分是SkillBlock执行的条件,填Condition找对应的Condition配置检测条件通过后执行。
  • 第三部分是技能打断条件,分三部分时间和打断行为类型。
  • 第四部分是技能的动作配置,动作融合。
  • 第五部分是技能效果Effect,技能产生的效果,如:造成伤害,位移,击飞,子弹时间,屏幕效果等。

Effect

技能效果,是技能直接作用于游戏逻辑的,如伤害会对目标造成伤害同时对方播受击动画特效等;位移会强制改变目标位置;击飞会对权重低目标产生击飞的效果,子弹时间会改变除目标外其他角色的时间增量;时间减速会改变TimeScale等。

  • Id,Name,Type,开始时间,持续时间,释放概率等一些基础功能。
  • 控制技能效果生效的SkillConditon。
  • 播放音效。
  • 播放特效。
  • 目标类型范围,用于筛选在范围内可被作为目标的角色。

Effect作为所有技能效果的基类,所有的技能效果都继承自Effect

img

上图是改变相机镜头缩放的技能效果。

除了Effect的基础功能外,Zoom效果实现了对相机FOV和,GroupFramingSize的改变,同时加入了淡入淡出和曲线的功能,实现了镜头缩放的效果。

SkillEntity实现细节

SkillBasicComponent

  • **SkillBlock** playingSkillBlock;// 当前正在执行的SkillBlock

技能逻辑处理组件,处理SkillBlock逻辑,当SkillEnity创建时就开始Tick增加计算技能的时间轴,当前一个SkillBlock时间完成后跳转到一下个SkillBlock。

  • **ISkillCaster** caster; // 施法者
  • **ISkillReceiver** receiver; // 被施法者

技能需要有施法者和被施法者,技能效果所有的逻辑处理都基于施法者和被施法者,ISkillCaster和ISkillReceiver中规范了处理技能相关用到的一些方法,角色属性数据如:(生命值,攻击力,防御力等…),Transform信息,角色系别阵营如:(比如金木研属于青铜树,董香属于古董),战斗阵营信息(有方角色&敌方角色等..)

计时相关

  • **FixedCounter** EffectiveTimer;// 当前的Effect
  • **FixedCounter** CoolTimer;// 技能冷却时间

FixedCounter是封装的计时器,设置最大值,在Tick中驱动,用于处理时间相关功能。常用参数有当前值,最大值,百分比值,设置增长值,是否完成计时等。

EffectiveTimer用作当前Effect的计时器

CoolTimer用作于技能冷却时间

Tick

  • TickEffective() // 技能效果
  • TickCool()// 冷却时间
  • TickAccumlateSkill()// 蓄力技
  • TickOnOffSkill()// 开关技
  • 扩展其他类型的技能…

  • 普通攻击Tick的deltaTime需要计算攻击速度

  • 蓄力技需要处理释放逻辑,具体看技能是怎么实现的,如果说蓄力是由配置来决定跳转的SkillBlock那么只需处理释放就行了,蓄满后多长时间自动释放。设计成SkillBlock跳转,就是每个SkillBlock设置一定时长,蓄力时间达到这个SkillBlock跳转下一个蓄力SkillBlock,如果在当前SkillBlock释放的话直接跳转对应技能效果的SkillBlock。如果是需要记录蓄力时长那么久需要记录当前蓄力时间,设计的时候需要定制每个SkillBlock的蓄力时长,如果达到指定蓄力时长就选择对应SkillBlock。
  • 开关技记录一下技能开关状态做不同的逻辑处理

InterruptSkill

打断技能,具体可配SkillBlock在技能的某时间段可被某种行为打断,做一个技能的衔接,一个角色的技能是否流程打断技能配置很关键。

img

上图配置中TotalTime当前技能的持续时间,xxTime表示三段打断时间,xxInterrupt 表示打断技能的行为类型

移动打断,释放大招打断,普通攻击打断,使用技能打断等几种打断方式。

SkillConditionComponent

SkillCondition

SkillCondition条件基类封装一些条件检测通用的字段方法,如:条件类型,检测区域类型,检测范围半径,目标类型等字段,返回符合条件的目标,是否达成条件等方法,编辑器用的配置需要有读写xml的接口。所有扩展的条件都继承自SkillCondition

SkillConditionComponent主要职责是管理技能配置中所有SkillCondition,检测条件,对外提供检测结果的接口。传入条件id找到对应条件检测条件并返回结果。

img

上图为检测角色身上被动技的条件。

img

使用条件输入ConditionId,同时也实现了通过表达式来同时处理多个条件。

与、或、非(& | !)

[转载自][https://www.acgloby.com/技能系统程序设计思路-主动技能/]