找回密码
 立即注册
查看: 389|回复: 0

【unity游戏开发】Dota2:数据驱动类技能分析

[复制链接]
发表于 2021-12-4 09:03 | 显示全部楼层 |阅读模式
Dota2:数据驱动类技能

得益于Dota2自带的编辑器,通过玩家的手在DOTA2的创意工坊中有很多有趣有好玩的Mod,比如《进化岛》、《大乱斗》等等,这其中更是诞生了风靡全球的《DOTA自走棋》。这些Mod的诞生也从另一个角度证明了Dota2的技能系统和编辑器设计的优秀。
从DOTA2的开发者文档中可以看出其技能系统采用的是”数据驱动“的方式,数据驱动技能是一组键值KeyValue数据,这是一种简单的树状结构,来存储包含了一组组可嵌套的键及其对应值的数据。Dota2通过C++编写的接口来读取技能描述文件,这些描述文件是一种KV(Key-Values)结构的数据,开发者通过编写这些KV(Key-Values)结构的数据来实现不同技能效果的组合。
一个可以造成范围性伤害和晕眩的法球实例。
"testOrb_Example"
{
    "ID"    "10003"
    "BaseClass"    "ability_datadriven"
    // 技能是以单位为目标、自动施放、普通攻击
    "AbilityBehavior"    "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_AUTOCAST| DOTA_ABILITY_BEHAVIOR_ATTACK"
    // 技能目标是敌方阵营
    "AbilityUnitTargetTeam"    "DOTA_UNIT_TARGET_TEAM_ENEMY"
    // 指定的类型:所有,这个没有很懂
    "AbilityUnitTargetType"    "DOTA_UNIT_TARGET_ALL"
    "MaxLevel"    "1"
    "AbilityCastPoint"    "0.0"
    // 施放范围
    "AbilityCastRange"    "900"
    // 冷却时间
    "AbilityCooldown"    "0"
    // 耗蓝
    "AbilityManaCost"    "10"

    "Modifiers"
    {
        "TestOrb_Modifier"
        {
            "Passive"    "1"
            "IsHidden"    "1"
            "Orb"
            {
                "Priority"    "DOTA_ORB_PRIORITY_ABILITY"//法球的类型
                //下面是一个投射物特效的定义,值得一提的是,不少粒子效果是无法形成正常的投射物效果,而是会直接附着到目标上面播放。
                "ProjectileName"    "particles/units/heroes/hero_sven/sven_spell_storm_bolt.vpcf"
                "CastAttack"    "1"
            }
            "OnOrbFire"
            {
                //这下面的设定会使得当你右键激活自动释放时进行普通攻击也能正常消耗魔法,否则激活自动释放状态下不会消耗魔法。
                "SpendMana"
                {
                    "Mana"    "%AbilityManaCost"
                }
            }
            "OnOrbImpact"
            {
                "FireEffect"
                {
                    "EffectName"    "particles/units/heroes/hero_sven/sven_spell_warcry.vpcf"
                    "EffectAttachType"    "attach_hitloc"
                    "Target"    "TARGET"
                }
                "Damage"//对范围内单位造成伤害
                {
                    "Type"    "DAMAGE_TYPE_PURE"
                    "Damage"    "%RangeDamage"//和AbilitySpecial里定义的RangeDamage上对应数值挂钩。
                    "Target"
                    {
                        "Center"    "TARGET"
                        "Teams"    "DOTA_UNIT_TARGET_TEAM_ENEMY"
                        "Type"    "DOTA_UNIT_TARGET_ALL"
                        "Radius"    "275"
                    }
                }
                "Stun"//击晕范围内单位
                {
                    "Duration"    "2"
                    "Target"
                    {
                        "Center"    "TARGET"
                        "Teams"    "DOTA_UNIT_TARGET_TEAM_ENEMY"
                        "Type"    "DOTA_UNIT_TARGET_ALL"
                        "Radius"    "275"
                    }
                }
            }
        }
    }
} 从以上代码中可以看出,一个典型的DOTA2技能数据包括以下几个部分:
1.Actions(技能行为):使技能有不用的释放方式,如:持续性施法、被动技能、指向性技能等等能。技能释放的目标,如:单体目标、多目标等等。
2.Events(技能触发的事件):技能可以有各种游戏中的事件,这些事件可以触发操作,如:当技能施法开始、当持续施法完成、当施法者死亡等等。
3.Modifiers:该属性能够改变对应Modifier影响的单位的游戏相关数值,如:所有魔法攻击无效、所有物理攻击无效、修改基础攻击力、修改攻击速度等等。
4.AbilitySpecial:技能特殊定义,这个部分有两个作用:1.定义随着技能升级改变的值,基于"%value";2.格式化的文本提示,可以显示此处定义的值,用于鼠标悬停时的提示信息。
其中Modifiers、AbilitySpecial并不是必须的,有些技能并没有这两块的定义。通过Dota2定义好的技能键值和开放出来的API,玩家可以使用Lua重新设计Dota2的技能和英雄行为。不仅是Mod作者可以利用这些方法制作出各种地图,Dota2本身的许多技能和英雄也是使用这种方式制作的。
学习了Dota2的数据驱动技能设计的基础,接着想就着之前大哥实现的lua版本,照着抄一遍,实现一套C#版本的技能系统。
参考

Valve Dota2 数据驱动类技能API
Valve Dota2  数据驱动类技能范例
游戏中的技能系统设计
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2025-5-15 04:47 , Processed in 0.132971 second(s), 25 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表