zoukankan      html  css  js  c++  java
  • 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里面进行调用。

  • 相关阅读:
    赫尔维茨公式
    从解析几何的角度分析二次型
    Struts 1 Struts 2
    记一次服务器被入侵的调查取证
    契约式设计 契约式编程 Design by contract
    lsblk df
    Linux Find Out Last System Reboot Time and Date Command 登录安全 开关机 记录 帐号审计 历史记录命令条数
    Infrastructure for container projects.
    更新文档 版本控制 多版本并发控制
    Building Microservices: Using an API Gateway
  • 原文地址:https://www.cnblogs.com/nafio/p/9137400.html
Copyright © 2011-2022 走看看