首页 > 代码库 > 游戏中的技能数据结构

游戏中的技能数据结构

问题:游戏中上百个技能是如何储存的,如果调用的,不会是一起加载,if判断一个一个的吧?

回答:

蓝色的字体是我们游戏中的做法

主流的做法是通过 Add Buff 和DeBuff 来实现的,下面简单Buff的释放方式

最简单的Buff需要有如下通用属性:

1、生效时间->在添加到对象上后,作用的时间长度,一般有立即作用,延迟一段时间生效等等

2、作用时间->指该Buff在对象身上作用的时间,生效后立即完全,如普通攻击,还有持续作用的,如中毒后持续扣血,眩晕等等

3、作用对象->某些技能制定的对象的类型,如火球可能对熔岩巨人无效,就会在该中体现(注:我们的技能比较简单,Actor中有一列SkillId对应Skill表中的Id,未有此种特殊情况)

4、作用方式->Buff会修改对象的哪些属性,如果增加火系列武器攻击力,中毒Buff可能会直接扣一定量的HP,以上几种是常见的Buff属性,Debuff也类似,之前可能通过策划填表实现,现在很多团队使用 LUA 脚本来实现(注:关于如何AddBuff,我们有一张Buff表,这张表里由策划填写,比如:策划想添加一个Buff:刀系列的武器 ATK 上升 20% ,那么他只需要填写这两列:MethodName:WeapontATKUp Args:WeaponType|UpValue[方法名 参数1|参数2],然后程序解析Tab表,通过C#的反射执行 MethodName 方法,并传入相关的参数,这样这个Buff就实现了。考虑后面的运营需求,现阶段我们也正在加入 LUA 来调用C# 的方法,达到动态更新脚本的目的)

除了 buff 之外,技能还有一些其他的要素

比如 瞬发技能,持续施法技能,每个技能还有前摇等要素需要考虑,这些通常放在每个具体的技能逻辑内实现

再有就是AOE技能,可能需要在制定的范围内查找攻击对象,这部分逻辑也会放在技能内实现,如果想了解更详细的,可以参考 Mongos的相关逻辑,国内厂商的相关逻辑或多或少和Mongos有相似或雷同。

回答二:

技能是个对象,上面有些基本属性,技能只提供最基本到主流程,如引导时间,命中时间,命中次数。当技能发动时只在各个流程命中时抛出消息,各个消息节点上可以让策划插入各种事件,比如当技能读条开始时给自己加个 魔免buff,命中敌人时给自己加血,同时召唤出两个幻影。程序只需要生产,加血,分身,甚至改变天气之类的技能事件,策划通过技能编辑器组装出理论上无数种技能。(注:我们的项目现在还没做技能编辑器,现在阶段是有三张表:Skill,Buff,Bullet,具体为Skill可以AddBuff,也可以发出 Bullet,Bullet遇到Actor 引爆 再AddBuff;关于事件,Skill表有:发招前事件(包括预备动画,预备特效),发招中事件(发招中动画) 发招后事件(进入CD))

回答三:

技能是通过一系列的触发条件组合起来的一个事件集合。不仅仅是BUFF这么简单,灵活点的做法是把技能描述层,技能本身属性层和效果层分开来处理。因为有时候一些道具也会产生相应的效果,这个时候单独做表就很混乱了。
然后通过ID来填写这ID对应的描述,属性和效果,研发照着ID按图索骥实现具体效果就可以了。