技能系统简述
技能系统使用组件式开发,由一个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
列表(技能动作)
上图配置是在范围内筛选出一个目标作为技能目标,在范围内可以释放技能,否则朝向目标移动。
SkillBlock
SkillBlockData Data
;List<EffectData> effectDatas
;
SkillBlock
封装技能具体实现配置,一个完整的技能由多个SkillBlock
数据组成,每个SkillBlock
都是一个完整的技能表现。
- 第一部分SkillBlock是技能中的索引配置,当前执行完之后跳转的索引。
- 第二部分是SkillBlock执行的条件,填Condition找对应的Condition配置检测条件通过后执行。
- 第三部分是技能打断条件,分三部分时间和打断行为类型。
- 第四部分是技能的动作配置,动作融合。
- 第五部分是技能效果
Effect
,技能产生的效果,如:造成伤害,位移,击飞,子弹时间,屏幕效果等。
Effect
技能效果,是技能直接作用于游戏逻辑的,如伤害会对目标造成伤害同时对方播受击动画特效等;位移会强制改变目标位置;击飞会对权重低目标产生击飞的效果,子弹时间会改变除目标外其他角色的时间增量;时间减速会改变TimeScale等。
- Id,Name,Type,开始时间,持续时间,释放概率等一些基础功能。
- 控制技能效果生效的SkillConditon。
- 播放音效。
- 播放特效。
- 目标类型范围,用于筛选在范围内可被作为目标的角色。
Effect
作为所有技能效果的基类,所有的技能效果都继承自Effect
。
上图是改变相机镜头缩放的技能效果。
除了Effect的基础功能外,Zoom效果实现了对相机FOV和,GroupFramingSize的改变,同时加入了淡入淡出和曲线的功能,实现了镜头缩放的效果。
SkillEntity实现细节
SkillBasicComponent
SkillBlock playingSkillBlock;
// 当前正在执行的SkillBlock
技能逻辑处理组件,处理SkillBlock逻辑,当SkillEnity创建时就开始Tick增加计算技能的时间轴,当前一个SkillBlock时间完成后跳转到一下个SkillBlock。
ISkillCaster caster;
// 施法者ISkillReceiver receiver;
// 被施法者
技能需要有施法者和被施法者,技能效果所有的逻辑处理都基于施法者和被施法者,ISkillCaster和ISkillReceiver中规范了处理技能相关用到的一些方法,角色属性数据如:(生命值,攻击力,防御力等...),Transform信息,角色系别阵营如:(比如金木研属于青铜树,董香属于古董),战斗阵营信息(有方角色&敌方角色等..)
计时相关
FixedCounter EffectiveTimer;
// 当前的EffectFixedCounter CoolTimer;
// 技能冷却时间
FixedCounter是封装的计时器,设置最大值,在Tick中驱动,用于处理时间相关功能。常用参数有当前值,最大值,百分比值,设置增长值,是否完成计时等。
EffectiveTimer用作当前Effect的计时器
CoolTimer用作于技能冷却时间
Tick
TickEffective()
// 技能效果TickCool()
// 冷却时间TickAccumlateSkill()
// 蓄力技TickOnOffSkill()
// 开关技- 扩展其他类型的技能...
- 普通攻击Tick的deltaTime需要计算攻击速度
- 蓄力技需要处理释放逻辑,具体看技能是怎么实现的,如果说蓄力是由配置来决定跳转的SkillBlock那么只需处理释放就行了,蓄满后多长时间自动释放。设计成SkillBlock跳转,就是每个SkillBlock设置一定时长,蓄力时间达到这个SkillBlock跳转下一个蓄力SkillBlock,如果在当前SkillBlock释放的话直接跳转对应技能效果的SkillBlock。如果是需要记录蓄力时长那么久需要记录当前蓄力时间,设计的时候需要定制每个SkillBlock的蓄力时长,如果达到指定蓄力时长就选择对应SkillBlock。
- 开关技记录一下技能开关状态做不同的逻辑处理
InterruptSkill
打断技能,具体可配SkillBlock在技能的某时间段可被某种行为打断,做一个技能的衔接,一个角色的技能连招是否流畅打断技能配置很关键。
上图配置中TotalTime
当前技能的持续时间,xxTime
表示三段打断时间,xxInterrupt
表示打断技能的行为类型
移动打断,释放大招打断,普通攻击打断,使用技能打断等几种打断方式。
SkillConditionComponent
SkillCondition
SkillCondition
条件基类封装一些条件检测通用的字段方法,如:条件类型,检测区域类型,检测范围半径,目标类型等字段,返回符合条件的目标,是否达成条件等方法,编辑器用的配置需要有读写xml的接口。所有扩展的条件都继承自SkillCondition
。
SkillConditionComponent
主要职责是管理技能配置中所有SkillCondition
,检测条件,对外提供检测结果的接口。传入条件id找到对应条件检测条件并返回结果。
上图为检测角色身上被动技的条件。
使用条件输入ConditionId,同时也实现了通过表达式来同时处理多个条件。
与、或、非(& | !)
Comments 1 条评论
博主 acgloby