游戏开发论坛

 找回密码
 立即注册
搜索
查看: 20075|回复: 4

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

[复制链接]

1万

主题

1万

帖子

3万

积分

论坛元老

Rank: 8Rank: 8

积分
36572
发表于 2015-7-23 14:03:35 | 显示全部楼层 |阅读模式
本帖最后由 小篱 于 2015-7-23 14:06 编辑

189549.jpg

  GameRes游资网授权发布 文 / 扼杀黑暗

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

  比如 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. }
复制代码

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

0

主题

10

帖子

36

积分

注册会员

Rank: 2

积分
36
发表于 2015-7-30 15:20:55 | 显示全部楼层
感谢高手指点,苦逼数值策划不能完全理解代码哇

31

主题

257

帖子

1752

积分

金牌会员

申城谍影

Rank: 6Rank: 6

积分
1752
QQ
发表于 2015-7-31 10:24:09 | 显示全部楼层
简单的说,就是把所有的effect都保存到一个list里,

用的时候遍历。。。

0

主题

2

帖子

8

积分

新手上路

Rank: 1

积分
8
发表于 2015-8-7 10:53:40 | 显示全部楼层
简单来说,就是把技能、状态、装备效果的共性提取出来,他们都对目标造成影响,所以,把这项抽象出来,作为Effect,把目标对象作为传入参数,在这个Effect的线程中,我们就可以实现对目标状态的修改了

1

主题

51

帖子

72

积分

注册会员

Rank: 2

积分
72
发表于 2015-8-7 15:05:30 | 显示全部楼层
实际做起来,比这个复杂太多了。比如变羊,还能再次被羊吗?能被其他改变外观的Buffer改变吗?现有的恢复变羊的Buffer该怎么处理?变狗10秒后3秒,在被变羊5秒(或10秒),这恢复外观代码怎么写?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-6-17 11:47

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表