目录
这一节内容将会为角色添加是否存活的判定,并为其添加击败后的倒地动画。
1. 判断存活
在之前第13节实现血量条时,我们创建了一个AttributeComp来实现血量的相关逻辑,因此我们可在其中添加查询角色是否存在的公有const(因为这个函数只读)函数。
// SurAttributeComponent.h
UFUNCTION(BlueprintCallable)
bool IsAlive() const;
// SurAttributeComponent.cpp
bool USurAttributeComponent::IsAlive() const
{
return Health > 0.0f;
}
2. 添加击败动画
首先,在UE中使用快捷键Ctrl + P可以打开资产搜索,搜索Gideon_Anim找到角色的动画蓝图,打开后会发现里面已经带有十分完整的动画逻辑。
在左侧变量中添加一个判断角色是否存活的bool变量bIsAlive,在AnimGraph中最下方的Foot IK controls添加一个“按布尔姿势混合”节点,将bIsAlive接入Active Value,False姿势接入倒地姿势“播放Death_Back”,True姿势为原有姿势。随后,调整“播放Death_Back”的循环为关闭,bIsAlive默认值为真:
然后,回到EventGraph事件图表中,添加调用IsAlive的功能,需要注意在设置bIsAlive变量时记得接入一条白色的控制线,否则这个布尔值是不会更新的。
编译保存后运行测试。受到敌人攻击后,当血量降到0时,角色就会触发倒地动画:
3. 禁用输入
在角色倒地后,我们仍然可以操作角色移动和释放技能,相当于只是把角色的动画从站立变成了躺下而已。因此,在角色倒地后,我们需要禁用玩家的控制输入。在SurCharacter添加的核心代码如下:
void ASurCharacter::OnHealthChanged(AActor* InstigatorActor, USurAttributeComponent* OwningComp, float NewHealth, float Delta)
{
// 血量小于0且(包括治疗)血量变化也小于0
if (NewHealth <= 0 && Delta < 0) {
APlayerController* PC = Cast<APlayerController>(GetController());
DisableInput(PC);
}
}
然后利用PostInitializeComponents在组件初始化后完毕后进行动态绑定,就可以让这个事件生效。
void ASurCharacter::PostInitializeComponents()
{
Super::PostInitializeComponents();
AttributeComp->OnHealthChanged.AddDynamic(this, &ASurCharacter::OnHealthChanged);
}
此时再进入UE中进行测试,会发现人物倒地后就不能再移动了。