斯坦福UE4 + C++课程学习记录 22:击败动画

目录

1. 判断存活

2. 添加击败动画

3. 禁用输入


        这一节内容将会为角色添加是否存活的判定,并为其添加击败后的倒地动画。

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默认值为真:

图22-1 设置倒地姿势

         然后,回到EventGraph事件图表中,添加调用IsAlive的功能,需要注意在设置bIsAlive变量时记得接入一条白色的控制线,否则这个布尔值是不会更新的。

图22-2 调用IsAlive

        编译保存后运行测试。受到敌人攻击后,当血量降到0时,角色就会触发倒地动画:

图22-3 运行测试

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中进行测试,会发现人物倒地后就不能再移动了。

猜你喜欢

转载自blog.csdn.net/surkea/article/details/127652005