상세 컨텐츠

본문 제목

Learning Unreal 4 언리얼 공부일지 - 애니메이션 몽타주가 뭐야

Computer Science/Unreal Engine

by 2022. 1. 23. 09:51

본문

반응형

애니메이션 몽타주? 그게 뭐지 유니티에서는 이런 단어를 들어본 적이 없는데... 일단 알아보자.

 

캐릭터 에셋에서 Mesh를 키면 위 창에서 에셋 생성버튼을 볼 수 있다. 에셋 생성 버튼 - 애님 몽타주를 클릭하면 몽타주를 생성할 수 있다.

 

 생성하면 이런 창이 나온다. 이게 뭐더냐.

저어기 중앙 하단쪽에 default라고 되어있는게 보이나. 클릭해서 이름을 바꿀 수 있다.

에셋 브라우저 창에서 아무런 애니메이션이나 꺼내서 왼쪽으로 옮겨보자.

 

위처럼 애니메이션을 여러개 드래그해서 여러 애니메이션을 연속으로 실행할 수 있다.

 

애니메이션을 하나 클릭한 뒤 디테일에서 시간 설정을 통해 애니메이션 플레이 타임을 조절할 수 있다. (실행 속도가 아니다 단지 실행 시간이다)

 

마우스 입력으로 애니메이션이 실행되게 해보자. 

입력은 이제 어느정도 익숙하다. 세팅 → 프로젝트 세팅 → 입력 → 액션 매핑 을 이용하자.

 

입력관련 코드를 Character cpp SetupPlayerInputComponent에 적는다. (익숙해질 때까지 계속해서 기록해보자)

PlayerInputComponent->BindAction(TEXT("Attack"), EInputEvent::IE_Pressed, this, &AMyCharacter::Attack);

Character 헤더에도 public에 Attack함수를 선언하고, cpp에 Attack함수를 정의한다.

 

애니메이션 관련 코드를 작성해보자.

UCLASS()
class UNREALINTRODUCTION_API UMyAnimInstance : public UAnimInstance
{
	GENERATED_BODY()

public:
	// 생성자 선언
	UMyAnimInstance();

	virtual void NativeUpdateAnimation(float DeltaSeconds) override;
	
    // attack 함수 실행시 몽타주를 실행하는 함수
	void PlayAttackMontage();
    
private:
	UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = Pawn, Meta = (AllowPrivateAccess = true))
	float Speed;

	UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = Pawn, Meta = (AllowPrivateAccess = true))
	bool IsFalling;

	UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = Pawn, Meta = (AllowPrivateAccess = true))
	UAnimMontage* AttackMontage; // 몽타주 변수 선언
};

AnimIntance 헤더에서 몽타주 변수와 실행함수, 생성자를 선언했다.

 

// 생성자 정의
UMyAnimInstance::UMyAnimInstance() 
{
	// 몽타주 변수 가져오기
	static ConstructorHelpers::FObjectFinder<UAnimMontage> AM(TEXT("AnimMontage'/Game/Animations/Greystone_Skeleton_Montage.Greystone_Skeleton_Montage'"));
	if (AM.Succeeded()) // 가져오기 성공시 
	{
		// 선언한 변수에 object 전달
		AttackMontage = AM.Object; 
	}
}


void UMyAnimInstance::PlayAttackMontage() // 몽타주 함수 정의
{
	if (!Montage_IsPlaying(AttackMontage)) // 몽타주가 실행중이 아닐경우
	{
		Montage_Play(AttackMontage, 1.f); // 몽타주 play
	}
}

AnimInstance cpp 파일에서는 생성자 정의 및 몽타주 변수를 가져오는 역할을 했다.

이걸 유니티로 비유하자면, class의 start life cycle함수에서 getcomponent로 component object를 변수에 전달한 것과 마찬가지로 보면 쉽다.

몽타주 함수도 정의하였다.

 

void AMyCharacter::Attack()
{
	// AnimInstance를 가져오기
	auto AnimInstance = Cast<UMyAnimInstance>(GetMesh()->GetAnimInstance()); 
	// UMyAnimInstance 헤더 추가 - #include "MyAnimInstance.h"
	if (AnimInstance) 
	{
		AnimInstance->PlayAttackMontage();
	}
}

Character cpp파일의 Attack함수를 정의하였다. AnimInstance를 가져오고 그 안의 몽타주 실행함수를 호출한다.

UMyAnimInstance로 변환하는데 경로에러가 난다면 헤더를 추가하자.

 

컴파일해보면 Anim 블루 프린트에 애님 프리뷰 에디터에서 Attack Montage가 생긴다. 내 블루프린트의 변수 목록에서도 AttackMontage를 확인할 수 있다. 코드가 잘 들어갔다.

그림을 보면 Default Slot이라는 노드가 중간에 껴있는데, 몽타주를 실행하기 위해서는 저게 들어가야한다고 한다. 정확한 이유는 잘 모르겠다.

반응형

관련글 더보기