二、目标是让人物模型在运动时可以根据不同的操作播放对应的动画,例如在使人物向前行进中播放走的动画(动画可以在网站中下载例如Mixamo)
1.创建一个C++类,继承Animinstance类
xxx.h
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "Animation/AnimInstance.h"
#include "BlasterAnimInstance.generated.h"
/**
*
*/
UCLASS()
class BLASTER_API UBlasterAnimInstance : public UAnimInstance
{
GENERATED_BODY()
public:
/* 初始化动画 */
virtual void NativeInitializeAnimation() override;
/* 更新动画 参数是帧数 */
virtual void NativeUpdateAnimation(float DeltaTime)override;
private:
UPROPERTY(BlueprintReadOnly, Category = Character, meta = (AllowPrivateAccess = "true"))/** 蓝图只读 类型是Character 允许私有访问 */
class ABlasterCharacter* BlasterCharacter;
UPROPERTY(BlueprintReadOnly, Category = Character, meta = (AllowPrivateAccess = "true"))/** 蓝图只读 类型是Character 允许私有访问 */
float Speed;
UPROPERTY(BlueprintReadOnly, Category = Character, meta = (AllowPrivateAccess = "true"))/** 蓝图只读 类型是Character 允许私有访问 */
bool bIsInAir;
UPROPERTY(BlueprintReadOnly, Category = Character, meta = (AllowPrivateAccess = "true"))/** 蓝图只读 类型是Character 允许私有访问 */
bool bIsAccelerating; /** 获得角色加速度 */
};
xxx.cpp
// Fill out your copyright notice in the Description page of Project Settings.
#include "BlasterAnimInstance.h"
#include "BlasterCharacter.h"
#include "GameFramework/CharacterMovementComponent.h"
void UBlasterAnimInstance::NativeInitializeAnimation()
{
Super::NativeInitializeAnimation();
BlasterCharacter = Cast<ABlasterCharacter>(TryGetPawnOwner());/** TryGetPawnOwner()获取有关角色(Pawn)的上下文信息 */
}
void UBlasterAnimInstance::NativeUpdateAnimation(float DeltaTime)
{
Super::NativeUpdateAnimation(DeltaTime);
/* 判断当前角色是否为空 为空获得当前角色当作第一帧 */
if (BlasterCharacter == nullptr)
{
BlasterCharacter = Cast<ABlasterCharacter>(TryGetPawnOwner());
}
if (BlasterCharacter == nullptr)return;
/* 只想获得平面上xy的速度的向量,将z方向的速度置为0 */
FVector Velocity = BlasterCharacter->GetVelocity();
Velocity.Z = 0.f;
/* 获得速度的向量 */
Speed = Velocity.Size();
bIsInAir = BlasterCharacter->GetCharacterMovement()->IsFalling(); /** IsFalling()判断是否在空中 GetCharacterMovement()获得人物移动 */
bIsAccelerating = BlasterCharacter->GetCharacterMovement()->GetCurrentAcceleration().Size() > 0.f ? true : false;
}
2.创建一个动画蓝图,在某个文件下单机右键选择动画->选择动画蓝图
3.选择特定骨架选择你想要添加的骨架,父类选择AnimInstance
4.双机打开动画蓝图,在上方选择类设置,在右侧栏的细节一栏中将父类选择成之前创建的AnimInstance基类的名字(UE的其他版本的类设置在不同的地方,可以上网查一下,中间的两个长方体敢打开时没有不用在意)
5.中间区域标签页不小心关闭后可以在窗口->我的蓝图->图标->单机右键选择打开图标即可
6.在AnimGraph的标签页中单机右键选择状态机中的state machine
7.双击进入 在entry节点点击后拖拽松开鼠标选择添加状态
8.添加结果如图 双击可以重新命名
9.节点run到start 双击箭头上的圆圈后进入界面tian
节点start到falling,在细节界面勾选基于状态中序列播放器的自动规则
节点falling到stop
节点stop到run
start节点双击选择对应的动画的start 其余节点相同
f
falling节点
stop节点
run节点
在和你动画蓝图所在文件夹中添加一个混合空间,选择对应的骨骼
10.打开混合空间蓝图在下方进度条上分别选择idel,walk,run的动画。拖拽到进度条上,并在资产详情界面中的Axis Settings中的水平坐标的名称和最大轴距设置成speed和350
11.在动画蓝图中的run节点中设置如图所示
12.编译保存
13.双击打开人物蓝图,在网格体中将动画的类设置成刚才创建的动画类