Dota2技能系统设计分析
http://blog.csdn.net/langresser_king/article/details/46776701
前两周写完了新游戏的技能系统。虽然也算灵活,但是跟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里面进行调用。
Dota2技能系统设计分析的更多相关文章
- 一个MMORPG的常规技能系统
广义的的说,和战斗结算相关的内容都算技能系统,包括技能信息管理.技能调用接口.技能目标查找.技能表现.技能结算.技能创生体(buff/法术场/弹道)管理,此外还涉及的模块包括:AI模块(技能调用者). ...
- MMO技能系统的同步机制分析
转自:http://www.gameres.com/729629.html 此篇文章基于之前文章介绍的技能系统,主要介绍了如何实现MMO中的技能系统的同步.阅读此文章之前,推荐首先阅读前一篇文章:一个 ...
- Unity3D手游开发日记(2) - 技能系统架构设计
我想把技能做的比较牛逼,所以项目一开始我就在思考,是否需要一个灵活自由的技能系统架构设计,传统的技能设计,做法都是填excel表,技能需要什么,都填表里,很死板,比如有的技能只需要1个特效,有的要10 ...
- python基础----以面向对象的思想编写游戏技能系统
1. 许多程序员对面向对象的思想都很了解,并且也能说得头头是道,但是在工作运用中却用的并不顺手. 当然,我也是其中之一. 不过最近我听了我们老师的讲课,对于面向对象的思想有了更深的理解,今天决定用一个 ...
- Unity——技能系统(一)
技能系统(一) 一.Demo展示 二.功能介绍 集成了技能,冷却,buff,UI显示,倒计时,动画等: 技能类型:弹道技能,动画事件根据帧数采用延迟调用技能,自定义释放位置(偏移,发射点两种),buf ...
- Unity——技能系统(二)
Unity技能系统(二) Unity技能系统(一) Demo展示: 五.技能管理和释放 1.CharacterSkillSystem 技能系统类,给外部(技能按钮,按键)提供技能释放方法: 技能释放逻 ...
- Unity——技能系统(三)
Unity技能系统(三) Unity技能系统(一) Unity技能系统(二) Demo展示 六.Buff系统 buff分为增益和减益buff,应该区分开来: /// <summary> / ...
- [UE4]GameplayAbilities,技能系统插件
Unreal Engine 4(虚幻UE4)GameplayAbilities 插件入门教程(七)Ability的信息传递等 Unreal Engine 4(虚幻UE4)GameplayAbili ...
- 航空售票系统设计分析(Markdownpad2图片服务器上传无法显示)
一.体系结构设计 1.系统原型图 2.体系结构环境图 3.构建结构图 二.人机交互界面设计 1.用户分析结果及建议 本次分析的主要目标关注用户评论反馈,对反馈进行归纳,设计出用户喜欢的界面样式.用户的 ...
随机推荐
- Android-运行时权限
由于拨打电话数据用户的隐私,再者由于在5.0之后Android更注重于用户的隐私权限,为此出现了在低版本没有的问题,而在高版本出现的个别问题! Intent intent = new Intent(I ...
- 一个兼容性比较好的图片左右滚动的js
下载地址:http://www.cnblogs.com/RightDear/admin/Files.aspx 文件:shhds.rar
- asp.net 列表控件
web空间类都被放置在System.Web.UI.WebControls命名空间下1.ListBox ListBox控件用于创建多选的下拉列表,而可选项是通过ListItem元素来定义的.示例代码如 ...
- delphi android 录像(使用了JMediaRecorder,MediaRecorder的使用方法)
delphi xe系列自带的控件都无法保存录像,经网友帮忙,昨天终于实现了录像功能(但有个问题是录像时无画面显示),程序主要使用了JMediaRecorder,MediaRecorder的使用方法可参 ...
- Delphi里可将纯虚类实例化,还可调用非虚函数
这是与Java/C++的巨大不同.目前还没仔细想这个特征与TClass之间的联系,先记住结论再说.以后再回来修改这个帖子. unit Unit1; interface uses Windows, Me ...
- Windows服务器从Linux服务器上以FTP形式获取图片
Windows服务器上运行一个获取图片的程序,获取图片采用的是FTP方式: 准备条件: Linux服务器上创建一个FTP的用户:ftppic 这个账号要有权限才可以,然后编写Windows端代码: p ...
- wifi 协议栈的历史的总结
google 了一下找到下面的网页关于wifi 协议栈的说明 https://www.lifewire.com/wireless-standards-802-11a-802-11b-g-n-and-8 ...
- s:if
<s:iterator value="value[3]" id="ques" status="s"> <s:if test ...
- codeforces 570D.Tree Requests
[题目大意]: 给定一棵树,树的每个节点对应一个小写字母字符,有m个询问,每次询问以vi为根节点的子树中,深度为hi的所有节点对应的字符能否组成一个回文串: [题目分析]: 先画个图,可看出每次询问的 ...
- scroll或是其子类被添加进view时,界面自动上移
开发中经常会遇到ViewController添加scroll或是其子类被添加进controller.view时,scroll会自动下移大概64像素 解决: self.edgesForExtendedL ...