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. js thiskeyword

    相信大家都接触过this了,那么 this究竟是什么意思呢?看其字面意思就是个代词.指代其它的一些东西. 那么我们在程序其中,事实上也是一样.this也是个代词. 比方我们在java其中,this的k ...

  2. WPF自定义Popup和弹出菜单

    Popup: <StackPanel Grid.Column="0" Grid.Row="6" Orientation="Horizontal& ...

  3. Android-addToBackStack使用和Fragment执行流程

    文章来源:https://blog.csdn.net/wenxuzl99/article/details/16112725 在使用Fragment的时候我们一般会这样写: FragmentTransa ...

  4. SQL 游标示例

    DECLARE @i INT ) --给初始值 CREATE TABLE #temp_test --创建临时表 ( num ) ) ) BEGIN INSERT INTO #temp_test ( n ...

  5. 01-bilibilidemo配置

    github-ijkplayer(bilibili)->cd 桌面位置 git clone https://github.com/Bilibili/ijkplayer.git ijkplayer ...

  6. MVC3 类型 System.Web.Mvc.ModelClientValidationRule 同时存在

    用文本编辑器打开  工程名称 .csproj 找到 1. <Reference Include="System.Web.WebPages" /> 2. <Refe ...

  7. SQuirreL – Phoenix的GUI

    本文主要介绍如何通过SQuirreL访问Phoenix,以及如何在SQuirreL中配置Phoenix参数. 什么是SQuirrel? SQuirreL SQL Client是一个开源免费软件, 可以 ...

  8. ​vmware虚拟机centos网络配置错误,执行/etc/init.d/network start 或 restart 提示Device eth0 has different MAC address than expected, ignoring

    vmware虚拟机centos网络配置错误,执行/etc/init.d/network start 或 restart 提示Device eth0 has different MAC address ...

  9. Android笔记之使用LocationManager获取经纬度

    LocationManager.getLastKnownLocation(String provider)有可能返回null,概率还挺高 findViewById(R.id.llMain).setOn ...

  10. Ace(一)环境搭建

    1.下载ACE源码代码    http://www.cs.wustl.edu/~schmidt/ACE.html 2.编译源代码    2.1 进入源码包解压后的ACE_wrappers\ace目录, ...