UE4 루트 모션에 대한 메모

개요



UnrealEngine 애니메이션의 루트 모션에 대한 메모입니다.

업데이트 내역




날짜
내용


2020/10/23
URO시 문제에 대해 추가


환경



Windows10
Visual Studio 2017
UnrealEngine 4.22

참고



다음을 참고로 해 주셔서 감사합니다.

UnrealEngine:루트 모션

루트 모션 정보



애니메이션의 루트의 이동치이며, 이동하는 애니메이션의 이동한 값을 액터에 적용하기 위한 구조입니다.
UE에서는 스켈레톤 트리의 상단에 있는 본에서 얻는 것 같습니다. (Root라는 이름이 아니어도 좋다)

관련 소스



"Engine\Source\Runtime\Engine\Classes\GameFramework\RootMotionSource.h"
"Engine\Source\Runtime\Engine\Private\GameFramework\RootMotionSource.cpp"

루트 모션 처리



캐릭터에 적용하는 방법입니다.

적용 방법



애니메이션 시퀀스의 자산 세부 정보 -> RootMotion에서 EnableRootMotion을 선택합니다.



애니메이션 BP의 [고급] -> [RootMotion]에서 [Root Motion from Everthing] 또는 [Root Motion from Montage Only]를 선택합니다.


# [Root Motion from Montage Only]는 애니메이션 몽타주에서 재생할 때만 됩니다.

적용되지 않는 경우 문제 해결



애니메이션 데이터가 지원되지 않는 경우



루트 본이 움직이지 않으면 적용되지 않습니다.
상단 뼈를 지정하여 미리보기하면 오렌지 선이 나타납니다.


이 상태에서 [EnableRootMotion]을 체크하고 미리보기하면 이동이 내보내므로 미리보기에서 이동하지 않습니다. (오렌지 선이 없어집니다)


MovementComponent가 대응하지 않는 경우



기본적으로 이동 구성 요소에 CharacterMovementComponent를 사용하지 않으면 적용되지 않습니다.
이 경우 애니메이션 인스턴스에서 이동 값을 가져 와서 액터에 직접 적용하지 않습니다.

아래 코드 예:

AMyActor.cpp
void AMyActor::Tick(float DeltaTime){

    // アクターのアニメ―ションインスタンスクラスから移動値を取得
    FRootMotionMovementParams _Params = GetAnimInstance()->ConsumeExtractedRootMotion(1.0f);
    if( _Params.bHasRootMotion){
        // アクターのローカルトランスフォームへ適用
        AddActorLocalTransform(_Params.GetRootMotionTransform());
    }

}

sweep 처리가 필요한 경우는 AddActorLocalTransform 의 제 2 인수를 true 로 하면 OK입니다.

기타



URO(Update Rate Optimizations) 등을 사용하여 애니메이션 프레임을 날리는 처리를 했을 경우, 당연히 변환값이 의도한 것과 어긋나 옵니다. (날아간 프레임의 데이터를 얻을 수 없습니다)
이 경우 루트 모션을 사용하는 것은 피할 수밖에 없다고 생각됩니다.

요약



루트 모션이 잘 움직이지 않았기 때문에 원인을 메모 작성으로 남겼습니다.

좋은 웹페이지 즐겨찾기