如何设计一个易扩展的游戏技能系统?


技能没什么框架,只是有很多字段罢了。

比如 cd 施法距离 释放动画 飞行动画 等等。。。

其实游戏技能不是一直不是什么难点,毕竟根据每个属性实现逻辑就好了。

技能真正麻烦一点是其实是 所谓的“效果”。

因为从很久以前,游戏设计的时候就把效果这个概念添加进来了。

对于 游戏战斗对象主体,我们暂时叫做BattleAgent简称BA。

影响BA的数据有很多,比如移动速度 攻击力 基础属性 等等,影响的入口也有很多:

技能

buff/被动技能

装备

强化

宝石



等等,而这些实际上从影响结果没什么区别。

首先我们先谈区别,对于这些数值影响,其实区别只有入口或者说是作用的方式,

技能是BA(castor)对BA(target)释放造成的瞬间数值影响。

buff是castor对BA(target)安装后造成的持续数值影响,分为按时触发瞬发和持续修改数值。

装备是特定容器对BA持续修改数值。

所以这里游戏开发者们抽象出了 效果这个概念。

对与效果而言,只存在2个行为:

1 对BA产生数值影响

2 对BA撤销数值影响

所以效果最终定义为:
 

  1. interface Effect {
  2.    void cast(BattleAgent target);
  3.    default void reverse(){
  4.    }
  5. }

复制代码


而对于其他功能实体来说,就可以简化为效果的容器:
 

  1. interface EffectContainer extends Effect{
  2.   List<Effect> getEffects();
  3. }

复制代码


这样我们就只要定义不同效果容器就可以了,

比如技能:
 

  1. class abstract  Skill implements EffectContainer{
  2.     public void spellTo(BattleAgent target){
  3.       foreach(Effect effect in getEffects()){
  4.          effect.cast(target);
  5.       }   
  6.    }
  7. }

复制代码


对于buff:
 

  1. class abstract Buff implements EffectContainer{
  2.     public void update(){
  3.        foreach(Effect effect in getEffects()){
  4.          effect.cast(target);
  5.       }   
  6.     }
  7. }

复制代码


对于被动技能(其实也是buff):
 

  1. class abstract  BuffSkill extends Buff {
  2.     public void install(){
  3.        foreach(Effect effect in getEffects()){
  4.          effect.cast(target);
  5.       }   
  6.     }
  7.     public void unstall(){
  8.        foreach(Effect effect in getEffects()){
  9.          effect.reverse(target);
  10.       }   
  11.     }
  12. }

复制代码


装备同理被动技能,

是不是很清晰?

而对于复杂的技能效果,因为我们已经抽象出了Effect。

所以怎么实现也就很容易了!
 

  1. class DamageEffect implements Effect{
  2.    private int damage = 100;
  3.    public void cast(BattleAgent target){
  4.      target.hp -= damage;
  5.     }
  6. }

复制代码


看起来是不是很简单,我们来写个变羊。

这个技能包括 2 个效果 外形修改和属性。

1 外形变羊
 

  1. class ChangSheepEffect implements Effect{
  2.    
  3.    public void cast(BattleAgent target){
  4.      target.gameObject = GameManager.getAnimeObject("sheep");
  5.     }
  6. }

复制代码


2 攻击力和防御力变0 速度变慢
 

  1. class PropChangeEffect implements Effect{
  2.    
  3.    public void cast(BattleAgent target){
  4.      target.atk = 0;
  5.      target.def = 0;
  6.      target.speed = 50;
  7.     }
  8. }

复制代码


就是这么简单,同学你明白了吗?

如果要深入一点的话,就是二手买号平台变羊是持续型的,到了时间会变回来。

所以我们要一个可以触发buff的效果:

  1. class TriggerBuffEffect implements Effect{
  2.   BuffSkill buff = new BuffSkill (){
  3.     public List<>getEffects(){
  4.     return new List().add(new ChangSheepEffect()).add(new PropChangeEffect());
  5. }
  6. }
  7.    public void cast(BattleAgent target){
  8.      int time = 3000;//3秒
  9.      target.addBuff(buff,time);
  10.     }
  11. }

复制代码

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值