• Dota2技能系统设计分析


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

            技能配置是可以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里面进行调用。

  • 相关阅读:
    【CI】系列一:总体环境规划
    【原】Ubuntu下使用teamviewer
    [Android] android:visibility属性应用
    Android 软键盘
    android EditText inputType 及 android:imeOptions=”actionDone”
    【Android】The application has stopped unexpectedly.Please try again.
    【IntelliJ IDEA 12使用】导入外部包
    [转载]Android开发者必须深入学习的10个应用开源项目
    【android相关】【问题解决】R.java文件丢失
    1月1日起,我市交通事故快速理赔上限提高至1万元!
  • 原文地址:https://www.cnblogs.com/nafio/p/9137400.html
Copyright © 2020-2023  润新知