码迷,mamicode.com
首页 > 其他好文 > 详细

【转】星际2技能系统分析

时间:2017-11-22 15:17:37      阅读:215      评论:0      收藏:0      [点我收藏+]

标签:分析   unit   www   use   意思   targe   article   理解   logic   

转自 http://blog.csdn.net/alistair_chow/article/details/53319888

最近一直在想设计一个易扩展的,可配置的技能系统框架。看了几个项目源码,可能自己功力不够,感觉类与类之间的套用很混乱,看的云里雾里的,然后网上到处找资料。

对两个技能设计比较感兴趣,一个是Dota2 
http://moddota.com/forums/discussion/14/datadriven-ability-breakdown-documentation 
一个是星际2 
https://www.sc2mapster.com/wiki/galaxy/data/

目前先重点关注下星际2的技能系统,由于没有资料介绍,只能通过星际2的地图编辑器去揣测。

数据结构

星际2的数据为树状结构 
技术分享图片

数据对象

星际2的整个数据对象都是通过XML进行配置的

技术分享图片

星际2按照上图对数据对象进行了分类

GAME

游戏相关数据对象

技术分享图片

Campaign

战役相关数据对象

技术分享图片

Actor

演算器数据对象

技术分享图片

Art And Sound

美术和声音数据对象

技术分享图片

Terrain

地形数据对象

技术分享图片

Hero

英雄

技术分享图片

UI

界面

技术分享图片

Advanced

高级

技术分享图片

技能系统 ABE

貌似都把星际2的技能系统称为ABE(Ability, Behavior, Effect)。 
Ability(技能) 
技能的基础数据,比如名字,ID,消耗等。 
Effect(效果) 
技能所产生的效果,比如造成伤害,星际2的Effect与动画,特效,音效等是没有关系的,它是负责逻辑运算,所有的动画,特效都是在Actor里面进行处理。

效果又可以生成效果或行为,所以效果也是个树状结构。

如:灵能风暴的效果会持续几秒钟的时间,并且会在某一地区搜索单位时周期性的产生另外一个效果。这个搜索效果会产生在每个单位身上并造成伤害。 
技术分享图片 
Behavior(行为) 
效果所产生的行为,比如BUFF

 

人族机枪兵,有移动,停止,攻击及兴奋剂四个技能,对应类图如下 
技术分享图片

CAbil

技能的虚基类,所有技能类都派生于它

属性

技术分享图片 
Name: 技能名称 
SetId:唯一标识 
Alignment:技能瞄准对象 
TechPlayer:科技玩家 
TechAliasArray:科技别名 
SharedFlags:共享标签

XML定义

技术分享图片

CAbilMove

移动技能基类

技术分享图片 
CmdButtonArray:技能按钮的值,关联CButton对象 
FleeRange:当遭遇敌人攻击但又无法还击时,单位将逃跑的距离 
FleeTime:单位逃离单次攻击时将会花费的最大时间 
FllowAcquireRange:跟随搜索范围 
FllowRangeSlop:跟随距离 
MinPatrolDistance:最小巡逻距离

XML定义

技术分享图片

实体类

移动实体类,根节点为继承的基类名, ID为实体类名

技术分享图片

CAbilStop

停止技能基类

属性

技术分享图片

XML定义

技术分享图片

实体类

技术分享图片

CAbilAttack

攻击技能基类

属性

技术分享图片 
MinAttackSpeedMultiplier:使用该技能后攻击速度提高的最小倍数。 
MaxAttackSpeedMultiplier:使用该技能后攻击速度提高的最大倍数。 
CmdButtonArray:技能的特定命令相关的数据 
AcquireFilters:定义拥有该技能的单位可以自己获取的目标类型 
AcquirePriority:当一个以上的同单位技能尝试自动获取目标时,返回最高的“获取有限级”的技能会最先有机会潜在目标。不会获取目标的技能应将之设为0。该值被设为0的技能不会获取目标。 
SmartFilters:这些类型对象能被攻击

XML定义

技术分享图片

实体类

技术分享图片

执行逻辑

用CAbilMove举例 
技术分享图片 
上图中重名文件是因为包含在不同的XML文件中,可以理解为存在与不同的类库里

每个对象除了基本的属性外,还可以挂载其他的模组,如按钮,单位,验证器等,基类挂载了按钮 
技术分享图片 
实体类挂载了单位,验证器,移动器,移动器包含了飞行和地面两个 
技术分享图片

可以推算出其逻辑为 
1.用户点击Move按钮 
2.Move按钮找到当前单位的CMoveAbil 
3.Move实体类找到对应的CMover 
4.CMover根据Move实体类及单位的属性执行单位移动

类似于MVC模式 
View(CButton) 
Model(CAbil) 
Controller(CMover)

 

 
 

技能施放的阶段

技能被分为了7个阶段 
Approach:接近 
Wait:等待 
Prep:准备 
Cast:施放 
Channel:引导 
Finish:结束 
Bail:保释

AbilEffect

效果技能基类

属性

技术分享图片 
好吧。。太多了 
Arc:施法范围,若目标不在范围内,单位会自动调整至目标进入施法范围 
Cost:技能消耗 
AutoCast:自动释放技能的属性 
Effect:技能应用的效果,默认值为##id##,既Id相同的CEffect 
EffctRange : 效果范围 
然后就是一堆技能各个阶段的配置:比如哪个阶段可以被强行中断,哪个阶段可以返回Cost, 哪个阶段取消特效等

XML定义

<CAbilEffect default="1">
    <!--目标离开施法者距离1米远后,施法取消-->
    <RangeSlop value="1"/>
    <!--目标离开施法弧形11.25角度后,施法取消-->
    <ArcSlop value="11.25"/>
    <!--自动施法,主动攻击-->
    <AutoCastAcquireLevel value="Offensive"/>
    <!--自动施法对象, 可见的;玩家;同盟-->
    <AutoCastFilters value="Visible;Player,Ally"/>
    <!--联盟变换后中止-->
    <Flags index="AbortOnAllianceChange" value="1"/>
    <!--最小引导-->
    <Flags index="ChannelingMinimum" value="1"/>
    <!--使用施法者半径范围-->
    <Flags index="RangeUseCasterRadius" value="1"/>
    <!--再次接近-->
    <Flags index="ReApproachable" value="1"/>
    <!--目标在视野范围内-->
    <Flags index="RequireTargetVision" value="1"/>
    <!--等级改变时更新充电-->
    <Flags index="UpdateChargesOnLevelChange" value="1"/>
    <!--等待耗尽-->
    <Flags index="WaitToSpend" value="1"/>
    <!--找到相同ID的Effect-->
    <Effect value="##id##"/>
    <!--效果距离0 - 500 -->
    <EffectRange value="0,500"/>
    <AINotifyEffect value="##id##"/>
    <!--接近阶段可以退还消耗-->
    <RefundArray index="Approach" value="1"/>
    <!--准备阶段可以退还消耗-->
    <RefundArray index="Prep" value="1"/>
    <!--施放阶段可以退还消耗-->
    <RefundArray index="Cast" value="1"/>
    <!--退还的消耗系数-->
    <RefundFraction>
        <!--水晶矿-->
        <Resource index="Minerals" value="-1"/>
        <!--气矿-->
        <Resource index="Vespene" value="-1"/>
        <!--人口-->
        <Resource index="Terrazine" value="-1"/>
        <!--自定义-->
        <Resource index="Custom" value="-1"/>
        <!--充能-->
        <Charge value="-1"/>
        <!--CD-->
        <Cooldown value="-1"/>
    </RefundFraction>
    <UseMarkerArray index="Approach" value="1"/>
    <UseMarkerArray index="Prep" value="1"/>
    <UseMarkerArray index="Cast" value="1"/>
    <UseMarkerArray index="Channel" value="1"/>
    <PauseableArray index="Approach" value="1"/>
    <PauseableArray index="Prep" value="1"/>
    <PauseableArray index="Cast" value="1"/>
    <PauseableArray index="Channel" value="1"/>
    <PauseableArray index="Finish" value="1"/>
    <PreemptableArray index="Approach" value="1"/>
    <PreemptableArray index="Prep" value="1"/>
    <PreemptableArray index="Channel" value="1"/>
    <DefaultError value="MustTargetUnit"/>
    <AcquirePriority value="3"/>
    <SetLastTarget value="Unknown"/>
</CAbilEffect>

 

AbilEffectInstant

立即生效的效果技能基类

属性

技术分享图片

XML定义

<CAbilEffectInstant default="1">
    <CmdButtonArray index="Execute">
        <Flags index="ShowInGlossary" value="1"/>
    </CmdButtonArray>
</CAbilEffectInstant>

人族机枪兵兴奋剂技能,首先需要花费10点生命值 
技术分享图片 
下图强化剂挂载的模组 
技术分享图片

使用兴奋剂的逻辑猜测 
1. 玩家点兴奋剂按钮 
2. 如果技能不处于冷却状态,则UseStimpack为真 
3. 启用Simpack技能 
4. 从挂载的效果模组中找到EffectID = ‘Simpack’的Effect

<CEffectApplyBehavior id="Stimpack">
    <EditorCategories value="Race:Terran"/>
</CEffectApplyBehavior>

CEffectApplyBehavior是增加行为的效果,括号内的文字是编辑器里取的别名与ID无关 
5. 执行兴奋剂的逻辑处理

技术分享图片 
6. 兴奋剂效果又挂载了一个行为模组 
7. 执行兴奋剂的行为逻辑 
技术分享图片 
CBehaviorBuff是Buff行为

AbilEffectTarget

目标效果技能基类,选择目标后触发效果

属性

技术分享图片 
FinishCommand:单位完成技能后使用的命令

XML定义

<CAbilEffectTarget default="1">
    <CmdButtonArray index="Execute">
        <Flags index="ShowInGlossary" value="1"/>
    </CmdButtonArray>
    <Flags index="BestUnit" value="1"/>
    <FollowRange value="5"/>
</CAbilEffectTarget>
 

 

实体类

机枪兵的搭档的医疗兵治疗技能

<CAbilEffectTarget id="MedivacHeal">
        <OrderArray index="0" DisplayType="Confirm" Model="Assets\UI\Cursors\WayPointAttack_Void\WayPointAttack_Void.m3"/>
    </CAbilEffectTarget>

技术分享图片 
貌似不是医疗兵,是医疗运输机- -

表示还没玩过星际2,哈哈哈,建了个图实验了下 
技术分享图片 
让机枪兵自相残杀,医疗运输机自动加血

技术分享图片 
治疗技能无CD

治疗逻辑猜测 
1.治疗技能是自动施放 
2.首先执行验证器 
healCasterMinEnergy:治疗运输机是否有足够的能量 
healSmartTargetFilters :筛选需要治疗的对象 
NotWrapingIn : 没有被缠绕 
3. 验证通过后施放技能 
4. 执行MedivacHeal效果

<CEffectCreateHealer id="MedivacHeal">
    <ValidatorArray value="IsBiological"/>
</CEffectCreateHealer>

技术分享图片 
发现没有挂载治疗相关的逻辑部分,然后看CEffectCreateHealer 
技术分享图片 
定义了消耗能量和修复比例,但是米有指定修复哪种属性,然后看默认值 
技术分享图片 
目标被治疗的活力类型为Life

 

 

Ability除了可以直接调用Effect,也可以直接调用Behavior

CAbilBehavior

属性

技术分享图片

BehaviorArray : 从施法者身上添加或移除技能 
CycleMode:假如当前技能等级有多个行为,这一设置会控制该技能循环行为的方案

XML定义

<CAbilBehavior default="1">
    <CmdButtonArray index="On">
        <Flags index="ShowInGlossary" value="1"/>
    </CmdButtonArray>
</CAbilBehavior>

 

人族地堡回收 
技术分享图片 
执行技能后,会出现一个进度条 
技术分享图片 
进度条完成后,地堡回播放爆炸动画,并且返还Cost

技能 SalvageBunker 
先看XML,属性设置比较少,但是多了一个parent字段。

<CAbilBehavior id="SalvageBunker" parent="Salvage">
    <Name value="Abil/Name/SalvageBunker"/>
</CAbilBehavior>

模组里子挂载了一个验证器,验证地堡里是否有货物 
技术分享图片 
当有机枪兵在地堡里,执行回收会收到Alert 
技术分享图片

parent字段在SalvageBunker技能里进行了调用,表示CmdOn的CButton调用’Salvage’的CmdOn 
技术分享图片

然后它的BehaviorArray里有个##id##,找到同ID的Behavior,是个Buff类的Behavior

行为 SalvageBunker

<CBehaviorBuff id="SalvageBunker" parent="Salvage">
    <Name value="Behavior/Name/SalvageBunker"/>
</CBehaviorBuff>
  • 1
  • 2
  • 3

再看它的详细属性设置 
技术分享图片

Duration:持续时间 
ExpireEffect:如果该行为持续了整个时间则会发生效果

意思是地堡回收行为持续了5秒没有被中断则会执行”SalvageBunker”的效果

再看SalvageBunker效果

效果 SalvageBunker

<CEffectIssueOrder id="SalvageBunker" parent="Salvage"/>

这个效果又执行了##id##Refund的技能即SalvageBunkerRefund技能 
技术分享图片

技能 SalvageBunkerRefund

<CAbilEffectInstant id="SalvageBunkerRefund">
    <OrderArray index="0" Model="Assets\UI\Cursors\WayPointAttack_Void\WayPointAttack_Void.m3"/>
</CAbilEffectInstant>

SalvageBunkerRefund 是个立即执行效果的技能

技术分享图片 
它执行的效果是SalvageDeath

CAbilEffectInstant有个属性是Cost,表示执行该效果所需要的花费, 
这里是回收,所以花费为负数。 
技术分享图片 
返还75的水晶矿。

效果 SalvageDeath

伤害效果

<CEffectDamage id="SalvageDeath">
    <EditorCategories value="Race:Terran"/>
    <ImpactLocation Value="SourceUnit"/>
    <!--执行该效果让目标直接死亡-->
    <Flags index="Kill" value="1"/>
    <!--角色死亡播放的动画类型-->
    <Death value="Salvage"/>
</CEffectDamage>

 

执行到这里,地堡已经爆炸了 
技术分享图片

地堡回收的逻辑顺序 
技术分享图片

 

 

【转】星际2技能系统分析

标签:分析   unit   www   use   意思   targe   article   理解   logic   

原文地址:http://www.cnblogs.com/colourstar/p/7879044.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!