Dota2技能系统设计分析

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

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

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

"bounty_hunter_wind_walk_2"
{
    "BaseClass"                     "ability_datadriven"
    "AbilityBehavior"               "DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_IMMEDIATE | DOTA_ABILITY_BEHAVIOR_IGNORE_CHANNEL"
    "AbilityUnitDamageType"         "DAMAGE_TYPE_PHYSICAL"
    "AbilityTextureName"            "bounty_hunter_wind_walk"

    // Time
    //-------------------------------------------------------------------------------------------------------------
    "AbilityCooldown"               "15.0 15.0 15.0 15.0"
    "AbilityCastPoint"              "0.0 0.0 0.0 0.0"

    // Cost
    //-------------------------------------------------------------------------------------------------------------
    "AbilityManaCost"               "50 50 50 50"

    "OnSpellStart"
    {
        "AttachEffect"  //创建特效
        {
            "EffectName"        "particles\units\heroes\hero_bounty_hunter\bounty_hunter_windwalk.vpcf"
            "EffectAttachType"  "follow_origin"
            "Target"            "CASTER"
        }
        "FireSound"  //播放声音
        {
            "EffectName"        "Hero_BountyHunter.WindWalk"
            "Target"            "CASTER"
        }   

        "ApplyModifier"  //添加去除隐身的触发modifier
        {
            "Target"            "CASTER"
            "ModifierName"      "modifier_bounty_hunter_wind_walk_2"
        }

        "RunScript"  //在脚本里面启动隐身
        {
            "ScriptFile"    "scripts/vscripts/ability.lua"
            "Target"        "CASTER"
            "Function"      "bounty_hunter_wind_walk_2"
        }
    }   

    "Modifiers"
    {
        "modifier_bounty_hunter_wind_walk_2"
        {
            "Duration"      "%duration"
            "IsHidden"      "1"

            "OnAttack"  //攻击就去除隐身并且造成额外伤害
            {
                "RunScript"
                {
                    "ScriptFile"    "scripts/vscripts/ability.lua"
                    "Target"        "UNIT"
                    "Function"      "bounty_hunter_wind_walk_2_attack"
                }
            }

            "OnAbilityExecuted"  //施放技能就去除隐身
            {
                "RunScript"
                {
                    "ScriptFile"    "scripts/vscripts/ability.lua"
                    "Target"        "UNIT"
                    "Function"      "bounty_hunter_wind_walk_2_attack"
                }
            }
        }
    }

    // Special
    //-------------------------------------------------------------------------------------------------------------
    "AbilitySpecial"
    {
        "01"
        {
            "var_type"                  "FIELD_FLOAT"
            "duration"                  "20.0 25.0 30.0 35.0"
        }
        "02"
        {
            "var_type"                  "FIELD_FLOAT"
            "fade_time"                 "1.0 0.75 0.5 0.25"
        }
        "03"
        {
            "var_type"                  "FIELD_INTEGER"
            "bonus_damage"              "30 60 90 120"
        }
    }
}

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

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-07-31 18:58:21

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

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

我想把技能做的比较牛逼,所以项目一开始我就在思考,是否需要一个灵活自由的技能系统架构设计,传统的技能设计,做法都是填excel表,技能需要什么,都填表里,很死板,比如有的技能只需要1个特效,有的要10个,那么表格也得预留10个特效的字段.在代码里面也是写死一些东西,要增加和修改,就得改核心代码,如果我要把核心部分做成库封装起来,就很麻烦了. 能不能做成数据驱动的方式呢? 改技能文件就行了,即使要增加功能,也只需要扩展外部代码,而不用改核心代码, 我是这么来抽象一个技能的,技能由一堆触发器组成,比

游戏技能系统

技能系统A.技能的状态转换[前摇动作 | 吟唱]--[效果延迟+(持续效果 | 瞬时效果) | 持续引导]--[后摇动作]1.瞬发类技能:无吟唱.无效果延迟2.吟唱类技能:需要一段时间进行施法前的准备过程,可以被打断,打断施法失败3.引导类技能:需要持续进行施法,一旦停止施法,则停止伤害 B.技能的影响对象1.自已2.敌方3.队友4.任意单位 C.技能的释放对象1.自己2.单个敌方3.单个队友4.任意单个5.区域,以自己位置为参考,以选中单位坐标为释放参考,以施法参考圈为参考 D.技能的影响范围

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

转自:http://www.gameres.com/729629.html 此篇文章基于之前文章介绍的技能系统,主要介绍了如何实现MMO中的技能系统的同步.阅读此文章之前,推荐首先阅读前一篇文章:一个MMORPG的常规技能系统. 这里所说的技能系统包括:技能流程和技能创生体(法术场.弹道和buff). 首先介绍authority和proxy的概念,这两个概念是基于单位unit的基础上进行的区分. authority表示单位的主控端,即此单位是由客户端和还是服务端控制.对于玩家avatar,玩家本

小妖精的完美游戏教室——技能系统

//================================================================//// Copyright (C) 2017 Team Saluka// All Rights Reserved//// Author:小妖精Balous////================================================================ using System.Collections;using System

一个MMORPG的常规技能系统

广义的的说,和战斗结算相关的内容都算技能系统,包括技能信息管理.技能调用接口.技能目标查找.技能表现.技能结算.技能创生体(buff/法术场/弹道)管理,此外还涉及的模块包括:AI模块(技能调用者).动作模块.寻路/移动模块以及人物属性和伤害数值结算等. 先说下技能模块每个部分的职责和原理: 技能信息管理:管理unit所拥有的技能以及技能的等级.cd等.在我们游戏中,这里还需要负责管理符文,符文会对技能信息进行修改. 技能调用接口:AI或者UI操作触发技能,触发技能时可能选择了一个目标(AI),

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

1. 许多程序员对面向对象的思想都很了解,并且也能说得头头是道,但是在工作运用中却用的并不顺手. 当然,我也是其中之一. 不过最近我听了我们老师的讲课,对于面向对象的思想有了更深的理解,今天决定用一个实例跟大家分享一下. 欢迎各位前辈评论指正. 2.面向对象的三大特征:封装.继承.多态          六大原则: 开闭原则,单一职责,依赖倒置,组合复用,里氏替换,迪米特法则 3. 可是这三大特征和六大原则具体如何运用,又从哪里才能体现出我应用到了呢? 下面我就以一个游戏技能项目的代码实例,来讨

ARPG游戏的技能系统和buff系统的一种实现

<龙与地下城>是由TSR开发的一款桌上角色扮演游戏,于1974年发行第一版.该款游戏对角色扮演游戏也有很大的影响,后来的许多相同类型的游戏都受到了它的影响.简单看了一遍该游戏的玩家手册,再对比某个游戏的技能系统,和玩家手册描述的很相像. 这篇文章主要是对该游戏技能系统总结下实现思路. 一.首先需要讨论下技能的各种表现(以下是一些代表性的技能,摘自网络): 1.位置相关的如:瞬移.冲撞.击退.跳跃等.2.持续时间相关的如:眩晕.定身.临时提高xx属性等.魔法盾等.3.永久效果相关的如:永久加属性

Unity3D 战斗技能系统架构

大家在玩游戏的时候,经常会看到各种技能特效,远近攻击,非常绚丽,角色的打击感非常吸引玩家,其实这就是我们通常说的战斗技能系统,大家如果第一次去实现这个战斗系统,可能感觉无处下手,再被策划的文案一搞,云里雾里,在这里我就跟大家简单的说一下如何架设技能系统. 在实现战斗系统的时候,首先大家思路一定要明确,知道如何去架设,在不知道如何实现不要忙于写代码,想清楚了再写. 那现在我们假设实现一个枪战的战斗系统,首先会有各种***,***发射的***是不同的,决定了他的破坏程度是不同的,这就涉及一个***与

《炉石传说》架构设计赏析(5):卡牌&amp;技能的静态数据组织

经过前面几次的尝试,我们对炉石的代码已经不陌生了.除了网络机制还没有了解以外,本机的逻辑已经比较熟悉了. 接下来继续向暴雪最NB的技能系统进发,我们的目标是: 分析技能的静态数据描述: 分析技能的运行时数据.逻辑组织: 这篇笔记主要记录对其分析静态数据. 静态数据组织 卡牌数据 卡牌的基本数据对于的AssetFamily为:AssetFamily.CardXML: 数据对于的资源包为"cardxml0.unity3d": 资源包中的资源类型为:TextAsset: 资源加载使用的接口为