애니메이션 몽타주? 그게 뭐지 유니티에서는 이런 단어를 들어본 적이 없는데... 일단 알아보자.
캐릭터 에셋에서 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이라는 노드가 중간에 껴있는데, 몽타주를 실행하기 위해서는 저게 들어가야한다고 한다. 정확한 이유는 잘 모르겠다.
'개발 · 컴퓨터공학' 카테고리의 다른 글
Learning Unreal 4 언리얼 공부일지 - 애니메이션 노티파이 (0) | 2022.01.25 |
---|---|
Learning Unreal 4 언리얼 공부일지 - 언리얼의 delegate (0) | 2022.01.24 |
Learning Unreal 4 언리얼 공부일지 - 애니메이션 적용하기 (0) | 2022.01.22 |
Learning Unreal 4 언리얼 공부일지 - 블루프린트 알기 (0) | 2022.01.20 |
Learning Unreal 4 언리얼 공부일지 - 캐릭터 움직이기 (0) | 2022.01.19 |