翻译自Udemy的视频课程introduction-to-unreal-engine-4-ability-system
Dashing Ability冲刺技
1、创建DashAbility,在里面添加使人物向前冲刺的逻辑
01、创建蓝图GameplayAbility,里面的逻辑就是,先获取当前人物,转化为BP_BaseCharacter
获取CharacterMovement,保存成一个变量TargetMovement,并且获取到GroundFriction(地面摩擦力),保存为一个变量OriginalGroundFriction,在移动的过程中,希望首先把GroundFriction设置为0,这样子AddImpulse就会在地上也起作用
,通过AddImpulse,给人物施加一个向前的力,从而达到向前冲刺的效果
冲刺的过程中希望播放冲刺的动画,并且在动画播放完成的时候将地面的摩擦力设置回去
02、在BP_BaseCharacter中的EventGraph添加自定义事件,
当然别忘了在一开始的时候AquireAbility(迄今为止,共添加了三种技能)
03、添加用户输入Dash 绑定按键,然后再在BP_BasePlayerController中完善逻辑
2、 在冲刺的过程中希望能够禁用碰撞(普通闪现的实现)
和在MeleeAttack的时候希望能够使能碰撞正好相反,在MeleeAttack那一节用的是NotifyState的方式使能碰撞。这一节介绍另一种方法(与之前NotifyState的功能相同)。
01、在BP_BaseCharacter中,将Mesh的CollisionType设置为Nocollsiion,添加一个函数,SetCollisionToPawn,添加输入
02、在DashAbility中调用该函数设置Collision,其实更好一点是在AddImpulse之前调用Setcollision(要不然当两个人物离得比较近时,Dash不过去)
3、在执行Dash的过程中希望对路径上的敌人造成伤害(A2的技能)
01、在BP_BaseCharacter中对胶囊体添加Overlap事件(当处于Block时,会发生Hit事件,不会触发Overlap事件),在Overlap中发送一个GameplayEvent,通知GA_Dash处理伤害
02、在GA_Dash中添加伤害处理 ApplyGameEffectToTarget
4、希望在Dash的时候将沿途敌人击飞
击飞位移等都是通过addImpulse实现的,所以可以重构代码,在BP_BaseCharacter中添加PushCharacter函数,用于实现位移的逻辑
在GA_Dash中,对沿途敌人应用伤害后,对沿途敌人进行击飞
目前是有问题的,要在下一节用Debug的方式查出来问题所在
5、对Push进行Debug
01、添加DrawDebugArrow,标记AB线段
可以看到不止有一条线,说明进行了多次碰撞,导致了击飞敌人的效果不理想,同样的Dash也可以造成多次damage
但是我们只想对同一个物体只进行一次碰撞,可以在BP_BaseCharacter中添加一个容器来记录已经发生过一次Overlap的Actor列表,每次碰撞则检查是否已经存在于该列表中,如果不存在,就加入到列表中,如果存在,就不再发送gameplay event。最后再在每次的play montage and wait结束后清空这个Actor列表。(和视频思路相同,具体实现略有不同)
自定义函数CheckExistInArray
最后不忘记清空ColliderActorArray
最后对单个物体只有一条碰撞检测线,说明正常
6、添加击昏状态
击昏状态实际上是通过禁用Controller的输入来实现的
01、C++BaseCharacter中添加DisableInputControl和EnableInputControl函数,添加一个UFUNCTION()HitStun来实现击昏的行为,在HitStun中有一个定时器实现延时功能
void ABaseCharacter::HitStun(float StunDuration)
{
DisableInputControl();
//延时后执行EnableInputControl
GetWorldTimerManager().SetTimer(StunTimerHandle, this, &ABaseCharacter::EnableInputControl, StunDuration,false);
}
void ABaseCharacter::DisableInputControl()
{
APlayerController* PC = Cast<APlayerController>(GetController());
if (PC)
{
PC->DisableInput(PC);
}
AAIController* AIC = Cast<AAIController>(GetController());
if (AIC)
{
AIC->GetBrainComponent()->StopLogic("Dead");
}
}void ABaseCharacter::EnableInputControl()
{ //为了避免错误,先判断角色是否已经死亡
if (!bIsDeath) {
APlayerController* PC = Cast<APlayerController>(GetController());
if (PC)
{
PC->EnableInput(PC);
}
AAIController* AIC = Cast<AAIController>(GetController());
if (AIC)
{
AIC->GetBrainComponent()->RestartLogic();
}
}
}
02、对应的蓝图BP_BaseCharacter中在PushChracter(击飞)中添加HitStun的调用
03、注意修改GA_Dash,添加HitStun的时间
04、对MeleeAttack也可以添加HitStun(视频中是在GA_Melee中调用了PushCharacter),当然正常情况下StunDuration要小一些
7、注意为Dash技能添加Cost和Cooldown
设定Dash技能消耗Mana,冷却时常为6秒
重构代码并且完善UI的部分放到下一节