http://blog.csdn.net/langresser_king/article/details/46776701

前两周写完了新游戏的技能系统。虽然也算灵活,但是跟Dota2的技能系统设计比起来,就差了很多。无论从灵活性还是功能实现上,其技能系统设计的都相当漂亮。如果早一些分析它的技能系统的话,我想我可以实现的更快更好。

与之类比还有一些游戏,其技能系统设计的也很漂亮,比如魔兽争霸3  火炬之光2   星际争霸2,它们都很灵活,从其众多的MOD就可以看出来,甚至MOD的作者可以做出游戏开发者想象不到的华丽效果。它们也有对应的编辑器可以进行分析和研究。

Dota2的技能系统是数据和脚本来驱动的。配置文件是v社自己定义的格式,我们可以用json来替代。脚本是lua,这个其实要比暴雪自己创作一个新的脚本语言要简单和清晰的多。

[javascript] view
plain
 copy

  1. "bounty_hunter_wind_walk_2"
  2. {
  3. "BaseClass"                     "ability_datadriven"
  4. "AbilityBehavior"               "DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_IMMEDIATE | DOTA_ABILITY_BEHAVIOR_IGNORE_CHANNEL"
  5. "AbilityUnitDamageType"         "DAMAGE_TYPE_PHYSICAL"
  6. "AbilityTextureName"            "bounty_hunter_wind_walk"
  7. // Time
  8. //-------------------------------------------------------------------------------------------------------------
  9. "AbilityCooldown"               "15.0 15.0 15.0 15.0"
  10. "AbilityCastPoint"              "0.0 0.0 0.0 0.0"
  11. // Cost
  12. //-------------------------------------------------------------------------------------------------------------
  13. "AbilityManaCost"               "50 50 50 50"
  14. "OnSpellStart"
  15. {
  16. "AttachEffect"  //创建特效
  17. {
  18. "EffectName"        "particles\units\heroes\hero_bounty_hunter\bounty_hunter_windwalk.vpcf"
  19. "EffectAttachType"  "follow_origin"
  20. "Target"            "CASTER"
  21. }
  22. "FireSound"  //播放声音
  23. {
  24. "EffectName"        "Hero_BountyHunter.WindWalk"
  25. "Target"            "CASTER"
  26. }
  27. "ApplyModifier"  //添加去除隐身的触发modifier
  28. {
  29. "Target"            "CASTER"
  30. "ModifierName"      "modifier_bounty_hunter_wind_walk_2"
  31. }
  32. "RunScript"  //在脚本里面启动隐身
  33. {
  34. "ScriptFile"    "scripts/vscripts/ability.lua"
  35. "Target"        "CASTER"
  36. "Function"      "bounty_hunter_wind_walk_2"
  37. }
  38. }
  39. "Modifiers"
  40. {
  41. "modifier_bounty_hunter_wind_walk_2"
  42. {
  43. "Duration"      "%duration"
  44. "IsHidden"      "1"
  45. "OnAttack"  //攻击就去除隐身并且造成额外伤害
  46. {
  47. "RunScript"
  48. {
  49. "ScriptFile"    "scripts/vscripts/ability.lua"
  50. "Target"        "UNIT"
  51. "Function"      "bounty_hunter_wind_walk_2_attack"
  52. }
  53. }
  54. "OnAbilityExecuted"  //施放技能就去除隐身
  55. {
  56. "RunScript"
  57. {
  58. "ScriptFile"    "scripts/vscripts/ability.lua"
  59. "Target"        "UNIT"
  60. "Function"      "bounty_hunter_wind_walk_2_attack"
  61. }
  62. }
  63. }
  64. }
  65. // Special
  66. //-------------------------------------------------------------------------------------------------------------
  67. "AbilitySpecial"
  68. {
  69. "01"
  70. {
  71. "var_type"                  "FIELD_FLOAT"
  72. "duration"                  "20.0 25.0 30.0 35.0"
  73. }
  74. "02"
  75. {
  76. "var_type"                  "FIELD_FLOAT"
  77. "fade_time"                 "1.0 0.75 0.5 0.25"
  78. }
  79. "03"
  80. {
  81. "var_type"                  "FIELD_INTEGER"
  82. "bonus_damage"              "30 60 90 120"
  83. }
  84. }
  85. }

技能配置是可以override的。通过AbilityCooldown等字段可以描述技能的基本信息,如它的目标是什么类型的,冷却时间多少,消耗魔法多少。

"OnSpellStart"是一系列的事件回调,其他如OnAttack  OnProjectileHit等等,他们可以在特定的事件回调。

在事件回调内部可以通过一些列Action来描述具体行为,如AttachEffect就是添加光效, FireSound就是播放声音, Damage就是造成伤害, Stun就是眩晕。 Damage和Stun中又可以指定目标是施法者还是受击者,范围是什么,伤害值和眩晕时间多少等等。

比较重要的还有AddModifier,Modifier可以理解为Buff,它可以包含一组Properties,它们是具体的行为,如攻击速度增加50%,伤害增加100等等。  Modifier内部也可以有一系列回调,如OnCreate,可以在合适的时机执行更加复杂的组合效果。

另一个重要的部分是RunScript,通过lua脚本,可以轻易实现程序默认没有实现的行为。比如每秒造成xx伤害,或者受击目标越多,伤害越大。

通过EventCallback----Action----Modifier----Script的体系来实现的技能系统,具备非常强的扩展性。添加新技能就是一些列这些元素的组合。而添加新的效果也不会对整个技能系统造成影响。 其他的东西都是在此基础上的元素,比如发射抛射物就是一个Action,抛射物如果击中使人眩晕就加一个Stun的动作或者是一个Modifier。如果需要特殊的判定如每击中一个人伤害增加10%,那么就添加对应的Script,在OnProjectileHit里面进行调用。

Dota2技能系统设计分析的更多相关文章

  1. 一个MMORPG的常规技能系统

    广义的的说,和战斗结算相关的内容都算技能系统,包括技能信息管理.技能调用接口.技能目标查找.技能表现.技能结算.技能创生体(buff/法术场/弹道)管理,此外还涉及的模块包括:AI模块(技能调用者). ...

  2. MMO技能系统的同步机制分析

    转自:http://www.gameres.com/729629.html 此篇文章基于之前文章介绍的技能系统,主要介绍了如何实现MMO中的技能系统的同步.阅读此文章之前,推荐首先阅读前一篇文章:一个 ...

  3. Unity3D手游开发日记(2) - 技能系统架构设计

    我想把技能做的比较牛逼,所以项目一开始我就在思考,是否需要一个灵活自由的技能系统架构设计,传统的技能设计,做法都是填excel表,技能需要什么,都填表里,很死板,比如有的技能只需要1个特效,有的要10 ...

  4. python基础----以面向对象的思想编写游戏技能系统

    1. 许多程序员对面向对象的思想都很了解,并且也能说得头头是道,但是在工作运用中却用的并不顺手. 当然,我也是其中之一. 不过最近我听了我们老师的讲课,对于面向对象的思想有了更深的理解,今天决定用一个 ...

  5. Unity——技能系统(一)

    技能系统(一) 一.Demo展示 二.功能介绍 集成了技能,冷却,buff,UI显示,倒计时,动画等: 技能类型:弹道技能,动画事件根据帧数采用延迟调用技能,自定义释放位置(偏移,发射点两种),buf ...

  6. Unity——技能系统(二)

    Unity技能系统(二) Unity技能系统(一) Demo展示: 五.技能管理和释放 1.CharacterSkillSystem 技能系统类,给外部(技能按钮,按键)提供技能释放方法: 技能释放逻 ...

  7. Unity——技能系统(三)

    Unity技能系统(三) Unity技能系统(一) Unity技能系统(二) Demo展示 六.Buff系统 buff分为增益和减益buff,应该区分开来: /// <summary> / ...

  8. [UE4]GameplayAbilities,技能系统插件

    Unreal Engine 4(虚幻UE4)GameplayAbilities 插件入门教程(七)Ability的信息传递等   Unreal Engine 4(虚幻UE4)GameplayAbili ...

  9. 航空售票系统设计分析(Markdownpad2图片服务器上传无法显示)

    一.体系结构设计 1.系统原型图 2.体系结构环境图 3.构建结构图 二.人机交互界面设计 1.用户分析结果及建议 本次分析的主要目标关注用户评论反馈,对反馈进行归纳,设计出用户喜欢的界面样式.用户的 ...

随机推荐

  1. iOS8的UIPresentationController

    本文转载至 http://kyfxbl.iteye.com/blog/2147888 从iOS8开始,controller之间的跳转特效,需要用新的API UIPresentationControll ...

  2. EasyRTMP实现对接海康、大华等IPCamera SDK进行RTMP推送直播功能

    本文转自EasyDarwin团队Kim的博客:http://blog.csdn.net/jinlong0603 Demo项目介绍 EasyRTMP Demo代码下载地址https://github.c ...

  3. Angular中的内置指令和自定义指令

    NG中的指令,到底是什么(what)? 为什么会有(why)?以及怎样使用(how)? What: 在NG中,指令扩展HTML功能,为 DOM 元素调用方法.定义行为绑定数据等. Why: 最大程度减 ...

  4. some base knowledge

    har类型的长度被定义为一个8位字节,这很简单. short类型的长度至少为两字节.在有些计算机上,对于有些编译程序,short类型的长度可能为4字节,或者更长. int类型是一个整数的“自然”大小, ...

  5. firefox coap安装使用

    coap 插件: 百度搜索firefox coap也能找到该插件https://addons.mozilla.org/zh-CN/firefox/addon/copper-270430/在firefo ...

  6. [IR课程笔记]概率检索模型

    几个符号意义: R:相关文档集 NR:不相关文档集 q:用户查询 dj:文档j 1/0风险情况 PRP(probability ranking principle):概率排序原理,利用概率模型来估计每 ...

  7. Mac查看端口

    lsof -i tcp:port eg: lsof -i tcp:8899

  8. ubuntu下安装android模拟器genymotion【转】

    本文转载自:http://www.jianshu.com/p/e6062ebb8fc9 去genymotion下载对应的安装包genymotion-2.4.0_x64.bin sudo ./genym ...

  9. RobotFramework教程使用笔记——web自动化测试弹窗处理

    在web自动化测试中会遇到各种弹出框,在selenium中有对这些弹出框的处理. 弹出框一般有这么几类: 1.普通的弹出窗口,如果是可以定位的,直接定位到窗口,然后进行相应的操作. 2.如果是浏览器系 ...

  10. struts2中<s:if>标签的使用

    转载:http://blog.sina.com.cn/s/blog_5f9938640100v2kr.html A:<s:if>判断字符串的问题: 1.判断单个字符:<s:if te ...