반응형
기본적으로 Ct_Cmpt_Locomotion 에서 보내주는 이벤트 정보를 바인딩하여 Data Table에서 가장 적절한 모션을 찾아 뿌려주는 기능에 초점이 맞춰져 있습니다.
이벤트 내용은 이전 페이지를 참고하여 Ct_Cmpt_Locomotion 에서 보내주는 이벤트 디스패처 내용을 참고하여 반복적인 내용은 줄이도록 하겠습니다.
이벤트 그래프 처리 내역
-
- Begin Play / Initialize Animation - Ct_Cmpt_Locomotion 에서 보내주는 이벤트 바인딩 및 변수 등록.
- 아래 페이지 참고.
- https://tartist.tistory.com/176
- Begin Play / Initialize Animation - Ct_Cmpt_Locomotion 에서 보내주는 이벤트 바인딩 및 변수 등록.
Event Blueprint Update Animation
- BlueprintThreadSafeUpdateAnimation 에서 처리된 변수들을 이용하여 참/거짓을 체크하고 그에 따라 Ground인지 아닌지등을 판단한다. BlueprintThreadSafeUpdateAnimation 내용은 아래에서 자세히 다룰 예정.
- Set Ground Distance - IsFalling 값을 얻어와 Ground Distance Float 값 지정.
- IsRunningIntoWall 값을 얻어와 벽에 닿은 상황인지 체크.
EventLocomotionGraph
- 워낙 많은 Ct_Cmpt_Locomotion의 이벤트 정보를 처리하는 곳이라 Unarmed에 필요한 정보들만 파란색으로 표시함과 동시에 스샷과 함께 자세히 설명하고 그 외에 정보들은 빨간색으로 설명 스킵함.
- Event_OnSprintChanged : 스프린트인지 Ct_Cmpt_Locomotion 에서 보내주는 이벤트 값을 등록. Unarmed에 필요함.
- Event_OnSetOverrideName : Unarmed 전용 모드에서는 필요없음
- Event_OnSetMovementType : Walk / Run 등의 정보와 Crouch 정보등을 Ct_Cmpt_Locomotion 이벤트에서 얻어오게 됨. 기능을 확장하여 State Changed Bool 값까지 만들어 사용하게 되고 Crouch 모션을 참조하는데 사용됨.
- Event_OnSetAnimset : 애님셋의 이름을 얻어와서 애님셋 데이터 테이블과 연결시켜주는 역할을 함. 애님셋 이름은 Unarmed로 고정시켜 사용해도 됨. 다만 기능 확장을 언젠가 할 수도 있기에 고정값으로 사용하는것은 비추. 여기서 사용하는 Animset Changed 변수역시 무기 변경등의 이슈를 체크하므로 현재 모드에서 사용되진 않음.
- Event_OnSetRotationMode : UnArmed 모드 자체가 Forward-facing 모드만 사용하므로 실질적으로 필요가 없다.
- Event_OnAccelerationChanged : 캐릭터의 움직임과 움직이는 방향을 체크하는 UnArmed 모드에서는 가장 중요한 이벤트 정보라 할 수 있다.
- Event_OnSetMount : Unaramed에서 사용되지 않는 이벤트..
- Event_OnRootYawOffsetStatus / Event_OnSetGlobalExtendedPose / Event_OnSetSkeletonType : 1인칭 시점에 필요한 이벤트.
- Event_OnMovementModeChanged : Air / Ground 를 확인하는 이벤트.
- Event_OnResetRootYawOffset : RootYawOffset을 리셋해줘야 새 RootYawSet을 얻기 위해 리셋해주는 이벤트.
애니메이션 그래프
Locomotion
- 실제적으로 UnArmed의 최종 모션 처리를 하는 가장 중요한 부분.
ExtendedPose는 무기를 들었을 때나 TurnInPlace등에서 사용되는 모션에 사용되는 추가 포즈 처리라 UnArmed 에서는 사용되지 않아서 없애도 문제가 발생하지 않음.
- LocomotionSM 스테이트 - IdleSource의 그라운드 처리 부분과 JumpSource의 Air 처리 부분으로 나뉜다.
- 그라운드 영역 처리 확인
- 크게 IdleSource / JogSource / PivotSources(Unarmed에서는 필요없음) 세 가지로 처리됨.
- 처리 순서
- Idle(Stop) 스테이트 -> IdleSource() 스테이트 에일리어스 -> Start 스테이트 -> Cycle 스테이트 -> JogSource 스테이트 에일리어스 -> Stop 스테이트 -> Idle 스테이트 순으로 처리하며 이동이 될 때와 멈출 때에 대한 분기로 각 스테이트별로 처리되게 된다.
- IdleSource(스테이트 에일리어스) : Idle/Stop 스테이트에서 이동이 시작될 때 에일리어스를 거쳐 분기를 타고 이동 스테이트로 넘어가게 됩니다.
- JogSource(스테이트 에일리어스) : 이동을 시작하거나 루프 될때에 캐릭터가 멈추게 될 때 해당 에일리어스를 거쳐 분기를 타고 스탑 혹은 Idle 스테이트로 가게 됩니다.
Idle 스테이트 분석 - 아래를 펼쳐 확인
더보기
- Unarmed에 필요한 부분만 분석하고 나머지는 추후에 분석하도록 하겠습니다. LayerBlend 부분은 AL(Advanced Locomotion)의 애디티브 모션처리 부분이라 무기를 쓰지 않는 이상 필요가 없는 부분이라 없어도 Unarmed만 플레이하는 데는 문제가 없습니다.
- IdleSM 스테이트 - TurnInPlace 부분도 Unarmed가 아닌 1인칭 시점에서 필요한 부분이라 없어도 Unarmed만 처리하는데는 문제가 없다.
- Idle -> Idle Break 조건 분석.
- Time Until Next Idle Break 시간을 계산하여 Idle Break 모션이 나와야 할 타이밍을 실시간으로 계산하여 0초에 도달했을 때 Break Idle 모션이 나오도록 처리하는 구조.
- Time Until Next Idle Break 시간은 Idle 스테이트의 SetupIdleState_Layer와 UpdateIdleState_Layer에서 계속해서 업데이트 시켜 주면서 시간을 계산해 줍니다.
- Set Up Idle State Layer
- Choose Idle Break Delay Time - Pawn의 위치에 달라지는 일부로직을 사용하여 모든 캐릭터가 동시에 유휴 휴식시간을 플레이하지 않고도 클라이언트 전반에 걸쳐 대략 일관된 동작을 갖도록 할 수 있습니다.
- Reset Idle Break Transition Logic - 위에서 얻은 Idel Break Delay Time을 이용해 IdleBreak 남은 시간을 리셋 시켜줌.
- Update Idle State Layer - Setup 에서 최종 처리된 로직을 받아 최종 모션을 찾아 뿌려준다. 여기서 뿌려주는 모션은 각 이벤트를 처리하는 부분에서 폭넓게 사용되는 Set Animation Datas 함수에서 처리된 모션을 Node와 Context로 받아 뿌려준게 된다.
- 위에서 Idle Break 조건이 맞게 되면 Idle Break 스테이트로 넘어오게 되며, 조건에 맞는 Idle Break 모션이 나오게 된다.
Start 스테이트 분석 - 아래를 펼쳐 확인
더보기
start 스테이트에 들어오는 조건
- Idle Source에서 Idle 스테이트와 Stop 스테이트 시에 진입 가능
- 조건 1 : PlayStartAnim(1), InWall(0), IsValidStart Anim(1) -> Start 모션으로 진입
- 조건 2 : PlayStartAnim(1), InWall(0), IsValidStart Anim(0) -> Cycle모션으로 진입
- IsValidStartAnim 함수 파악하기 - 가장 적절한 스타트 모션이 출력될 수 있도록 처리하는 영역. UnArmed에서 가장 중요한 처리가 스타트모션인 만큼 가장 중요한 함수라고 할 수 있다.
- 각 방향을 체크하여 Velocitydirection 값을 얻어온다.
- Is Valid Fwd Start 및 나머지 방향들을 처리하는 함수를 추적해 보자.
- Set Animation Datas의 Set Anim Valid 함수를 통해 방향에 대한 처리를 진행한다.
- Start / Stop / Pivot의 스트럭쳐 정보를 Struct Anim Cardinal파일을 이용해 얻어오게 되며 각 방향성에 대해 참/거짓을 처리하게 된다.
- Start State 내부 분석
- Unarmed에 필요한 부분만 확인하고 나머지는 넘어가자. LayerBlending은 무기모션에 필요하다.
- Sequece Evalutor : 시퀀스가 재생될 때의 조건을 만들어 줍니다. 지정된 애니메이션의 지정된 프레임을 구합니다.
- SetUpStartAnim_Layer : Get Start Anim 함수를 이용해 무엇이 가장 적절한지 파악하여 모션을 Set 해줌. 여기서 가장 중요한 변수는 LastVelocityDirection 이란 변수로 현재 캐릭터 각도를 얻어와 방향을 설정해 준다. LastVelocityDirection 값은 CT_Cmpt_Locomotion의 Event_OnAccelerationChanged 이벤트 에서 얻어오게 된다.
- Update Start Anim_Layer : 드디어 Animation Library 플러그인을 사용하는 공간이다. 시작 애니메이션이 이동한 거리가 Pawn 소유자가 이동한 거리와 일치하는지 확인하기 위해 거리 일치를 사용합니다. 이렇게 하면 애니메이션과 모션 모델을 동기화하여 발이 미끄러지는 것을 방지할 수 있습니다. 이는 시작 애니메이션의 재생 속도를 효과적으로 제어합니다. 애니메이션이 너무 느리거나 빠르게 재생되는 것을 방지하기 위해 유효 재생속도를 제한합니다. 유효 재생률이 고정된 경우에도 여전히 약간의 미끄러짐이 나타납니다. 이 문제를 해결하기 위해 나중에 Stride Warping을 사용하여 포즈를 조정하여 나머지 차이를 수정합니다.
- 가장 중요한 변수는 DisplacementSinceLastUpdate 라고 할 수 있는데, 이 변수가 월드 로케이션과 Owner 로케이션에서 뺀값을 Vector Length XY로 계산하여 Pawn의 이동 거리와 애니메이션의 이동거리를 보정하는데 사용해 준다.
- DisplacementSinceLastUpdate 값을 델타타임으로 나누면 현재 처리되고 있는 DisplacementSinceLastUpdate 값의 남은 시간을 계산하여 Cycle 모션의 InWall 상황에서 사용하게 된다.
- SetUpStartState : 스프린트 인지 아닌지 방향이 Forward로 들어왔는지 등을 체크하여 알려주는 스테이트 입니다.
- UpdateStartState : Root Yaw Offset Mode값을 설정하여 스켈레탈 메시의 방향과 애니메이션의 방향이 다를경우 강제로 로테이트를 시켜 주게 되는데, 그 값을 모션과 캐릭터의 움직임과 싱크를 맞춰 돌려주는 데 사용하게 되는데, 그 변수 값이 'Root Yaw Offset' 값이다.
- Root Yaw Offset 값을 처리하지 않게 되면.. 아래처럼 싱크가 어긋나게 Start 모션이 나오게 됩니다.
- Root Yaw Offset 값을 처리하게 되면.. 아래처럼 싱크가 맞춰져 Start 모션이 온전하게 나오게 됩니다.
Cycle 스테이트 - 아래를 펼쳐 분석
더보기
cycle 스테이트에서는 루프모션이 잘 처리하는데 초점이 맞춰져 있다. 해당 스테이트에도 불필요한 부분을 걷어내고 가이드를 진행해 가겠습니다.
- InWall 처리 - 벽에 닿을 때 이동 모션이 나오지 않도록
- 상위 Start 스테이트에서 처리된 DisplacementSinceLastUpdate 에서 구해온 DisplacementSpeed 값이 50이하일 경우와 InWall의 조건이 맞을 경우 모션이 서서히 멈추게 됩니다.
- Lean 처리 - Yaw Delta Speed를 이용해 Additive Lean Angle 값을 이용해 미리 Lean 처리 되어 있는 Blend Space 모션을 활용해 캐릭터가 기울어지는 것을 표현하였다.
- UpdateCycleAnim_Layer : 위에서 처리된 DisplacementSpeed 와 StrideWarpingCycleAlpha값들을 이용해 완전히 블렌딩 되는 상황이 어떤건지 처리하여 온전한 모션을 뿌리도록 처리 된다. 그리고 Sprint 상황도 체크한다.
Jump 분석 - 아래를 펼쳐 확인
더보기
점프의 시작 / 고점과 저점 / 떨어짐 / 착지 별로 스테이트가 돌아가게 됩니다.
- 각 스테이트별 모션은 'Set Animation Datas' 함수에서 데이타테이블에서 참조된 애님 애셋이 Structure로 할당받게 되고, 할당받은 모션을 변수로 저장하여 호출하여 사용합니다.
- Override나 Layerblend 부분은 무기 장착시 애디티브 모션을 쓰기 위해 필요한 곳이라 Unarmed 모션 에서는 없어도 작동하는데 문제 없음.
-
- 착지시에는 해당 스테이트에서 처리되지 않고, 마무리 포즈를 캐싱 받아 FullBodyAdditives에서 처리하게 됩니다. 착지 모션을 Local Space 모션으로 제작하여 이동 속도에 따라 몸에 반동을 주면서 뛰어나가도록 설계하기 위함입니다.
- 없어도 크게 어색하진 않은 이유는 ALC 자체가 모션 퀄이 높지 않아서 그런걸로보임.. 모션퀄이 좋으면 티가 많이 납니다.
- Recovery를 이용해 Local Space 모션을 사용했을 때 - 착지 충격을 적용하며 앞으로 나아간다.
- Recovery를 이용하지 않을 경우 - 아무런 충격없이 모션이 그냥 이어진다.
- 위에서 사용된 Local Space 애디티브의 Recovery 모션.
- 해당 에셋의 28프레임이 대상 프레임이 되어 해당 모션과 다른 프레임의 모든 모션은 Local Space 애디티브 모션이 되어 사용하게 된다.
최종 Output Pose 처리
- Unarmed에 필요한 부분은 위 이미지에 표시된 내역만 있으면 문제없이 플레이 된다.
- 1번 영역은 위에서 집중 해설된 내역으로 애님 스테이트를 처리하는 지역이다.
- 2번 영역은 1번을 캐싱 받아 점프 Additive 및 Slot 모션등을 처리하는 지역이다.
- 3번 영역은 위 Start 스테이트에서 얻어온 Root Yaw Offset 값을 이용해 캐릭터 root를 돌려준다.
- 추가적으로 Leg Ik를 처리하는 부분이 처리되 있는데, 해당 내용을 그대로 쓰기보다 Ik rig 방식을 사용하는 것을 추천한다.https://tartist.tistory.com/160
반응형
'Engine > Unreal - Locomotion' 카테고리의 다른 글
Advanced Locomotion Component 의 부족한 기능 추가 개발 (0) | 2024.06.04 |
---|---|
Advanced Locomotion Component (UE5) 가이드 - 5 ( Unarmed / Anim Curve / Anim Notify) (0) | 2024.05.28 |
Advanced Locomotion Component (UE5) 가이드 - 3 ( Unarmed / CT_Cmpt_Locomotion ) (0) | 2024.05.24 |
Advanced Locomotion Component (UE5) 가이드 - 2 ( Unarmed / 캐릭터 BP) (0) | 2024.05.23 |
Advanced Locomotion Component (UE5) 가이드 - 1 (구조 파악) (0) | 2024.05.23 |