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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
要绘制斯坦福兔子模型,首先需要加载模型文件。可以使用Assimp库来加载模型文件。接下来,需要使用OpenGL来渲染模型。 下面是一个简单的OpenGL C代码片段,可以绘制斯坦福兔子模型: ```c #include <GL/gl.h> #include <GL/glut.h> #include <stdio.h> #include <stdlib.h> #include <math.h> #include <string.h> #include <assimp/cimport.h> #include <assimp/scene.h> #include <assimp/postprocess.h> void display() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 绘制斯坦福兔子模型 glPushMatrix(); glColor3f(1.0, 1.0, 1.0); glScalef(0.02, 0.02, 0.02); glTranslatef(-20.0, -10.0, 0.0); glRotatef(-90.0, 1.0, 0.0, 0.0); aiVector3D zero(0.0f, 0.0f, 0.0f); const aiScene* scene = aiImportFile("bunny.obj", aiProcessPreset_TargetRealtime_MaxQuality); aiMesh* mesh = scene->mMeshes[0]; glBegin(GL_TRIANGLES); for (GLuint i = 0; i < mesh->mNumFaces; i++) { const aiFace& face = mesh->mFaces[i]; for (GLuint j = 0; j < 3; j++) { aiVector3D pos = mesh->mVertices[face.mIndices[j]]; glVertex3f(pos.x, pos.y, pos.z); } } glEnd(); aiReleaseImport(scene); glPopMatrix(); glutSwapBuffers(); } void init() { glClearColor(0.0, 0.0, 0.0, 0.0); glEnable(GL_DEPTH_TEST); } int main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH); glutInitWindowSize(640, 480); glutCreateWindow("Stanford Bunny"); init(); glutDisplayFunc(display); glutMainLoop(); return 0; } ``` 其中,bunny.obj是斯坦福兔子模型的模型文件,需要放在代码所在目录或指定路径下。在display函数中,通过Assimp库加载模型文件,并使用OpenGL绘制模型。需要注意的是,需要设置适当的缩放、平移和旋转来调整模型的位置和大小。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Surkea

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值