在上一节(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这个变量获取的,因此在动画蓝图中通过这个节点获取:
编译、保存后运行
效果如文章开头所示。