728x90
이 글은 Inflearn - Rookiss : 언리얼 엔진4 입문 강의를 듣고 정리한 글입니다.

 

목차.

  1. 애니메이션 몽타주 개요
  2. 애니메이션 몽타주 생성
  3. 애니메이션 편집
  4. 프로젝트 세팅
  5. Character C++ 클래스 코드 추가
  6. 스테이트 머신 수정

 

애니메이션 몽타주 개요

애니메이션 몽타주를는 폭넓은 애니메이션 이펙트가 가능해지는 다목적 툴로써, 주로 코드를 통해서나 블루프린트 비주얼 스크립트 안에서 애니메이션 컨트롤을 노출시키는 데 관련되어 있습니다.

애니메이션의 지능형 루프, 로직 기반 애니메이션 전환, 루트 모션 핸들링, 기타 여러 가지 다양한 애니메이션 이펙트를 만드는 데도 사용 가능합니다.

 

애니메이션 몽타주를 사용하면 블루프린트 또는 C++ 코드를 통해 애니메이션 에셋을 바로 제어할 수 있습니다.

애니메이션 몽타주로 여러 애니메이션 시퀀스 를 하나의 에셋으로 합칠 수 있으며,

이를 섹션 으로 나누어 그 일부 또는 조합 재생이 가능합니다. 

몽타주 안에서 이벤트를 발생시켜 다양한 로컬 또는 리플리케이트 작업을 할 수 있는데, 예를 들면 사운드 큐나 파티클 이펙트 재생, 탄환 수와 같은 플레이어 값 변경, 심지어 네트워크 게임에서 루트 모션 리플리케이션도, 애니메이션 루트 모션이 켜진 경우 가능합니다.

 

출처:애니메이션 몽타주 개요 | 언리얼 엔진 문서 (unrealengine.com)

 

애니메이션 몽타주 개요

애니메이션 몽타주 애셋 작업 방식과 어디에 사용할 수 있는지에 대한 설명입니다.

docs.unrealengine.com

 

애니메이션 몽타주 생성

사용 중인 캐릭터 리소스의 스켈레탈 메시를 선택합니다.

 

캐릭터의 스켈레탈 메시 선택

다음 에셋 생성 버튼을 누르면 애님 몽타주 항목이 있습니다.

애님 몽타주를 클릭한 뒤 폴더를 지정해서 몽타주를 생성해 주면 됩니다.

 

Animations 폴더에 애님 몽타주 생성

 

애니메이션 편집

아래와 같은 창이 나오면 Default의 이름을 Attack으로 수정해 줍니다.

 

애니메이션 몽타주 창

 

그리고 저는 플레이어가 마우스 클릭하면 공격을 연계하도록 3개의 애니메이션을 추가해 줬습니다.

 

다양한 공격 애니메이션을 추가해 연계 구현

 

위에서 Attack_A_Fast를 클릭하면 디테일 창에서 해당 애니메이션의 끝 시간을 조절할 수 있습니다.

만약 끝시간을 길게 한다면 애니메이션 종료시간이 늘어나 다음 애니메이션을 더 늦게 실행하고,

반대로 짧게 한다면 애니메이션이 금방 종료되어 다음 애니메이션이 빠르게 실행됩니다.

 

저장을 하고 이제 마우스 입력을 받기 위해 프로젝트 세팅을 해주겠습니다.

 

프로젝트 세팅

점프와 마찬가지로 액션 매핑을 추가하고 이름은 Attack, 왼쪽 마우스 버튼으로 설정해 줬습니다.

 

프로젝트 세팅에서 왼쪽 마우스 클릭시 Attack이 실행되도록 매핑

 

Character C++ 클래스 코드 추가

 

MyCharacter.cpp

class TESTUNREALENGINE_API AMyCharacter : public ACharacter
{
...
public:
	void Attack();
....
};

 

MyCharacter.h

void AMyCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
{
	Super::SetupPlayerInputComponent(PlayerInputComponent);
....
	PlayerInputComponent->BindAction(TEXT("Attack"), EInputEvent::IE_Pressed, this, &AMyCharacter::Attack);
....
}
void AMyCharacter::Attack()
{
	auto AnimInstance = Cast<UMyAnimInstance>( GetMesh()->GetAnimInstance());

	if (AnimInstance)
	{
		AnimInstance->PlayAttackMontage();
	}
}

 

MyAnimInstance.h

class TESTUNREALENGINE_API UMyAnimInstance : public UAnimInstance
{
....
public:
	UMyAnimInstance();
	void PlayAttackMontage();
....
private:
....
	UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = Pawn, Meta = (AllowPrivateAccess = true))
	UAnimMontage* AttackMontage;
....
};

 

MyAnimInstance.cpp

.....
UMyAnimInstance::UMyAnimInstance()
{
	static ConstructorHelpers::FObjectFinder<UAnimMontage> AM(TEXT("AnimMontage'/Game/Animations/Greystone_Skeleton_Montage.Greystone_Skeleton_Montage'"));

	if (AM.Succeeded())
	{
		AttackMontage = AM.Object;
	}
}
void UMyAnimInstance::PlayAttackMontage()
{
	if (!Montage_IsPlaying(AttackMontage))
	{
		Montage_Play(AttackMontage, 1.f);
	}
}
....

 

MyCharacter 클래스에서 Attack을 BindAction을 해주고 입력 이벤트는 점프와 마찬가지로 눌렀을 때 발생하도록 해줍니다.

 

MyAnimInstance 클래스에서 생성자를 통해 UAnimMontage를 받아옵니다.

해당 경로는 아까 생성한 몽타주 애니메이션을 Ctrl+C 하고 string 입력 부분에 Ctrl+V를 하면 됩니다.

 

그리고 애니메이션을 실행시킬 함수 PlayAttackMontage를 추가하였고,

이미 몽타주 애니메이션이 작동 중이 아니라면 애니메이션을 Play 시켜 작동하도록 했습니다.

 

다시 MyCharacter 클래스로 돌아와 Attack함수를 만들어 MyAnimInstance를 캐스팅해야 하는데 이때 앞에 U를 붙여서 UMyAnimInstance를 캐스팅하고 AimInstance를 Get 해서 PlayAttackMontage를 실행시켜 줍니다.

 

뭔가 복잡해 보이지만 간단하게 표현하면

 

공겨 애니메이션의 작동 방식

 

마우스 왼쪽 클릭을 하면 AnimInstance에 PlayAttackMontage라는 함수를 호출하는 것이 다입니다.

 

스테이트 머신 수정

아직 이대로 실행하면 원하는 애니메이션은 나오지 않습니다.

 

애니메이션 블루프린트로 가서 Default 슬롯을 추가한 뒤,  Action-> Default 슬롯->최종 애니메이션으로 연결해줘야 합니다.

 

애니메이션 블루프린트에서 Default슬롯 추가하기
추가한 Default슬롯을 Action과 최종 애니메이션포즈 사이에 연결하기

 

이제 게임을 실행해서 왼쪽 마우스를 클릭하면 공격 애니메이션이 작동됩니다.

마우스를 빠르게 클릭하더라도 아까 이미 애니메이션 몽타주가 작동 중이 아닐 때만 애니메이션을 실행하도록 했기 때문에

부드럽게 연계가 잘 됩니다.

 

728x90

+ Recent posts