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

开发
技能没什么框架,只是有很多字段罢了,比如cd、施法距离、释放动画、飞行动画等等。。。其实游戏技能不是一直不是什么难点,毕竟根据每个属性实现逻辑就好了。

[[142455]]

技能没什么框架,只是有很多字段罢了,比如cd、施法距离、释放动画、飞行动画等等。。。其实游戏技能不是一直不是什么难点,毕竟根据每个属性实现逻辑就好了。

技能真正麻烦一点是其实是 所谓的“效果”。因为从很久以前,游戏设计的时候就把效果这个概念添加进来了。对于 游戏战斗对象主体,我们暂时叫做BattleAgent简称BA。影响BA的数据有很多,比如移动速度、攻击力、基础属性等等,影响的入口也有很多:

  • 技能
  •  buff/被动技能
  • 装备
  • 强化
  • 宝石

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

首先我们先谈区别,对于这些数值影响,其实区别只有入口或者说是作用的方式,技能是BA(castor)对BA(target)释放造成的瞬间数值影响。

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

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

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

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

    对BA产生数值影响

    对BA撤销数值影响

所以效果最终定义为:

 

interface Effect { 
 
    void cast(BattleAgent target); 
 
    default void reverse(){ 
 
    } 
 

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.

 

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

 

interface EffectContainer extends Effect{ 
 
    List getEffects(); 
 

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.

 

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

比如技能:

class abstract  Skill implements EffectContainer{ 
 
    public void spellTo(BattleAgent target){ 
 
        foreach(Effect effect in getEffects()){ 
 
            effect.cast(target); 
 
        } 
 
    } 
 

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.

 

对于buff:

 

class abstract Buff implements EffectContainer{ 
 
    public void update(){ 
 
        foreach(Effect effect in getEffects()){ 
 
           effect.cast(target); 
 
        } 
 
    } 
 

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.

 

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

 

class abstract  BuffSkill extends Buff { 
 
    public void install(){ 
 
        foreach(Effect effect in getEffects()){ 
 
            effect.cast(target); 
 
    } 
 

 
    public void unstall(){ 
 
        foreach(Effect effect in getEffects()){ 
 
            effect.reverse(target); 
 
        } 
 
    } 
 

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.

 

装备同理被动技能,是不是很清晰?而对于复杂的技能效果,因为我们已经抽象出了Effect。

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

 

class DamageEffect implements Effect{ 
 
    private int damage = 100
 
    public void cast(BattleAgent target){ 
 
        target.hp -= damage; 
 
    } 
 

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.

 

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

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

1、外形变羊

 

class ChangSheepEffect implements Effect{ 
 
    public void cast(BattleAgent target){ 
 
        target.gameObject = GameManager.getAnimeObject("sheep"); 
 
    } 
 

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.

 

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

 

class PropChangeEffect implements Effect{ 
 
    public void cast(BattleAgent target){ 
 
        target.atk = 0
 
        target.def = 0
 
        target.speed = 50
 
    } 
 

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.

 

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

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

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

 

class TriggerBuffEffect implements Effect{ 
 
    BuffSkill buff = new BuffSkill (){ 
 
        public List<>getEffects(){ 
 
            return new List().add(new ChangSheepEffect()).add(new PropChangeEffect()); 
 
        } 
 
    } 
 
    public void cast(BattleAgent target){ 
 
        int time = 3000;//3秒 
 
        target.addBuff(buff,time); 
 
    } 
 

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.

 

然后把这个TriggerBuffEffect加到技能能上就ok了,就完成了一个可以变羊3秒的技能。

 
 
 
责任编辑:王雪燕 来源: 游资网
相关推荐

2015-08-18 10:00:53

2024-11-20 13:18:21

2022-03-29 10:57:39

运维服务架构

2018-09-18 09:38:11

RPC远程调用网络通信

2024-04-24 10:38:22

2020-09-02 07:22:17

JavaScript插件框架

2023-09-08 08:10:48

2023-09-08 08:22:30

2024-08-27 12:49:20

2016-01-06 09:57:23

编写PHP扩展

2013-08-14 10:48:23

实时计算流计算

2022-12-28 14:07:52

Gamerzilla开源游戏

2025-01-22 08:00:00

架构秒杀系统Java

2016-09-30 10:13:07

分布式爬虫系统

2022-07-18 08:02:16

秒杀系统后端

2020-02-14 08:05:05

数据网格高扩展易维护

2013-07-01 11:01:22

API设计API

2024-06-17 11:59:39

2019-08-01 08:36:51

缓存系统并发

2024-06-21 08:15:25

点赞
收藏

51CTO技术栈公众号