(UE)角色动画的基本概念

角色动画是由动画资产+骨骼(Skeleton)+模型(Mesh)组成。动画资产控制骨骼的运动,骨骼再驱动模型。

在虚幻引擎中,角色使用动画的方式分为两种:动画资产和动画蓝图。动画资产是指包含具体骨骼运动数据的文件,包括动画序列、混合空间等;动画蓝图是指通过将多个动画资产按照指定规则进行播放的蓝图。

动画模式

本文仅介绍基本概念用于笔记,不详细描述操作流程。

动画资产

如果仅仅是要循环播放一个角色动画,如一个跳舞的NPC,则可以简单的将动画序列文件拖动到场景中即可,程序运行时会自动循环播放。

动画蓝图

对于玩家角色和AI角色需要实时更换不同的动画,动画蓝图通过自定义的变量和事件来管理这一复杂过程。

创建动画蓝图:内容浏览器->鼠标右键->动画->动画蓝图。选择要使用的骨骼和动画蓝图父类即可。

动画的控制过程一般是由一个或多个状态机来实现。

状态机中由各个动画资产代表的状态,并由自定义变量决定的规则来控制动画的播放流程。例如一个常见的角色运动状态机。

状态机
由IdleWalkRun状态到JumpStart状态变化的规则

设置完状态机后,程序就只需在修改这些动画蓝图中的自定义变量即可。

动画蓝图的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;
}

留下评论

您的电子邮箱地址不会被公开。 必填项已用 * 标注