반응형

기본적으로 Ct_Cmpt_Locomotion 에서 보내주는 이벤트 정보를 바인딩하여 Data Table에서 가장 적절한 모션을 찾아 뿌려주는 기능에 초점이 맞춰져 있습니다.

이벤트 내용은 이전 페이지를 참고하여 Ct_Cmpt_Locomotion 에서 보내주는 이벤트 디스패처 내용을 참고하여 반복적인 내용은 줄이도록 하겠습니다.

 

이벤트 그래프 처리 내역


  •  
    • Begin Play / Initialize Animation - Ct_Cmpt_Locomotion 에서 보내주는 이벤트 바인딩 및 변수 등록.
 

Advanced Locomotion Component (UE5) 가이드 - 3 ( Unarmed / CT_Cmpt_Locomotion )

CT_Cmpt_Locomotion 에서 하는일은?ALC(Advanced Locomotion Component) 에서 가장 중요한 기능을 하는 부분이 액터컴포넌트 블루프린트인 CT_Cmpt_Locomotion  입니다. 이 블루프린트에서 RPC( Remote Procedure Call(원격

tartist.tistory.com

 

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
 

Unreal 5 - IK Rig를 이용해 Foot IK 를 쉽게 만들어 보자.

언리얼에서는 오랜 세월 풋 IK를 최대한 직관적으로 만들어내고자 많은 노력을 해왔습니다. 언리얼 5에 도입된 IK Rig를 통해 Foot IK를 셋업 하게 돼 기존에는 제어하기 힘들었던 많은 부분들을 직

tartist.tistory.com

 

반응형

+ Recent posts