UE4 技能系统(GAS插件的使用) 05--Dashing Ability冲刺技

翻译自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的部分放到下一节

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值