这个嘛,我觉得我还是能答的,因为我曾经设计了DOTA2的一款RPG,虽然未完(逃
有道云笔记
有道云笔记
有道云笔记
有道云笔记
当然没翻译完,因为弃坑了233
以上是数据驱动类型的技能,还有脚本驱动类型的技能。
===========================================================
上面很多答主讲的其实都是数据驱动类型的技能,也就是data-driven,简单的来说,就是把通用的技能肢解成若干方面。
一个数据驱动的技能是一串键值的集合。键值是单一的、基于树的结构,用于储存包含了键/值对的嵌套部分。一个典型的数据驱动类型技能框架是这样定义的,当然指的是dota2:
"datadriven_skeleton"
{
// General
// ----------------------------------------------------------------------------------------
"BaseClass" "ability_datadriven"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET"
"AbilityTextureName" "spellicon"
"AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY"
"AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC"
"AbilityUnitTargetFlags" "DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES"
"AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL"
"AbilityType" "DOTA_ABILITY_TYPE_BASIC"
"MaxLevel" "7"
"RequiredLevel" "-4"
"LevelsBetweenUpgrades" "7"
"AbilityCastPoint" "0.0"
"AbilityCastAnimation" "ACT_DOTA_ATTACK"
"AnimationPlaybackRate" "1"
"AnimationIgnoresModelScale" "1"
// Stats
//----------------------------------------------------------------------------------------
"AbilityDamage" "0 0 0 0"
"AbilityManaCost" "0 0 0 0"
"AbilityCooldown" "0.0 0.0 0.0 0.0"
"AbilityCastRange" "0"
"AbilityCastRangeBuffer" "250"
"AbilityChannelTime" "0.0 0.0 0.0 0.0"
"AbilityChannelledManaCostPerSecond" "30 35 40 45"
"AbilityDuration" "0.0 0.0 0.0 0.0"
"AoERadius" "250"
// ...
}可以看到,一个技能被拆分成了很多很多各自独立,相辅相成的部分,目标选取限定、图标资源、技能类型、最高等级、升级等级要求、升级等级间隔要求、施法点、施法动画、目标阵营限定、目标类型限定、粒子效果、伤害、CD、耗蓝、施法时间、施法前摇、施法后摇、持续时间、AOE范围……
这些部分又各自有各自的关键字,将他们依据自己的创意组合在一起,可以快速地组合出非常非常多的技能,就是数据驱动类型技能存在的最大意义。
第二个意义在于,数据驱动类型技能是一个框架,它的存在是最通用的一个模板。就拿非常有特点的,冰魂的大招来说。冰魂大招的具体实现压根不是在数据驱动类型所能实现的,但是如果你解包了文件之后你会看到,冰魂大招确确实实存在于数据驱动类型技能表里头。为什么?就是因为数据驱动类型给了你一个框架,你先把数据给我填上去,再去谈脚本实现。
脚本驱动的技能确实给力,它相对于前者更底层,控制更多的东西,甚至可以一定意义上改变游戏的规则(在冰魂大招里体现为禁止生命回复),但是如果所有的东西都拿脚本来写,整个代码会变得混乱不堪,充斥着这样那样的变量和语句,无法提炼出技能的核心数据。
因此,数据驱动往往和脚本驱动统一在一起,有纯数据驱动的技能,也有数据驱动里包含脚本驱动的技能,还有少数纯脚本驱动的技能,不过前两者占大多数。数据驱动提供技能最基本的类型和框架设定,同时为脚本提供了接口,怎么实现,由脚本提供者去考虑。
==============================================
因此,你说一个普适的技能系统是不存在的,即时战斗的和回合制的能一样吗?宝石迷宫和暗黑破坏神能一样吗?这跟2D\2.5D\3D没关系,画面跟系统不是一回事(大多数情况下,你说fez我也没辙)
你先要选定一个游戏类型,仔细思考其职业、系统上会涉及到的东西,然后用一个尽可能大而全的框架把你的构思框住,细细肢解,最后非常特殊的再单独使用脚本实现。因此不要急着去做这个通用的框架,把能想到的都想了,把框不住的东西问了程序看能不能单独实现,再去肢解。肢解也不要一次就弄完,反复想想,能不能分得更细,更科学,更有结构性,你在架构上多花一个小时,或许后期实现能省十个小时。