ACharacter::PlayAnimMontage의 반환값에 대하여

전지훈·2021년 5월 18일
0

Unreal

목록 보기
3/25
post-thumbnail

언리얼 엔진으로 개발을 하다보면 애니메이션 몽타주를 재생하는 것은 필수적인 부분이며 주로 Character에 구현 된 PlayAnimMontage를 활용 할 것이다.

/** Play Animation Montage on the character mesh. Returns the length of the animation montage in seconds, or 0.f if failed to play. **/
UFUNCTION(BlueprintCallable, Category=Animation)
virtual float PlayAnimMontage(class UAnimMontage* AnimMontage, float InPlayRate = 1.f, FName StartSectionName = NAME_None);

다만 이 함수의 반환 값은 MontageLength 즉, 애니메이션 몽타주의 원본 길이를 반환 한다. 함수를 사용할 때 InPlayRate를 매개변수로 받고, 애니메이션 몽타쥬의 RateScale이 설정되어 있어도 그것을 무시한채 원본 길이를 반환하는 것이다.

이것은 보통 애니메이션 몽타주의 실제 재생 길이(InPlayRate를, RateScale이 적용된)를 반환한다고 기대하는 보통적인 기대를 반하는 결과이다.

의아한 부분은 ACharacter::PlayAnimMontage의 내부에서 애니메이션 몽타주의 재생길이를 획득할 때 UAnimInstance::Montage_Play를 활용하는데 이 함수는 매개변수로 EMontagePlayReturnType 타입의 변수를 받아 애니메이션 몽타주의 실제 재생 길이와 원본 재생 길이 중 무엇을 반환 할 지 선택할 수 있게 해준다. 그런데 ACharacter::PlayAnimMontage은 EMontagePlayReturnType 타입의 매개변수를 받지 않고 재생 길이를 항상 원본 재생 길이로 반환하도록 구현되어 있다.

ACharacter::PlayAnimMontage은 시작 섹션을 선택할 수 있기 때문에 실제 재생 시간이 변칙적임에도 재생 길이를 반환하고, 그 재생 길이가 항상 원본 전체 길이라는 점은 이해가 되지 않는 부분이다.

그러므로 실제 재생 길이를 구하기 위해서는 다음과 같이 코드를 작성해야 한다.

const float Duration = PlayAnimMontage(AnimMontage, InPlayRate) / (InPlayRate * AnimMontage->RateScale)

혹은 Character에 구현 된 PlayAnimMonatge를 활용하지 않고, SkeletalMesh의 AnimInstance에 접근하여 Montage_Play를 직접적으로 호출하는 것도 일종의 방법이 될 수 있다고 생각된다.

profile
10%의 확신과 90%의 어.. 이게 왜 되지?

0개의 댓글