Unity技能系统框架(二)技能抽象模块细化

    看了上一篇的技能效果Demo,接下来大概说下该技能系统可实现的一些技能事件和效果。技能一般包含这几个要素:

    数据(配置表和资源)、技能属性(消耗能量、冷却时间等)、事件操作(这是一个大的范畴,后面分析)、目标(施法者、目标、攻击方、弹道、目标点)、施加的状态Modifier(这也是一个比较大的范畴,后面分析)。

    关于技能数值方面,采用了与知乎博客一样的方式,即Excel中配置数值数据,编辑器里配置逻辑数据。当然如果策划比较流弊,完全可以在Excel中配置抽象逻辑,程序只需根据逻辑用code实现即可。我目前感觉自己写逻辑编辑器来配置技能会更高效,也可能是因为策划对于技能的理解比较浅吧,提供技能描述和数值方面比较在行,而关于配置抽象逻辑方面还没深入过。以下是给策划定义额技能表截图:

Unity技能系统框架(二)技能抽象模块细化_第1张图片

    下面具体介绍下技能逻辑模块部分,我把技能模块大致划分了一下,思维导图如下:

Unity技能系统框架(二)技能抽象模块细化_第2张图片

    首先Skill技能模块就是我们所理解的技能,我把技能细分为三部分:技能属性、技能事件列表、Modifier修改器列表。

    技能属性不做解释,这里说一下技能事件列表,这里面包含了多个事件,并且在一定的触发条件时触发,这里的技能事件是指该技能直接相关的事件。好吧,什么叫“直接相关”……我举个例子,当我们玩MOBA游戏时,通过点击某个技能图标来释放某个技能,这个点击释放的操作就是“直接相关”的,即该技能直接产生的效果,再比如技能释放后投掷一个弹道特效,这个投掷弹道的事件也是直接相关的;有“直接相关”就有“间接相关”,例如某个技能释放后给目标添加一个Debuf效果,如果目标释放技能,则造成伤害,这个造成伤害的事件是通过判断目标是否释放技能来触发,而与技能本身没有关系,那么就是“间接相关”的。上图的事件触发条件,为直接相关事件的触发条件,而间接相关的事件主要在Modifier修改器中。

    第一版大多数是移植的DOTA2技能事件类型,具体的事件操作种类如下:

Unity技能系统框架(二)技能抽象模块细化_第3张图片

  关于技能目标,主要是在一些具体事件操作中用到,包含单个目标和范围目标:

Unity技能系统框架(二)技能抽象模块细化_第4张图片

   虽然通俗的说法是某个技能的目标,模块细化后,其实是技能相关的具体事件所针对的目标。上面的具体事件操作列表中,可能除了范围攻击、延迟操作、随机几率、弹道数据携带效果器 不需要指定目标外,其他的技能事件都需要指定目标。下面是一个随机几率事件和造成伤害事件逻的辑配置截图:

然后重点解释下Modifier:

Unity技能系统框架(二)技能抽象模块细化_第5张图片

   下面重点解释下Modifier修改器为何物(简称Modifier)。Modifier为施加到目标身上的某些状态,一个最好的例子是LOL的红蓝Buff,我再举两个例子,例如技能释放给目标后,目标产生一个护盾,并且5秒内受到的伤害减低50%,这个护盾就是Modifier产生的效果;再比如一个被动技能是英雄有30%的概率造成2倍伤害,其实这个被动技能也是给英雄施加了一个Modifier,效果即当英雄攻击到目标时,伤害值*2。上图是我大体整理的Modifier概念图,大体分析一下:

一、Modifier基本属性:

1、属性类型:

当一个Modifier施加当目标身上时,如果忽视无敌,那么无敌状态也可以施加到目标身上,否则无法施加;如果可刷新,则把存在相同的Modifier持续时间刷新;如果可叠加,那么目标身上会有多个相同的Modifier并且同时生效;

2、持续时间:

Modifier在目标身上的持续时间,达到时间后自动移除,我这里设置如果持续时间是0,则直接产生效果并移除,如果是-1,则是永久的存在的,除非目标死亡(例如被动技能效果)

3、特效附着点类型和特效实体id:

一个Modifier施加到目标身上后,可能会有一些特效,并且附着在英雄不同的不为,例如急速的Modifier会在脚后部加一个特效,持续燃烧的Modifier会在身上加一个火焰的效果。

4、Buff和Debuff:

只是区分该Modifier的类型,也可能两者都不是。例如某个技能会移除目标身上的增益效果,就是根据这个类型来判断的。

5、是否隐藏:

我理解的是该Modifier是否在界面状态栏显示Modifier图标,如下图:

6、是否被驱散:

即能够被其他技能的驱散效果移除,可以和Buff/Debuff连用。

7、覆盖模型动作:

当特定的Modifier在英雄身上时,就会强制该英雄模型播放某个动作,例如眩晕的Modifier,会在眩晕持续时间内播放眩晕动作。

8、是否被动和图标名称:不做解释了

9、Think间隔:

例如一个技能释放一个Modifier到目标身上时,该目标每隔3秒受到一次伤害,这里的3s就是Think间隔,即每3秒会让该Modifier产生一次效果。

二、状态列表:

即该Modifier对目标施加的状态,状态用enum枚举表示,并且设置了Flag标签,使得目标的状态可能是多个状态的并集。当该Modifier从角色身上移除时,会相应的把状态也移除。状态列表包含如下状态:

Unity技能系统框架(二)技能抽象模块细化_第6张图片

这里说明一下,可能多个Modifier会修改相同的状态,一般情况,这种修改相同状态的技能都做成同一个可刷新的Modifier。

三、修改的属性和数值:

这个和状态都是Modifier能直接产生的效果,不过这里修改的是角色的某个属性的数值,例如修改攻击力、修改血量、修改移动速度、修改物理防御和魔法防御等,当Modifier移除时,会把修改的数值恢复。英雄的属性类型非常多,这里截取一部分展示:

Unity技能系统框架(二)技能抽象模块细化_第7张图片

四、Modifier事件列表:

    Modifier的事件与技能的事件,具体的操作种类是一样的,只是触发条件不一样。技能的事件触发条件已说过,是与技能“直接相关”的,而Modifier的触发条件范围比较大:

Unity技能系统框架(二)技能抽象模块细化_第8张图片

    接下来大体说下具体的技能事件,技能事件触发条件和Modifier事件触发条件都是用enum枚举表示的,逻辑配置中我用Dictionary<条件枚举,List<具体事件操作>>保存的,不过在ProtoBuf进行序列化数据时,分别将Dictionary的key和value转换成两个List存储,反序列时又转换成Dictionary。当一个英雄在某些条件下触发事件时,通过触发条件枚举获取对应的事件列表,然后执行所有具体事件操作即可。

 

你可能感兴趣的:(Unity3D,C#)