Unreal

16. Anim Instance

Kelvin의 게임개발 2024. 1. 23. 18:00
728x90
반응형

1. Anim Instance

 

AnimBP의 Parent Class는 UAnimInstance클래스이다 따라서 C++ Class로 생성하고 싶다면 부모클래스를 UAnimInstance로 지정해야 한다

 

AnimBP는 게임을 실행하지 않아도 계속해서 Tick이 돌고 있다 (에디터를 실행하지 않아도 AnimBP의 UpdateAnimation 노드는 계속 실행중이다)

 

이는 C++에서도 마찬가지이다 따라서 nullptr 참조에 굉장히 조심해야 한다 (바로 크래시 발생할 수 있음)

따라서 AnimInstance Class작업시에는 LiveCoding보다 Editor를 닫고 작업하는걸 추천한다

 

C++에서 다음 이벤트들은 UAnimInstance에서 override하여 사용할 수 있다

#include "CoreMinimal.h"
#include "Animation/AnimInstance.h"
#include "SlashAnimInstance.generated.h"

class STUDYUE_API USlashAnimInstance : public UAnimInstance
{
	GENERATED_BODY()
	
public:
	virtual void NativeInitializeAnimation() override;
	virtual void NativeUpdateAnimation(float DeltaTime) override;
};

보통 BP의 함수를 C++에서 구현할 때 Native가 붙는다

 

이전에 BP에 선언한 변수들도 전부 선언해준다

UPROPERTY(BlueprintReadOnly)
TObjectPtr<ASlashCharacter> SlashCharacter;

UPROPERTY(BlueprintReadOnly)
TObjectPtr<UCharacterMovementComponent> SlashCharacterMovement;

UPROPERTY(BlueprintReadOnly)
float GroundSpeed = 0.f;

CharacterMovementComponent는 UCharacterMovementComponent 타입이다

 

기본적으로 UE에서는 RawPointer는 사용하지 않는걸 추천한다 대신 TObjectPtr<>을 사용하자

 

 

이제 AnimInstance를 소유하고 있는 Pawn을 직접 만든 Character로 캐스팅하고 MovementComponent를 가져와야 한다

#include "Characters/SlashAnimInstance.h"
#include "Characters/SlashCharacter.h"
#include "GameFramework/CharacterMovementComponent.h"

void USlashAnimInstance::NativeInitializeAnimation()
{
	Super::NativeInitializeAnimation();

	SlashCharacter = Cast<ASlashCharacter>(TryGetPawnOwner());

	if (SlashCharacter)
	{
		SlashCharacterMovement = SlashCharacter->GetMovementComponent();
	}
}

TryGetPawnOwner() : 해당 AnimInstance를 소유한(ACharacter의 SkeletalMesh에 해당 AnimInstance가 들어가 있을때 그 Pawn을 의미) Pawn을 APawn*으로 반환한다

 

GetMovementComponent() : Character의 MovementComponent를 APawnMovementComponent*로 반환한다

 

 

#include "Kismet/KismetMathLibrary.h"

void USlashAnimInstance::NativeUpdateAnimation(float DeltaTime)
{
	Super::NativeUpdateAnimation(DeltaTime);

	if (SlashCharacterMovement)
	{
		//GroundSpeed = SlashCharacterMovement->Velocity.Length();
		//GroundSpeed = UKismetMathLibrary::VSizeXY(SlashCharacterMovement->Velocity);
	}
}

UCharacterMovementComponent의 Velocity로 Character의 속도 Vector를 Get할 수 있다

 

Length() : FVector의 길이를 float으로 반환한다

 

UKismetMathLibrary::VSizeXY() : FVector의 XY축만 고려한 길이를 float으로 반환한다

 

길이를 구할 벡터 (FVector)를 인자로 가진다

 

 

KismetMathLibrary는 StaticLibrary이고 내부의 함수들은 Static함수이기 때문에 어디서든 접근이 가능하며 객체가 존재할 필요가 없다 (Static함수는 해당 Static Class의 변수나 상태를 변경하지 않는다 오직 계산을 수행하고 값을 return한다)

 

 

함수가 어디에 있는지는 잘 모르겠을때는 BP에서 노드를 배치하고 더블클릭해서 찾으면 된다

 

 

이제 만든 UAnimInstance Class를 AnimBP의 Parent Class로 지정해야 한다 (깜빡하기 쉬우니 항상 신경쓰자)

 

Anim BP에서 노드로 설계했을때와 같은 결과를 확인할 수 있다

 

 

728x90
반응형

'Unreal' 카테고리의 다른 글

18. IK (Inverse Kinematics)  (109) 2024.01.27
17. Jump Animation  (125) 2024.01.24
15. Animation BP  (89) 2024.01.23
14. The Character Class & Hair And Eyebrows  (214) 2024.01.13
13. RotationMatrix  (173) 2024.01.12