14-Character类的基本使用示例02 动画蓝图 UE4 C++

发布于:2022-10-13 ⋅ 阅读:(301) ⋅ 点赞:(0)

在上一节(13-Character类的基本使用示例)基础上,让角色能够在走或跑的时候播放对应的动画

效果: 

步骤:

1.由于先前的角色并没有包含动画资源

 所以换一个包含动画资源的角色:

 打开MyMan这个蓝图,将骨架网格体改为上图角色中的骨骼

下面开始加动画

2.首先创建一个动画蓝图:

 选择动画蓝图的父类和目标的骨架:

 

那么动画蓝图如何和MyMan这个蓝图结合起来?

3.在MyMan这个蓝图中,动画模式选为使用动画蓝图,动画类使用刚才创建的那个动画蓝图

 4.双击打开刚才创建的动画蓝图:

 你可以随意拖一个动画来让角色做这个动作:

 在实际运行的时候角色就会一直做这个动作:

但是角色不可能一直重复做一个动作,它应该根据玩家的操控来执行不同的动作 

5.所以应该添加的是一个状态机,而不是一个固定的动画资源,状态机可以实现不同状态间的转换,状态可以先简单理解为一个动画。

 6.接下来应该新建一个C++类,去继承动画实例:

 7.在MainAnimInstance.h中添加如下代码:

// Fill out your copyright notice in the Description page of Project Settings.

#pragma once

#include "CoreMinimal.h"
#include "Animation/AnimInstance.h"
#include "MainAnimInstance.generated.h"

/**
 * 
 */
UCLASS()
class CTESTPROJECT_API UMainAnimInstance : public UAnimInstance
{
	GENERATED_BODY()
public:
	UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = Movement)
	float MovementSpeed;  //移动速度

	UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = Movement)
	float IsJumping;  //是否跳起

	UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = Movement)
	class APawn* Pawn;  //角色的指针

	virtual void NativeInitializeAnimation() override;

	UFUNCTION(BlueprintCallable, Category = AnimationPropety)
	void UpdateAnimationProperties();  //更新动画的一些属性
	
};

在MainAnimInstance.cpp中添加如下代码:

// Fill out your copyright notice in the Description page of Project Settings.


#include "MainAnimInstance.h"
#include "GameFramework/PawnMovementComponent.h"

void UMainAnimInstance::NativeInitializeAnimation()
{
	if (!Pawn)
	{
		Pawn = TryGetPawnOwner();
	}
}

void UMainAnimInstance::UpdateAnimationProperties()
{
	if (!Pawn)
	{
		Pawn = TryGetPawnOwner();
	}

	if (Pawn)
	{
		FVector Speed = Pawn->GetVelocity();  //获取角色的速度
		FVector LateralSpeed = FVector(Speed.X, Speed.Y, 0);
		MovementSpeed = LateralSpeed.Size();  //用MovementSpeed的值来决定播放那个动画

		IsJumping = Pawn->GetMovementComponent()->IsFalling();

	}
}

生成解决方案

 8.在动画蓝图中,将父类改为我们刚创建的C++类

 9.此时就可以使用我们在C++中写的 UpdateAnimationProperties() 函数

 这样每一帧都会执行UpdateAnimationProperties(),从而实时获取角色的速度和是否在跳 这些变量的值。

10.新加一个混合空间1D

 

 11.双击打开这个混合空间

将坐标进行一些设置 :

 将站立的动画放到速度为0的点

 将滚动的动画放到速度为50的点

 将快速滚动的动画放到速度为100的点

 于是现在就完成了一个和速度相关的动画

12.进入动画蓝图中,使用这个动画

双击进入这个状态:

 添加一个状态:

 命名为 站立/走/跑

 双击继续进入:

 进入后将刚创建的混合动画1D拖入

 连线:

 速度是从C++中的MovementSpeed这个变量获取的,因此在动画蓝图中通过这个节点获取:

 编译、保存后运行

效果如文章开头所示。


网站公告

今日签到

点亮在社区的每一天
去签到