角色动画是由动画资产+骨骼(Skeleton)+模型(Mesh)组成。动画资产控制骨骼的运动,骨骼再驱动模型。
在虚幻引擎中,角色使用动画的方式分为两种:动画资产和动画蓝图。动画资产是指包含具体骨骼运动数据的文件,包括动画序列、混合空间等;动画蓝图是指通过将多个动画资产按照指定规则进行播放的蓝图。
本文仅介绍基本概念用于笔记,不详细描述操作流程。
动画资产
如果仅仅是要循环播放一个角色动画,如一个跳舞的NPC,则可以简单的将动画序列文件拖动到场景中即可,程序运行时会自动循环播放。
动画蓝图
对于玩家角色和AI角色需要实时更换不同的动画,动画蓝图通过自定义的变量和事件来管理这一复杂过程。
创建动画蓝图:内容浏览器->鼠标右键->动画->动画蓝图。选择要使用的骨骼和动画蓝图父类即可。
动画的控制过程一般是由一个或多个状态机来实现。
状态机中由各个动画资产代表的状态,并由自定义变量决定的规则来控制动画的播放流程。例如一个常见的角色运动状态机。
设置完状态机后,程序就只需在修改这些动画蓝图中的自定义变量即可。
动画蓝图的C++示例
BlasterAnimInstance.h
#include "BlasterAnimInstance.h"
#include "BlacterCharacter.h"
#include "GameFramework/CharacterMovementComponent.h"
void UBlasterAnimInstance::NativeInitializeAnimation()
{
Super::NativeInitializeAnimation();
_blasterCharacter = Cast<ABlacterCharacter>(TryGetPawnOwner());
}
void UBlasterAnimInstance::NativeUpdateAnimation(float DeltaSeconds)
{
Super::NativeUpdateAnimation(DeltaSeconds);
if (!_blasterCharacter)
{
return;
}
// 获取速度
auto volocity = _blasterCharacter->GetVelocity();
//volocity.Z = 0; // 忽略垂直方向速度
_speed = volocity.Size();
_isFalling = _blasterCharacter->GetCharacterMovement()->IsFalling();
_isAccelerating = _blasterCharacter->GetCharacterMovement()->GetCurrentAcceleration().Size() > 0;
}
BlasterAnimInstance.cpp
#include "BlasterAnimInstance.h"
#include "BlacterCharacter.h"
#include "GameFramework/CharacterMovementComponent.h"
void UBlasterAnimInstance::NativeInitializeAnimation()
{
Super::NativeInitializeAnimation();
_blasterCharacter = Cast<ABlacterCharacter>(TryGetPawnOwner());
}
void UBlasterAnimInstance::NativeUpdateAnimation(float DeltaSeconds)
{
Super::NativeUpdateAnimation(DeltaSeconds);
if (!_blasterCharacter)
{
return;
}
// 获取速度
auto volocity = _blasterCharacter->GetVelocity();
//volocity.Z = 0; // 忽略垂直方向速度
_speed = volocity.Size();
_isFalling = _blasterCharacter->GetCharacterMovement()->IsFalling();
_isAccelerating = _blasterCharacter->GetCharacterMovement()->GetCurrentAcceleration().Size() > 0;
}