6.1 애니메이션 시스템 설계
애니메이션 블루 프린트
언리얼 엔진에서는 애니메이션을 체계적으로 재생 하도록 애니메이션 블루 프린터 제공
애님 인스턴스, 애님 인스턴스로 구성
애님 인스턴스
스켈레탈 메시를 소유하는 폰의 정보를 애닝 그래프에 잠초 데이터 제공
블루 프린터, C++ 제작
애님 그래프
애님 인스턴스의 변수 값에 따라 애니메이션 설계 공간, 블루 프린트로만 제작
애님 인스턴스 예제
폰의 현재 속력을 애님 인스턴스에 저장
현재 속력으로 IDLE, RUN 애니메이션 실행
AnimInstance 클래스 부모로 하는 ABAnimInstance 생성
#include "ArenaBattle.h"
#include "Animation/AnimInstance.h"
#include "ABAnimInstance.generated.h"
/**
*
*/
UCLASS()
class ARENABATTLE_API UABAnimInstance : public UAnimInstance
{
GENERATED_BODY()
public:
UABAnimInstance();
private:
//블루 프린터에서 읽기만 가능, 에디터에서는 읽기 쓰기 가능
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = Pawn, Meta = (AllowPrivateAccess = true))
float CurrentPawnSpeed;
};
UABAnimInstance::UABAnimInstance()
{
CurrentPawnSpeed = 0.0f;
}
애니메이션 블루 프린트에서 C++로 생성한 애님 인스턴스 사용 방법
애니메이션 블루 프린트에서 ABAnimInstance를 부모 클래스로 변경 후 컴파일
블루 프린트 메뉴에서 상속된 변수 표시 버튼 활성화
위에서 만든 클래스의 CurrentPawnSpeed 변수를 애님 그래프에서 사용
CurrentPawnSpeed 를 활용해 애니메이션 연결 및 디버그
1. CurrentPawnSpeed >0 이상 일때 True, False 변화
2. Bool로 포즈를 블렌딩에 True, False 애니메이션 연결 및 최종 애니메이션 포즈 결정
3. 디버그 필터를 애님 프리뷰 에디터 윈도우로 변경
4. 애님 프리뷰 에디터에서 CurrentPawnSpeed 수정 하면 애니메이션을 디버그 가능
폰과 데이터 연동
현재 폰과 애님 인스턴스의 CurrentPawnSpeed 값을 동기화
애님 인스턴스의 Tick에서 속도 값 갱신(NativeUpdateAnimation 함수 사용)
NativeUpdateAnimation
언리얼 엔진의 Tick은 입력 시스템 ▷ 게임 로직 ▷ 애니메이션 시스템순으로 로직을 실행
NativeUpdateAnimation 사용하면 이미 계산이 끝난 속도 값을 갱신
//애닝 인스턴스에서 상속 받은 NativeUpdateAnimation 사용, Tick 보다 뒤에 실행
void UABAnimInstance::NativeUpdateAnimation(float DeltaSeconds)
{
Super::NativeUpdateAnimation(DeltaSeconds);
//현재 Pawn에 접근, 컨트롤러가 조종하는 Pawn 리턴
auto Pawn = TryGetPawnOwner();
if (::IsValid(Pawn))
{
//속도 값을 가지고 온다
CurrentPawnSpeed = Pawn->GetVelocity().Size();
}
}
캐릭터 클래스에서 속도 갱신
현재 모델의 애닝 인스턴스 객체를 *로 참조
미리 만들어둔 SetPawnSpeed 함수로 속도를 갱신
애닝 인스턴스 참조 해 속력 데이터 갱신 방법
#include "ABCharacter.h"
#include "ABAnimInstance.h"
void AABCharacter::Tick(float DeltaTime)
{
//....
UABAnimInstance* ABAnimInstance = Cast<UABAnimInstance>(GetMesh()->GetAnimInstance());
if (ABAnimInstance != nullptr)
{
ABAnimInstance->SetPawnSpeed(GetVelocity().Size());
}
}
#include "ArenaBattle.h"
#include "Animation/AnimInstance.h"
#include "ABAnimInstance.generated.h"
/**
*
*/
UCLASS()
class ARENABATTLE_API UABAnimInstance : public UAnimInstance
{
GENERATED_BODY()
public:
UABAnimInstance();
virtual void NativeUpdateAnimation(float DeltaSeconds) override;
void SetPawnSpeed(float NewPawnSpeed) { CurrentPawnSpeed = NewPawnSpeed;}
private:
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = Pawn, Meta = (AllowPrivateAccess = true))
float CurrentPawnSpeed;
};