반응형

ALC(Advanced Locomotion Component)의 오리지날은 Unarmed 에서만 3인칭 뷰를 지원하고, Weapon을 들면 1인칭뷰로 강제 전환되다보니 RPG 게임에 활용하는데에 있어 다소 아쉬움이 있습니다.

해당 페이지에서는 오리지날에서 제공하는 방식의 무기 교체 방식이 아닌 3rd 뷰에서 무기 교체가 되도록 설계된 것을 소개하여 RPG게임에 참고할 수 있도록 가이드 하도록 하겠습니다.

작동 방식 개요

  1. Equip 버튼을 누르면 무기를 꺼내면서 Battile Idle 자세를 취하며 배틀모드로 진입한다.
  2. 동일 버튼을 누르면 다시 무기를 집어넣으며 Idle 자세로 돌아가고 평화모드로 진입한다.
  3. 배틀모드에서 특정 이벤트가 없이 5초가 지나면 자동으로 Idle 자세로 돌아가고 평화모드로 진입한다.
  4. 이 설계상에서 세부적으로 컨트롤해야 할 부분이 무기를 든상태로 이동할 때 어떻게 처리하느냐 이다.
    1. 이동 중 배틀모드로 진입할 때 역시 블렌드 마스크 기능을 이용해 상체 모션만 나오도록 한다.
    2. 배틀모드에서 이동시 블렌드 마스크 기능을 십분 활용하여 무기든 손의 애니메이션에 제한값을 넣어준다.

 

 

반응형

반응형

어드벤스드 로코모션 컴포넌트에서 가장 중요한 플러그인인 'Animation Locomotion Library' 의 기능을 적극적으로 활용해서 Start 모션과 Stop 모션을 구현하고 있습니다.

위 기능을 사용하는 스테이트를 자세히 확인하기 위해서는 아래 포스팅의 'Start 스테이트' 와 'Stop 스테이트' 부분을 보면 더 자세히 확인할 수 있다.

https://tartist.tistory.com/177

 

Advanced Locomotion Component (UE5) 가이드 - 4 ( Unarmed / Anim Blueprint )

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

tartist.tistory.com

 

  • 아래는 Start 스테이트의 Update Start Anim Layer의 위 플러그인을 사용하여 캐릭터의 이동을 처리하는 부분이다.
    • Distance Curve 네임을 이용하여 캐릭터의 모션과 이동에 대한 싱크를 맞춰주게 됩니다.
    • 원본 애니메이션 에셋은 반드리 Root 모션으로 제작해야 하며, 옵션에서 Root모션 사용은 제거하고, 모션 에셋에 있는 Root 정보를 이용해 커브를 생성해 내게 된다.

  • 아래는 Process Turn Yaw Curve에서 Turn Yaw Curve Value를 구하는 부분입니다.
    • 애님 시퀀스 상에 있는 TurnYawWeight 와 RemainingTurnYaw 커브값을 이용하여 Turn Yaw Curve Value를 구하고 구해진 Turn Yaw Curve Value를 이용해 Root Yaw Offset 값을 구하고 그 값이 캐릭터를 회전시키는데 직접적으로 활용되게 됩니다.

 

그래서 결론적으로 캐릭터의 각방향의 Start 모션은 아래의 다섯개이며(뛰기만, 걷기포함하면 10개) 에서 각 모션별로 필요한 커브는 Distance  / RemainingTurnYaw / TurnYawWeight  세가지이다.(정면Start는 회전하지 않으므로  Distance 만)

  • Distance : 모션에 따른 이동 수치 (Root 모션으로 제작해야 얻어올 수 있다.)
  • RemainingTurnYaw : 회전 할 때 남은 회전 수치 (Root 모션으로 제작해야 얻어 올 수 있다.)
  • TurnYawWeight : 현재 회전하고 있는 수치 ( Root 모션으로 제작해야 얻어 올 수 있다. )

 

각각의 커브가 없을경우에 어떻게 작동하게 되는지 확인해 봅시다.

  • Distance 커브가 없을 때 - 이동과 모션에 따른 싱크를 맞추지 못하게 되면서 재생속도가 잘못출력된다.

  • RemainingTurnYaw 가 없을 때 - 남은 턴양이 계산되지 않아 잘못된 결과를 출력합니다.

  • TurnYawWeight 가 없을 때 - 현재의 턴양이 계산되지 않아 어색한 결과가 출력됩니다.

 

  • 세 커브가 모두 온전히 있을 때 아래처럼 온전한 결과를 얻을 수 있습니다.

 

  • 커브 추가 하는 방법
    • 모디파이어 추가->DistanceCurveModifier를실행해 주면distance커브가추가된다
    • 모디파이어 추가->TurnYawAnimModifier를실행해 주면 RemainingTurnYaw와 TurnYawWeight 커브가추가된다.

 

 

  • TurnYawAnimModifier 블루프린트 확인
    • ALC의 이 블루프린트가 RemainingTurnYaw 커브값과 TurnYawWeight 커브값을 얻도록 도와주는 모디파이어 블루프린트이다.

  • Populate Curve Keys 함수

반응형
반응형

기본적으로 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

 

반응형
반응형

CT_Cmpt_Locomotion 에서 하는일은?

ALC(Advanced Locomotion Component) 에서 가장 중요한 기능을 하는 부분이 액터컴포넌트 블루프린트인 CT_Cmpt_Locomotion  입니다. 이 블루프린트에서 RPC( Remote Procedure Call(원격 프로시저 호출) )까지 사용하면서 데이터 통신을 하도록 설계되어 있고, 모션의 최종 결정을 하는데 있어서 중요한 정보들을 결정 짓게 합니다. 따라서 여기서 결정되는 모든 정보는 현재 플레이 중 메인 Pawn의 캐릭터 BP / 애님 BP와도 모두 공유하게 됩니다.

RPC에서 설정된 변수들은 데이터 테이블에 이미 등록되어 있는 정보들을 캐릭터의 실제데이터로 만들어주는 역할을 하게 됩니다.

 

다만 CT_Cmpt_Locomotion에도 역시나 너무나 많은 기능들이 있기 때문에, Unarmed 모드 주요 기능 처리 부분만 먼저 다루도록 하겠습니다.

 

Begin Play

  • 현재 플레이에서 메인 Pawn 정보를 얻어와서 메인 Pawn의 Rotation Mode를 체크한다.
    • 체크 후 Forward-facing( Unarmed 모드) 모드 일 경우 캐릭터 무브먼트를 '무브먼트 방향으로 회전 조정' 을 사용한다. 3인칭 시점인 Velocity Mode를 사용하겠다는 뜻이다. 

 

Event Tick

  • 현재의 무브먼트 모드를 실시간으로 체크하여 캐싱해주고, Ground(Not Air) 상태일 때 Acceleration 값을 커스텀이벤트로  체크하고, Spint 기능도 커스텀 이벤트로 실시간으로 체크하게 된다.

  • Check Acceleraition -  Custom Event
    • Has Acceleration 변수값으로 현재 이동값이 들어갔는지 체크한다.
    • Has Acceleration값이 있을 경우 Last Direction을 체크하여 캐릭터의 방향도 체크한다. 여기서 결정된 값에 의해 AnimBP에서 캐릭터의 Start 모션을 결정하게 된다.

  • 여기서 결정되는 Has Acceleration은 서버에서 실행(Excutes On Server)되는 변수로서 서버에서 언제든 읽기 쓰기가 가능한 네트워크 리플리케이트 변수로 설정되어 지속적으로 모든 영역에서 체크되게 된다.

  • Call Event On 기능을 쓰기 위해서는 이벤트 디스패처로 등록해서 사용해야 한다.

  • Anim Graph에서 위 이벤트 정보를 받아서 사용하는 방법
    • 메인 Pawn으 애님 BP의 Begin Play 이벤트에서 Initialization 함수에서 Ct_Cmpt_Locomotion를 Get Component by Class로 변수를 등록하고 이벤트를 받아서 바인딩하여 사용합니다.

 

  • Update Sprinting Value - Custom Event
    • 왼쪽 Shift를 길게 누르면 스프린트 기능이 활성화 되게 되는데, 그것을 체크하여 스프린트인지 아닌지를 모든 영역에 알려주는 역할을 하고 Set Movement Config에 스프린트 설정값으로 무브먼트 속도를 맞추게 됩니다.
    • 스프린트  기능이라 별로 기능이 없을 거 같지만, Current Movement Config의 값을 변경하게 되면서 그에 따른 Data테이블의 애님셋 정보를 읽어와서 회전량, 마찰값등을 다시 설정하게 되므로 꾀 많은 로직이 일어나게 되는 부분이다.

  • Is Sprinting 변수를 Replicate로 설정
    • Get Is Sprint 함수가 스프린트값을 보조해 줘서 스프린트가 True 일경우에 대한 Velocity Direction값을 스프린트값에 맞도록 딜레이 시켜주는 역할을 한다. 해당 기능은 조작감 이슈가 있어 호불호가 갈리는 기능이라 딜레이를 없애서 사용하는 경우도 많다.

  • Sprint Value 값 서버로 전송
    • 그러기 위해 이벤트 디스패처로 등록하여 다른 곳에서 손 쉽게 쓸수 있도록 한다.

  • 위 정보를 토대로 'BP_Character' 캐릭터 블루프린트에서 CT_Cmpt_Locomotion의 이벤트의 정보를 실시간으로 쓸 수 있게 된다.

  • Anim BP에서 바인드하여 Sprint 정보 사용
    • Ct_Cmpt_Locomotion에서 등록된 Replicate형 변수들은 다 동일하게 호출하여 사용합니다.
    • IsSprint 변수값을 이용해 Anim Set Structure에서 애님셋 데이터 값을 불러와 Sprint 상태 Value값을 Set Animation Datas 함수에서 사용하게 됩니다.

 

Unarmed 모드에서 사용하는 추가적인 이벤트 디스패처 값.

  • Evnet_OnSetMovementType
    • Enum파일인 Enum Movement Type 을 사용하여  무브먼트 상태값을 공유하게 됩니다.

  • Anim Graph에서 사용
    • Ct_Cmpt_Locomotion 이벤트를 바인드하여 해당 상태값을 변수로 등록하여 사용하게 됩니다.
    • Set Animation Datas 에서 LS AnimSet 파일을 호출하여 LS Movement Type으로 사용하게 됩니다.

 

  • Event_OnSetAnimset
    • 등록된 이벤트 디스패처를 이용하여 Anim Set Name에 따른 Anim Set Data table 정보를 얻어오는데 사용되게 됩니다.

  • Anim BP에서 사용
    • 위 이벤트 디스패처들과 동일하게 Bind 하여 사용.

 

Ct_Cmpt_Locomotion에서 Unarmed 모드를 작동하는데 필요한 이벤트는 위 정보만 있으면 됩니다. 나머지 이벤트 디스패처 내용들은 Unarmed가 아닌 다른 무기와 다른 로테이션 모드등에서 필요한 정보들이라 Unarmed에서는 필요하지 않은 정보들입니다. 다음 포스팅에서는 Anim Blueprint 작동 내용에 대해서 가이드해 드리도록 하겠습니다.

반응형
반응형

ALC(Advanced Locomotion Component)같은 경우 서로 얽혀 있는 로직이 너무 많다 보니 트리플 A에서 사용될 RPG 로코모션 기능만 확인하는데 어려움이 있을수 있어 Unarmed의 Velocity Direction기능만 추려서 해당 기능만 집중적으로 파악해 보도록 하겠습니다.

  • Unarmed 로코모션 무브먼트만 집중 파악하기 위해 걷어 낼 기능.
    • 무기교체기능
    • HUD 
    • 데미지 기능
    • 메시 교체 기능
    • AI 기능
    • 위 기능들 제거 후 새 프로젝트로 이주
      • 딱 필요한 파일들만 이주되어 확인이 간편해 짐.
  • 위 기능들을 제거하기 위해 아래 컴포넌트를 제거해 줍니다.
    • 무작정 지우면 컴파일 에러가 발생하게 되므로 레퍼런스 찾기 기능을 이용해 사용되고 있는 부분들을 찾아서 손수 제거해주고 그럼에도 불구하고 컴파일 에러가 발생하는 부분들을 찾아서 수정해 코드를 수정해 니다.

  • 불필요한 함수 및 이벤트 제거
    • 캐릭터의 로코모션 구조만 확인할 거라 데미지나 죽음등의 이벤트는 굳이 필요없음.

 

  • AI 기능도 제거 - NPC와 만날 필요가 없음.

 

  • 스켈레탈 메시 구조와 애님블루프린트 단순화
    • 스켈레탈 메시와 애님 BP도 굳이 Child를 써서 복잡성을 늘릴필요가 없어 메인 스켈레탈로 쓰이는 Core 메시를 사용하고 애님 BP도 메인으로 사용하여 복잡성을 낮춘다.
  • 복잡성을 더 줄이기 위해 UE4와 UE5 캐릭터 선택도 없애도록 합니다.
    • Enum_SkeletonType 파일을 열어 UE5 캐릭터만 남기고 나머지는 없애줍니다.
    • 이상태로 플레이를 하게 되면 많은 컴파일 오류가 뜨게 되며 컴파일 오류가 난 BP 파일들을 열어 UE4 분기가 되는 부분을 단순화 시켜주도록 합니다.
      • 오류가 있는 블루프린트 모두 열기를 실행하고, UE4 부분을 제거시켜줍니다. 특히 Anim BP의 Blend Poses에서 에러가 발생하게 되면 노드를 새로 연결해줘야 하므로 이 부분을 유념합시다.

블렌드 포즈는 새로연결해줘야만 컴파일 에러가 사라짐.
메인 애님 BP에서도 스켈레톤 고르는 부분에 UE5 스켈레톤으로 고정시켜줍니다.

 

  • 위 구조들을 제거하고 Play를 해보면 Unarmed 로코모션 기능만 남고 나머지는 모두 제거 된 것을 아래 영상을 통해 확인할 수 있습니다.

 

 

 

이주 진행

  • 위 절차가 마무리 되면 이제 스마트 버전의 이주준비가 마무리되었습니다. 새 프로젝트로 이주 하여 프로젝트를 깔끔하게 만들어 봅시다.

 

  • 먼저 'ALC_Study' 라는 이름의 비어있는 새 프로젝트를 만든다.

  • 새 프로젝트에서 'Animation Locomotion Library' 플러그인을 활성화 시켜주고 재시작을 진행해 줍니다.
    • 플로그인이 없는데, 플러그인을 사용하는 프로젝트를 이주 시키면 크래쉬등 문제가 발생할 수 있습니다.
  • 오리지널 프로젝트에서 아래 메인 게임모드 파일을 선택하여 방금 만든 프로젝트로 이주를 시켜 줍니다.
    • 이주 시킬 때는 이주 대상 프로젝트를 닫아놓고 하셔야 문제가 발생하지 않으므로 꼭 프로젝트를 닫고 이주를 진행해 줍니다.

  • 키 맵핑을 맞춰 주지 않으면 컴파일 에러가 발생하므로 Project Settings 의 입력 부분을 원본 프로젝트와 일치 시켜주도록 합니다. 언리얼 5.3 이후부터는 입력키 Export 기능이 사라져 일일이 넣어줘야 하는 번거러움이 있습니다. 작업 간편화를 위해 필요한 입력 맵핑만 가져오도록 합니다.

  • 여기까지 진행하시고 게임모드를 새로 이주해온 게임모드로 게임을 실행하시면 캐릭터가 정상적으로 잘 움직이는 것을 확인할 수 있습니다.

 

  • 이주 후 정상작동 확인.
    • 이주 후 폴더 구조 - 원본 프로젝트보다 훨씬 구조가 단순화 된 것을 확인할 수 있습니다.
    • 스켈레탈 메시 / 데이터 Table 등이 단순화 되어 복잡한 파일과 구조가 모두 제거되었습니다.
    • 혹시 컴파일 에러가 발생하거나 크래쉬가 발생한다면 위에서 부터 다시 한번 복기하며 새로 진행해봅시다. 한가지라도 순서가 바뀌거나 빠지면 크래쉬가 발생할 수 있습니다.

 

이주 한 새 프로젝트에서 아래 영상처럼 나오는지 확인.

 

 

반응형
반응형

1. 준비물

    • 엔진 : 언리얼 5(5.0~5.4)
    • 마켓플레이스 : Advanced Locomotion Component
      • 베이스가 되는 에셋은 'Lyra Starter Game' 이다.

  • 유료 에셋으로서 135,310원을 결제해야 사용할 수 있습니다.
  • 조금 비싼감이 있긴 하지만, 최근 나온 로코모션 시스템 라이브러리 중에서는 가장 잘 구현된 시스템이라 투자할 만한 가치가 있다고 생각합니다.

https://www.unrealengine.com/marketplace/en-US/product/advanced-locomotion-component

 

2. 폴더와 시스템 구성 분석.

프로젝트를 생성하고 나면 아래와 같이 폴더가 구성되어 있습니다.

  • Assets :
    1. CT_Components : 코어한 로직을 담당하는 BP/ABP파일
    2. EchoCotent : 이펙트, 사운드등의 환경 파일
    3. LyraContent : 언리얼5 라이라시스템을 이요함
    4. ParagonGreyStone : 
    5. ParagonSparrow : 
  • Blueprints
    1. Abilities : 
    2. AI : 
    3. Characters:
    4. DamateTypes:
    5. Datas:
    6. Demo : 
    7. Effect : 
    8. Game : 
    9. Notifies :
    10. UI : 
    11. Weapons :
  • Characters :
  • Maps :

 

3. Unarmed 의 3인칭 시점 뷰(Velocity Direction)와 무기를 들었을 때는 1인칭 시점 뷰(Looking Direction)로 플레이 된다.

  • Unarmed : 어드벤스드 로코모션의 Velocity Direction Mode와 동일한 모드로서 흔히 말하는 3인칭 시점을 말하며 주로 RPG 게임등에 사용되는 뷰입니다.

 

 

  • Weapon : 어드벤스드 로코모션의 Looking Ditection Mode와 동일한 모드로 1인칭 시점을 말하며 FPS 게임이나 1인칭 어드벤쳐 게임에 사용되는 뷰입니다.

 

 

 

4. 블루프린트 구조 파악하기.

예전 AL(Advanced Locomotion_UE4)은 캐릭터 블루프린트와 원본BP를 부모로 둔 Child 블루프린트로 로직이 이루어졌는데, ALC(Advanced Locomotion Compoenet_UE5)는 CT_Cmpt_Locomotion 라는 액터 컴포넌트형 블루프린트가 메인 두뇌이자 가교역할을 하며 캐릭 블루프린트와 Anim 블루프린트를 연결하는 역할을 하도록 설계되어 있다.

위 파일을 기준으로 레퍼런스 뷰어로 구조를 파악해 보면 'CT_Cmpt_Locomotion'이 모든 블루프린트와 Struct들과 연결시켜주는 역할을 하고 있음을 확인할 수 있다.

 

메인 캐릭터 블루프린트는 'BP_Character'이며 파일을 열어 구조를 파악해 보면 'CT_Cmpt_Locomotion' 을 로드하여 CT_Cmpt_Locomotion에 선언된 이벤트 디스패처들을 로드하여 Data Table과 연동하여 작동하게 됩니다.

 

5. 반드시 활성화 시켜야 할 'Plug In' : Animation Locomotion Library

메인으로 사용되는 Anim Instance의 애님 BP을 열어서 Stop 스테이트나 Start 스테이트를 열어서 확인해 보면 'Distance Match to Target'라는 노드를 많이 사용하게 되는데, 해당 노드는 캐릭터의 이동에 따른 스텝과 모션의 싱크를 맞춰주는 기능입니다. 해당 기능을 사용하기 위해서는 플러그인에서 Animation Locomotion Library를 활성화시켜야만 사용이 가능한 노드입니다.

더 자세한 설명은 다음 가이드부터 각 기능별 상세하게 다루도록 하겠습니다.

기존 Advanced Locomotion 은 기능별로 블루프린트가 분리되어 있어 각각 가이드가 가능했으나 Advanced Locomotion Component는 이벤트 디스패처와 Data Table을 연계해서 사용하다보니 모든 에셋들이 서로 깊게 맞물려 있어 기능별로 연계된 애셋들을 함께 소개하며 가이드를 진행하도록 하겠습니다.

반응형
반응형

https://tartist.tistory.com/154

 

AAA Locomotion

 

tartist.tistory.com

기존 회사에서 제작한 로코모션으로서 공개가 어렵습니다. 개인적으로 문의 주시면 공유해 드리겠습니다.

 

개인적으로 제작한 Advanced Locomotion + Custom 로코모션의 시스템 구성

  • 기본적인 무브먼트와 카메라 시스템은 Advanced Locomotion V4 시스템을 그대로 차용
    • 카메라 시스템에서 캐릭터의 움직임에 따라 한쪽으로 치우쳐지는 기능도 추가
  • 스켈레탈 메시 변경 및 모션은 리타겟을 사용하거나 새로 제작하여 사용.
  • 캐릭터 회전 및 멈추는 상황에서는 루트모션을 도입하여 좀더 퀄리티 높은 모션이 나올 수 있도록 기능 추가.
    • https://tartist.tistory.com/169 에서 소개된 PlayTransition 커스텀 이벤트 방식이 아닌 루트모션이 나오도록 기능을 강화했습니다.

 

반응형
반응형

어드벤스드 로코모션의 가장 큰 특징 중 하나가 언리얼에서 제공하는 기본 카메라가 아닌 유저가 하나부터 열까지 모두 컨트롤 가능한 커스텀 카메라 기능을 사용하고 있다는 것이다.

어드벤스드로코모션 카메라 시스템의 의 장단점

  • 장점
    • 모든 상황에 카메라의 Offset과 Fov등을 원하는데로 변경할 수 있다.
    • 엔진 작업이 서툰 아트작업자들이 게임 카메라 작업을 하는 데 용이하다.
    • 트리플 A의 꽃인 카메라의 아웃풋을 제어할 수 있다.
  • 단점
    • 모두 제어를 해야 하다보니 손이 많이 간다.
    • 아트 작업자들이 최종 카메라를 제어하다보니 디버깅이 힘들 수 있다.
    • 인디게임을 개발한다면 제어해야 하는 코스트가 너무 크다.

 

어드벤스드 로코모션의 카메라 시스템 작동 원리 파악.

게임모드의 컨트롤러에 사용되는 ALS_Player_Controller에서 ALS_PlayerCameraManger 블루프린트를 형변환하여 호출한 뒤 On Poses 이벤트를 활용해 플레이어 카메라에 오버라이드 시켜 주게 되면 메인 Pawn 카메라로서 역할을 감당하게 됩니다.

 

ALS_Player_Controller의 OnPossess 이벤트 처리.

 

ALS_PlayerCameraManger 의 OnPoses 함수.

 

ALS_PlayerCameraManger 분석.

  • 기본 구조 - 스켈레탈 메시로 만들어진 카메라 메시와 이미 제작되어 있는 애님 블루프린트가 등록되어 있습니다.

  • BlueprintUpdateCamera
    • 메인 Pawn의 액터 Tag에 'ALS_Character'라는 이름을 가지고 있을 경우 발동되도록 제작되어 있음. 다른 일반적인 Pawn일 경우는 언리얼에서 제공하는 기본 게임 캐릭터 카메라가 호출됩니다.

 

CustomCameraBehavior 아래 펼쳐서 확인

더보기

 

카메라 Fov, Rotation, Loacation을 제어하여 애님블루프린트에서 카메라 Offset를 컨트롤할 수 있는 변수를 제공하도록 하고, 디버그 오브젝트들을 활성화시켜 주는 역할도 하게 됩니다.

  • Step 1 : 캐릭터BP와 연계된 BPI 인터페이스에 등록된 Pivot과 카메라 타겟 위치와 FOV 값등을 불러와 변수로 설정해 준다.

 

  • Step 2 : 부드러운 카메라 회전을 위해 회전 제어 및 보간을 사용합니다.

AnimBP에서 애님 곡선값을 가져와 맞춤 카메라 동작 계산의 매개변수로 사용합니다.

 

  • Step 3 : 스무드 된 피벗 대상(주황색 구)을 계산합니다. 3P  피벗 대상(녹색 구)을 가져오고 최대 제어를 위해 독립적 지연을 사용하여 보간합니다. 디버그용 볼에 사용될 위치를 계산합니다.

 

  • Step4 : 피벗 위치를 계산합니다(Blue Sphere). Smoothed Pivot Target을 가져와 추가 카메라 제어를 위해 로컬 오프셋을 적용합니다.

플레이어 카메라 동작 AnimBP에서 애님 곡선 값을 가져와 맞춤 카메라 동작 계산의 매개변수로 사용

 

  • Step5 : 대상 카메라 위치를 계산합니다. 피벗 위치를 가져오고 카메라 상대 오프셋을 적용합니다. 이미 등록되어 있는Curve Name을 활용하여 제어합니다.

 

  • Step 6 : 교정된 오프셋을 적용하기 위해 카메라와 캐릭터 사이의 개체를 추적합니다. 추적 원점은 카메라 인터페이스를 통해 캐릭터 BP내에서 설정됩니다. 일반 스프링 암과 같은 기능을 하지만, 피벗에 관계없이 다른 추적 원점을 허용할 수 있습니다.

 

  • Step 7 : 위에서 얻어 온 정보들을 토대로 디버그 쉐잎들을 디스플레이 시켜줍니다.

 

  • Step 8 : 위에서 얻어 온 정보들을 토대로 Weight_FirstPerson의 커브가 들어올 경우 위치를 보간합니다.

 

 

 

카메라 애님 그래프(ALS_PlayerCameraBehavior)에 대한 분석과 사용법.

 

  • Blueprint Update Animation 이벤트 처리
    • 기존 캐릭터BP에서 정의되어있던 BPI 인터페이스를 Movement State 등의 정보들을 얻어와 변수로 지정하는 역할을 한다. 모든 움직임에 대해 카메라를 제어하기 위해 사전에 정의하는 것.

 

  • Anim Graph 처리 - Velocity 모드냐 Looking 모드냐에 따라 카메라를 각각 제어할 수 있도록 분리되어 있는 형태.

한 형태만 분석하면 나머지 형태들을 파악하는데 어려움이 없기 때문에 Velocity Direction에 대한 정의만 분석해 보도록 하자.

  • Gait 의 블렌드 포즈에 의해 Running인지 Spinting 인지등을 얻어와 무브먼트 모드에 해당되는 Camera Offset 값과 Pivot Lag Speed 값을 지정할 수 있도록 설정되어 있다.

 

 

  • 아래 카메라 애님 블루프린트 파일에서 카메라 Offset과 Lag Speed를 조절하여 카메라의 움직임을 조절할 수 있습니다.

  • Lag Speed는 캐릭터가 움직일 때 카메라가 따라 가는 속도인데, 값이 적어질 수록 더욱 빠릿빠릿 하게 해당 방향으로 따라가게 됩니다.
    • Lag Speed 가 100일 경우: 액터와 카메라가 거의 똑같이 움직임.
  • Lag Speed가 5일 경우 : 카메라가 액터를 따라오는 속도가 느려짐.(파란원이 카메라)

  • Camera Offset X : 카메라 X 거리를 조절하여 카메라 x방향성에서 액터와 얼마나 가까운 위치에 배치될지를 정합니다.
    • X OffSet 이 -280값일 경우

    • X OffSet 이 -180값일 경우(위 값보다 캐릭터가 카메라와 가까워짐 )
  • Camera Offset Y : 카메라 Y 거리 값을 조절하여 액터가 화면상의 좌우 배치 위치를 조절할 수 있습니다.
    • Y Off Set 값이 100일 경우(캐릭터가 좌로 배치됨)

    • Y Off Set 값이 0일 경우 (캐릭터가 정면 배치됨)
  • Camera Offset Z : 액터와 카메라 Z 거리값을 조절하여 액터가 화면상의 상하 배치 위치를 조절할 수 있습니다.
    • Z OffSet값이 0일 경우

    • Z Offset 값이 100일 경우
  • Blend 값이 높을 경우 스테이트로 돌아오는 속도가 느려집니다.
                      •  

 

 

 

아래 영상을 통해 어떻게 컨트롤 하는건지 다시 한번 확인해 보도록 하자.

 

 

반응형
반응형

이제 캐릭터의 움직임을 최종적으로 갈무리할 Anim Graph 단계입니다. 결국 이곳에 가장 적절한 모션들을 가장 적절한 타이밍에 뿌리기 위해 지금까지 많은 로직을 거쳐왔다.

Advanced Locomotion V4가 시대가 많이 지났음에도 많이 사용되고 있는 것은 그만큼 범용성이 크게 구조가 잡혀 있어 스켈레탈 메시만 바꿔서 사용하기에 아주 유용하게 제작이 되어있다.

기본적인 애니메이션 레이어를 폭넓게 사용하고 있으며, 완성된 레이어 아웃풋 포즈를 기본포즈로 캐싱하여 그 이후에 레이어닝 되도록 설계되어 있다.

 

Layer Blending 살펴보기

  • Base Layer - 기본적인 이동, 점프, 공격, 앉기 등 모든 기본적인 무브먼트가 처리됩니다.
  • Overlay Layer - Base Layer에 더해질 Additive 모션들이 처리되는 곳이다. 무기나 체형에 따라 기본 모션의 형태가 이곳에 의해 달라진다.
  • Base Poses - 서기인지 앉기인지 처리하는 영역.

 

Base Layer 

 

Locomotion Cycles - 아래를 펼쳐 확인

더보기

 

캐릭터 무브먼트의 가장 기본이 되는 전후좌우 시작 움직임과 이동 루핑 움직임을 처리한다.

  • 가이드 9번(AnimBP - UpdateGraph) 의 Update Movement Values 부분에서 계산된 Velocity Blend / Stride / Walk&Run / Diagonal Scale 값을 가져와 가장 적절한 모션을 연결하여 가장 적절한 수치로 뿌려주는 역할을 한다.
  • https://tartist.tistory.com/170
 

Advanced Locomotion V4(UE4) 가이드 - 9 (Anim BP - UpdateGraph 가이드)

캐릭터 블루프린트의 Tick 그래프와 같은 기능을 하는 곳으로서 매 틱마다 업데이트되는 기능을 설정합니다. Do Every Frame - 아래를 펼쳐서 확인 더보기Update Chracter Info - 캐릭터의 인터페이스 이

tartist.tistory.com

더보기

 

  • Cycle Blending - 모든 방향과 스프린트를 캐시하여 여러 곳에서 사용할 수 있지만, 한번만 평가하여 사용할 수 있습니다. 마스크되지 않은 경우 스프린트를 사용합니다. 마스크는 질주시 무릎이 과도하게 압축되어 IK문제를 일으키는 것을 보완하는데 사용합니다.
  • Ditrectional States - 방향 전환을 하거나 Pelvis 회전을 변경할 때 높은 퀄리티의 블렌딩을 달성하기 위해 이동방향과 'HipOrientation_Bias'곡선을 기반으로 방향 주기를 함께 혼합합니다.
    • 이 부분에 대한 디버깅이 힘들어 AdvancedLocomotion_V4가 쓰기 상당히 어려운 난이도라할 수 있다.
    • Velocity Direction의 경우는 Move F만 처리하고, Looking Direction의 경우에는 스텝이 꼬이지 않도록 모든 방향에 대한 블렌딩을 처리한다.

 

 

 

Locomotion Detatil - 아래를 펼쳐 확인

 

더보기

Cycles에서 처리 된 기본 이동에 추가 세부 애니메이션을 적용합니다.

  • Running과 Walking 의 이동 조건은 Essectial Values 값의 Gait Enum 값을 참조하여 walk/run을 알게 되고, Weight_Gait 커브값에 미리 설정된 값(걷기 = 1, 뛰기 =2, 스프린트=3)을 이용하여 조건을 더 확실하게 처리한다.
  • Run에서 Walk로 넘어갈 땐 바로 넘어가면 되므로 애니메이션의 남은 값을 처리할 필요없지만, 모션이 마무리 되고 넘어가야할 모션들.. 예를들어 Start 모션이 넘어가는 분기에는 남은 모션Value 값을 계산하고 모션이 넘어가도록 처리된다.
    • Start 부분의 상체 처리는 가이드 8번의 Cycle Blending Notify Events 를 참고하면 자세히 확인할 수 있다.
    • https://tartist.tistory.com/169
 

Advanced Locomotion V4(UE4) 가이드 - 8 (Anim BP - 이벤트그래프 가이드)

캐릭터BP의 가이드가 완료되었습니다. 이제 마지막으로 애니메이션 블루프린트에서 무브먼트에 맞는 모션 처리가 어떻게 되어 있는지 가이드를 진행하겠습니다. 언리얼4용 Advanced Locomotion 에서

tartist.tistory.com

더보기

 

  • Pivot 처리 부분도 가이드 8번의 Cycle Blending Notify Events를 참고하면 됩니다.

 

 

 

Locomotion State - 아래를 펼쳐 확인

더보기

 

Detail에서 처리된 부분을 캐싱하여 Stop 상황과 Moving 상황을 처리한다. 

  • 기본적인 구조는 짧게 움직이고 멈출 때는 가이드 8번의 'Play Transition' 이벤트를 이용하여 짧게 멈추는 모션을 처리하고, Moving 스테이트가 완전히 블렌딩 된 후 멈추면 길게 멈추도록 처리 되어 있다.
 

Advanced Locomotion V4(UE4) 가이드 - 8 (Anim BP - 이벤트그래프 가이드)

캐릭터BP의 가이드가 완료되었습니다. 이제 마지막으로 애니메이션 블루프린트에서 무브먼트에 맞는 모션 처리가 어떻게 되어 있는지 가이드를 진행하겠습니다. 언리얼4용 Advanced Locomotion 에서

tartist.tistory.com

더보기

 

  • (N)Stop 스테이트 처리방식 - 이동 모션에는 Feet_Position 이라는 커브 정보를 가지고 있는데, 이 커브값을 활용하여 발이 떠있는 상태인지 지면에 닿은 상태인지를 체크하여 Foot IK를 활성화시킬지 안시킬지 정하게 된다.

 

 

반응형
반응형

캐릭터 블루프린트의 Tick 그래프와 같은 기능을 하는 곳으로서 매 틱마다 업데이트되는 기능을 설정합니다.

 

Do Every Frame - 아래를 펼쳐서 확인

 

더보기

Update Chracter Info

- 캐릭터의 인터페이스 이벤트의 Essectial Values값과 Get Current States 에서 설정된 값을 애니메이션 BP에서 사용하기 위해 변수값들로 설정합니다. 여기서 설정된 변수들은 모든 움직임들마다 참고되고 있다.

 

Update Aiming Values

- 다양한 시점에서의 캐릭터의 Look을 처리하는 부분.  Update Character Info에서의 Aiming Rotation과  Aim Yaw Rate 값을 참고하여 캐릭터의 Look을 처리함. 이때 ALS_N_Look_F_Sweep 모션을 이용하여 블렌딩하여 사용함.

 

  • Update Layer Values
    • 오버레이 모션에서 애디티브 모션을 사용하게 되는데, 그 때 모션에서 사용되고 있는 커브 네임을 얻어와서 해당 커브의 Float값을 변수로 지정하여 애디티브 모션의 강도를 설정하게 됩니다.

 

  • Update Foot IK - 풋 IK를 설정하는 구간입니다. 다만 예전 방식의 풋 IK라 과하게 복잡한 부분이 있는데, 이 부분은 제가 기존에 작성했던 새 IK Rig를 활용한 Foot IK를 사용할 것을 추천드립니다.



 

 

Do While On Ground 

  • 기존 가이드 5번에서 캐릭터 BP-TickGraph 부분의 Do while On Ground 와 함께 움직이게 되는 부분이다.
  • https://tartist.tistory.com/166

Update Movement Values - 아래 펼쳐 확인

더보기

Update Movement Values

  • Looking Direction의 경우 방향별 무브번트 별로 블렌드 스페이스 애니메이션으로 제작되어 Stride 속도 Value값과 Walk/Run 속도 Value 값에 모션이 결정되도록 제작되어 있다.
  • 로코모션에서 가장 중요한 것이 풋스텝의 결정이 얼마나 자연스러운가에 있는 가 만큼 현 시스템에서 가장 중요한 처리부분이라 할 수 있다.

 

위와 같은 성격의 모션이 6가지로 준비되어 있고, 전진, 전좌, 전우, 후진, 후좌, 후우 로 여섯가지 모션으로 셋팅되어 있습니다.

  • Interp and set the Velocity Blend. 
    • 속도 혼합을 계산하여 각 방향의 액터 속도를 나타내어 각 방향의 대각선이 0.5가 되도록 정규화 시켜준다. 표준 블렌드 스페이스보다 더 나은 방향 블렌딩을 생성하기 위해 BlendMulti 노드에 사용하기 위한 블렌드 값입니다.
  • Set the Diagnal Scale Amount
    • 발 IK가 작동할 때 IK 루트 골격의 크기를 조정하여 발 IK 골격이 대각선 블렌드에서 더 많은 거리를 사용하도록 합니다. IK 뼈의 선형 혼합으로 인해 발이 대각선 방향으로 충분히 움직이지 않게 되는데 이 부분을 맵핑하는데 사용하게 됩니다.
  • Set the Relative Acceleration Amount and Interp the lean Amount.
    • 상대 가속도를 계산하여 액터 회전에 따른 현재 가속 / 감속 치를 -1과 1로 정규화하여 Lean 포즈에 사용합니다.
  • Set Walk Run Blend / Set the Stride Blend / Set Standing and Crouch
    • 각 이동 및 스탠딩 상태 변에 따른 블렌드 값 설정
  • Set the walk run Blend 
    • 블렌드 스페이스의 걷기와 뛰기값을 설정합니다.
  • Set the Stride Blend
    • 보폭 혼합의 크기를 계산합니다. 이 값은 캐릭터가 다양한 이동속도로 이동할 때 블렌드 스페이스 내에서 보폭의 크기를 조정하는데 사용됩니다. 거기에 더해 곡선 커브까지 이용하여 곡선은 최대 제어를 위해 보폭을 속도에 매핑하는데 사용됩니다.
  • Set the Standing and Crouching Play Rates
    • 캐릭터의 속도를 각 보행의 애니메이션 속도로 나누어 재생 속도를 계산합니다.

위에서 설정된 값들에 의해 아래처럼 블렌드 되어 각 모션에서 가장 적절한 모션이 최종 아웃풋에 출력되게 됩니다.

 

 

 

Update Rotation Values - 아래 펼쳐 확인

 

더보기

Update Rotation Values

  • Set the Movement Direction
    • 이동 방향을 계산하여 셋합니다. 이 값은 회전 보기/ 조준 회전 모드 중 카메라를 기준으로 캐릭터가 움직이는 방향을 나타내며, 애니메이션 레이어 주기 혼합에서 적절한 방향 상태로 혼합하는데 사용됩니다.
  • Set the Yaw Offsets
    • Yaw 오프셋을 설정합니다. 이 값은 애니그래프의 "YawOffset" 곡선에 영향을 미치며 보다 자연스러운 움직임을 위해 캐릭터 회전을 오프셋하는데 사용됩니다. 곡선을 사용하면 각 이동 방향에 오프셋이 작동하는 방식을 미세제어할 수 있게 됩니다.
    • FYaw는 Velocity Direction에서 제어하는데 주로 사용되고, 그외에의 방향은 Looking Direction에 사용하게 됩니다.

 

 

 

Do While Not Moving

  • Looking Direction이나 Aiming 모드일때는 화면을 돌리면 캐릭터가 자동으로 정면으로 바라보도록 회전 모션을 취하게 되는데, 그 때에 처리되는 부분입니다.

 

아래 부분을 펼쳐보면 자세한 설명이 이어진다.

더보기

 

Rotate in Place Check

  • Aiming 상황에서의 로테이션을 체크하여 캐릭터를 회전 시켜 준다. Update Character Info에서 얻어온 Aim Yaw Rate값을 참고하여 Pawn이 캐릭터와 어떻게 서있는지 체크하여 바라보고 있는 방향에 대한 정의를 내리고, 실시간으로 반응하여 적절하게 움직여 준다.
  • Turn in Place Check
    • Looking Direction 상황에서 카메라를 회전했을 때 다시 정면을 바라보도록 회전 시켜주는 역할을 한다.

 

 

 

반응형
반응형

캐릭터BP의 가이드가 완료되었습니다. 이제 마지막으로 애니메이션 블루프린트에서 무브먼트에 맞는 모션 처리가 어떻게 되어 있는지 가이드를 진행하겠습니다. 언리얼4용 Advanced Locomotion 에서는 특히나 애니메이션 블루프린트 부분에서 처리되는 내용들이 많아 다룰 내용이 상당히 많고 복잡합니다.

 

  • Blueprint Initialize Animation 이벤트 - 메인 Pawn을 얻어오는 부분입니다.

 

  • PlayTransition 커스텀 이벤트 - Advanced Locomotion 에서 많이 쓰는 커스텀 이벤트로서 이 이벤트를 이용해 모션간 트랜지션의 보정을 사용합니다. 특히 Stop에서 잔 스텝처리용으로 많이 사용하고, 몽타주 전후 처리도 사용하는등 굉장히 폭넓게 사용하는 커스텀 이벤트 입니다.

 

Play Transition 이벤트를 사용한 Stop 사례를 자세히 확인해 봅시다.

  • AnimNotify_->N Stop R 
    • 애님 그래프의 애님 스테이트 부분에서 세 가지 이벤트를 받아올 수 있다.
    • 나가는 스테이트 이벤트 / 완전히 블랜딩 된 이벤트 / 커스텀 이벤트

아래 N Stop R 이벤트 Lock Left Foot이 발동되는 스테이트의  나가는 이벤트에서 사용되는 이벤트이고 그 상황에서 'Play Transition' 이벤트의 Parameters Animation의 에셋과 나머지 float 수치들 사용하도록 처리되었습니다.

위에서 처리된 애님스테이트에서 보내는 이벤트를  Play Transition 이벤트로 처리하여 스탑 모션이 작동되는 형태를 아래 영상을 통해 확인할 수 있습니다.

 

위 방식을 반복적으로 사용하여 아래의 많은 사례에 'Play Transition' 이벤트가 각각의 애님 시퀀스와 수치에 맞 사용되었습니다.

 

  • AnimNotify_Stop Transition 에서 슬롯 사용하기.
    • Not Moving의 완전히 블렌딩 된 스테이트 이벤트와 Moving의 나가는 스테이트 이벤트 상황에서 Slot  노드에서 애니메이션이 발동할 수 있도록 지정하는 이벤트.

 

  • Play Dynamic Transition - 일반 애니메이션을 슬롯노드에서 재생할 수 있도록 해주는 기능 이용. 정확한 사용처는 파악이 어려움.

 

  • Interface Events - 점프키가 연타가 안되게 하고, 오버레이 모션 중에도 스테이트를 오버라이드 할 수 있는 기능들을 설정함.

 

  • Cycle Blending Notify Events
    • Pivot - Pivot의 변화가 급격히 일어나는 급 축이동이 있을 경우 특정 모션이 블렌드 되어 출력될 수 있도록 해주는 기능이다.

 

영상을 통해 어떻게 작동하는지 확인해 보자.

 

 

 

 

  • _Hips - 스텝 방향에 따라 멈출 때 스텝이 자연스럽게 멈추도록 각 방향의 멈추는 상황에서 walk stop 모션이 나오면서 멈추도록 설정.

 

아래 영상을 통해 어떻게 작동하는지 확인해 봅시다.

 

반응형
반응형

지금까지 코어한 캐릭터 무브먼트에 대한 부분을 처리했다면 이제부터는 캐릭터 무브먼트에 어울리는 모션들과 애니메이션 블루프린트에 대한 연계작업을 이어서 진행하게 됩니다. 이 작업을 override라고 이야기 합니다.

해당 작업을 통해 Advanced Locomotion V4의 모든 동작이 정상적으로 작동하려면 AnimMan과 연결되어있는 모든 애니메이션 소스들과 AnimBP를 가져와야 정상적으로 작동하게 되므로 원본 프로젝트에서 ALS_AnimMan_CharacterBP 를 이주하여 모든 소스를 한꺼번에 이주시키도록 합니다.

  • 이 때 기존 작업된 데이터에 덮어 씌우겠냐고 물음이 오면 전체 덮어 씌우도록 하여 기존 작업에서 이어나가면 됩니다.
  • 파일을 덮어씌우면서 이주할 때는 이주하려는 언리얼 에디터를 닫고 하시는걸 추천드립니다. 언리얼 에디터가 실행된 상태에서는 이주가 잘 안되는 경우가 빈번히 발생합니다.

 

  • 위 내역이 정상적으로 이주가 완료되었다면 이제 AdvancedSkeletonV4의 모든 움직임과 모션이 정상적으로 연결되어 작동됨을 확인할 수 있습니다.
잘 움직이는 것도 중요하지만, 왜 이렇게 움직이지는 파악하는 것은 더 중요하다!!

 

  • 여기서 잠깐!!
    • 잘 움직인다고 해서 여기서 작업을 끝내버리면 내가 사용할 캐릭터로 다시 만드는 것이 불가능합니다. 이제부터 왜 저렇게 움직일수 있는지 파악해가며 하나 하나 더 구체적으로 뜯어보도록 하겠습니다!

 

  • Anim Man BP에서 처리하게 될 내역들.
    • 무브먼트 디버깅을 위한 동적 색상 지정('U'버튼으로 활성화)
    • 무기 장착을 위한 표시 기능 추가
    • 카메라 대상 정보 업데이트
    • 현재 오버레이 상태에 따른 적절한 몽타주 재생 기능.
    • 아래 기능등이 메인 Pawn 스켈레탈 메시에 맞춰 오버라이드 되어 재정의 됩니다.
      • BPI_Get_3P_PivotTarget - 뷰모드에 따라 카메라 위치 변경
      • BPI_Get_FP_CameraTarget - 뷰모드에 따라 Fov 변경
      • BPI_Get_3P_TraceParams - 뷰모드에 따라 Traceparameter 변경
      • OnOverlayStateChanged - 애님 BP의 Overlay state 오버라이드
      • GetRollAnimation - Rolling 모션 오버라이드
      • GetMantleAsset - Mantle 기능 오버라이드
      • MantleEnd - MantleEnd모션 오버라이드
      • MantleStart - MantleStart모션 오버라이드
      • GetGetUpAnimation - 스냅샷 이후 일어나는 모션 오버라이드
      • RagdollStart - 렉돌 시작 모션 오버라이드
      • RagdollEnd - 렉돌 끝 모션 오버라이드

 

  • 컨스트럭션 스크립트 가이드 : 메인 Pawn의 마스터 포즈와 디버그용 Layer Color에 사용될 다이내믹 메터리얼 등을 c최초로 설정하게 된다.

 

  • Tick Graph 가이드

 

  • Update Coloring System : Show Layer Colors 부분을 활성화 시키면서 애니메이션 Overlay 되는 부분(하얀색)과 애니메이션이 완전히 블렌딩  부분(검은색)을 칼라로 표시해 준다.

 

  • 아래 영상을 통해 확인 Show Lauer Colors를 활성화 했을 때의 기능을 확인할 수 있다.

 

  • 아래를 펼쳐 Color Layering 시스템이 어떻게 작동하는지 확인해 보자.
더보기

 

  • Head/ Pelvis/ Hand / Arm(각 부위) / Leg(각 부위) 의 각각의 부위별로 매터리얼의 인스턴스 다이내믹 값을 설정하고, 호출하는 방식으로 코드가 작성되어 있다.
  • 애님 시퀀스중 오버레이쪽 모션 애셋들을 열어보면 각각의 Layering 커브값들을 가지고 있는데, 그 커브값들의 커브수치가 모션의 프레임에 해당 되는 모션에 맞게 커브값이 1~ 0으로 출력되도록 설정되어 있다. 상황에 맞춰 Lerp값으로 Layering Color가 발동되도록 설계되어 있다.

 

  • Set Reset Colors : 디버그 칼라를 원래색으로 돌리는 역할을 한다. Solid Color False 쪽도 작업이 되어있긴 위의 Update Layering Color 쪽에서 작업이 이루어져서 실질적으로 들어올 일이 없는 부분이다. 지워도 상관없는 부분.

 

  • Update Hold Object Animations : 무기를 들었을 때 관련된 이벤트를 처리한다. 아래 펼쳐 확인

 

더보기

실질적으로 무기의 별도 애니메이션이 들어가는 것은 Bow만 있기 때문에 Bow에 관련해서는 애님 인스턴스를 연결하는 등의 특수 처리가 되어있다.

Bow_AinmBP에서 Draw값에 활이 당겨지는 순간이 오면 아래 애니메이션이 작동하도록 설계되어 있다.

 

 

 

 

  • Override 정리.

    • 함수부분에서 오버라이드를 눌러주면 부모 블루프린트의 함수들을 가져와서 새롭게 오버라이드시킬수 있다.

 

각각의 오버라이드 부분을 아래를 펼쳐서 확인해보자.

 

더보기

BPI Get 3P Pivot Target : 스켈레탈 메시의 head와 root의 위치를 기반으로 Pivot의 위치를 정하기 위한 함수. 카메라의 움직임을 처리하기 위한 보조 장치.

  • BPI Get FP Camera  Target : 스켈레텔메시의 'FP_Camera'카메라 소켓 위치를 얻어오는 반환 노드
  • BPI_Get_3P_TraceParams : 키보드 "C" 버튼을 누르면 카메라가 좌우 배치가 달라지는데 이 역시 캐릭터에 미리 달려 있는 소켓을 참고해서 반환하게 된다.
  • On OverlayStateChanged : 키보드 'Q'버튼을 누르면 무기를 바꿀수 있는데, 무기 변경에 따른 무기 메시 변경을 처리하는 부분.
  • Get Roll Animation : 왼쪽 Alt를 더블 클릭하면 Roll 모션이 발동되는데, 해당 Montage 파일을 연결하는 부분입니다. 무기별 Rolling 모션이 있을 경우 해당 탭에 연결하면 됩니다.
  • GetMantleAsset : 멘틀 관련 모션을 무기별 몽타주 모션을 연결하는 부분입니다.
  • MantleEnd / MantleStart : 멘틀 시작과 끝 몽타주 상황에 해당 되는 모션이 나올 때 그에 맞게 무기를 연결하거나 해제하는 기능을 추가합니다.
  • GetGetUpAnimation : "X"버튼을 눌러 렉돌을 발생시키고 한번 더 누르면 다시 일어서게 되는데, 현재 누운 자세를 기억하는 SnapShot 기능과 함께 앞으로 엎어졌는지, 뒤로 엎어졌는지 판단하여 적절한 몽타주가 작동되어 자연스럽게 캐릭터가 일어나게 된다. 거기에 사용되는 무기별 몽타주 모션을 연결해주는 곳이다.
  • RagdollStart / RagdollEnd : 렉돌이 시작되고 끝날 때 캐릭터의 스테이트를 확인하여 무기를 들거나 들지 않도록 처리하는 부분. 현재는 렉돌이 작동할 때 무조건 무기가 사라지도록 처리 되어 있다.

 

 

반응형
반응형

지금까지 캐릭터의 무브먼트와 입력에 대한 코어처리 부분에 대해서 가이드를 진행했습니다.

이렇게 Pawn의 움직임에 대한 처리를 적용하기 위해 Skeletal Mesh를 Pawn으로 만들어주는 Child Character BP를 만들어 코어처리된 엔진내역을 상속받아 Animation BP와 연결해주는 블루프린트를 만들어 줍니다.

원본 프로젝트에서 해당 블루프린트에 해당되는 파일은 아래와 같으며, 아래 파일을 이주하게 되면 애니메이션 블루프린트와 에셋등이 모두 가져오게 되면서 실질적으로 모든 데이터를 이주하게 됩니다. 다만, 기존에도 설명드렸듯이 이렇게 한꺼번에 모두 이주해 버리게 되면 세부적인 구조 파악이 힘들기 때문에 되도록이면 새롭게 Child BP를 만들어서 비교하면서 직접 함수를 만들어보는것을 추천하는 바 입니다.

  • Child BP 만들기
    • 최초로 만들고 나면 부모 블루프린트의 모든 정보를 상속받아 왔음을 디테일 창으로 통해 확인할 수 있습니다.

 

  • Child BP의 메시를 보며 AnimMan 스켈레탈 메시로 적용하기
    • Skeletal Mesh 적용 - 현 상태에서 메시를 Anim Man으로 적용하고 게임모드에서도 대표 Pawn을 부모 컈릭터 BP가 아닌 Child 캐릭터BP 로 적용하여 잘작동하는지 확인해 본다.
    • 이름을 ALS_Base_CharacterBP_Child -> ALS_AnimMan_CharacterBP 로 변경해 줍니다.
    • 월드셋팅 -> 게임모드에서 대표 Pawn을 방금 만든 Child Pawn으로 지정해 준 후 플레이를 진행해 주고, 다양하게 움직이며 특히 X 버튼을 눌러  Ragdoll이 잘 작동하는지 체크해 봅니다. 
      • 잘 움직이고 렉돌도 잘작동한다면 기본적으로 부모 Pawn에서 잘 상속받아 왔음을 알 수 있게 됩니다.

 

  • 위 절차까지 잘 따라오셨다면 아래 영상처럼 모션만 안나올 뿐 캐릭터의 움직임과 Ragdoll 작동(키보드 'X'버튼)등이 잘 되고 있음을 확인할 수 있습니다.
    • 현 상태에서 플레이를 끄게 되면 렉돌 모션등이 없어 컴파일 에러가 뜨게 되는데, 추후에 다 진행할 작업들이라 무시해 주셔도 됩니다.

 

다음 포스팅에서는 Child 캐릭터 BP의 기본 셋팅이 마무리 되었으니 나머지 세세한 부분을 붙히면서 상세한 설명을 이어가도록 하겠습니다.

반응형
반응형

캐릭터의 최종 움직임을 결정하게 될 Tick 그래프 부분입니다. 해당 이벤트의 정보가 Anim Instance쪽과 끊임없이 통신하면서 가장 적절한 모션을 뿌려주고, 캐릭터의 무브먼트를 설정하게 되는 가장 중요한 로직이 이루어지는 곳이다.

 

  • Set Essential Values : 아래 펼쳐서 확인
    • 캐릭터의 tick 단위 이동처리에 있어 필수적으로 필요한 values들을 처리하는 함수.
  • 더보기
    Set the amount of Acceleration : 현재 속도와 이전 속도를 비교하여 가속도를 계산. 이동 구성 요소에서 반환된 현재 가속도는 입력 가속도와 동일하며 캐릭터의 실제 물리적 가속도를 나태내진 않는다.

    • Last Velocity Rotation : 속도를 측정하여 캐릭터가 움직이는지 확인함. 속도는 수평(XY)속도의 길이와 동일하므로 수직 이동을 고려하진 않음. 캐릭터가 움직이는 경우 마지막 속도회전을 업데이트합니다. 캐릭터가 멈춘 후에도 이동 방향을 아는것이 필요하여 값을 저장합니다.
    • Last Movement Input Rotation : 캐릭터의 이동 입력량을 구하여 캐릭터에 이동 입력이 있는지 확인함. 이동 입력량은 현재 가속도를 최대 가속도로 나눈 값과 같으므로 범위는 0~1입니다. 1은 가능한 최대 입력량이고 0은 없음. 캐릭터에 이동 입력이 있는 경우 마지막 이동 입력 회전을 업데이트 함.
    • Aim Yaw Rate : 현재 혹은 이전의 Aim Yaw값을 Delta Seconds 로 나누어 비교하여 Aim Yaw 속도를 설정합니다. 카메라가 왼쪽에서 오른쪽으로 회전하는 속도를 나타냅니다.

     

     

 
 
 

  • Cache Values : 다음 프레임의 계산에 사용할 특정 값을 캐시함.

 

  • Draw Debug Shapes : 아래 펼쳐서 확인.
    • 캐릭터의 움직임을 디버그할 수 있도록 뿌려주는 디버그 비주얼라이징 처리.
    • 디버깅은 실제 코어 움직임을 예측해서 뿌려주도록 계산하여 적절하게 잘 표시해주는 것이 포인트이다.
더보기

 

 

 

 
 

  • Do While On Ground // Update Character Movement : 아래를 펼쳐서 확인
    • 그라운드의 움직임의 회전을 제외하고 처리하는 부분. 실제적으로 가장 중요한 땅의 수직 움직임을 처리하는 부분이다.
더보기

 

  • Update Character Movement : 이전 페이지에서 설명했던 각각의 Gait 변수의 특성을 파악하고 적절하게 변수를 뿌려주는 것이 매우 중요하므로 다시 한번 설명한다.
  • Desired Gait
    • 컨트롤러의 키 입력시 즉시 변경되는 변수.
    • 예를 들어 Left Shift 키를 누르면 그 즉시 Desired Gait 변수는 Sprinting으로 변경.
  • Allowed Gait

  •  
    • 여러 State(Stance, Rotation)에 따라 현재 Desired Gait를 허용할 지 판단.
    • 예를 들어 Crouch 상태에서 Sprint 키를 눌렀을 때 Desired Gait는 Sprinting이 됩니다. 하지만 Crouch 상태에서 Sprint를 하지 못하길 원한다면(최대 Running까지) Desired Gait는 Sprinting이지만 이를 허용하지 않고 Allowed Gait를 Running으로 설정합니다.
    • 설정된 Allowed Gait에 따라 Character Movement Component의 Max Speed와 같은 값들을 변경.
  • Actual Gait
    • Allowed Gait까지 설정 후 캐릭터의 물리적인 속도에 따라 실질적인 Gait를 설정합니다.
    • 예를 들어 캐릭터가 Running 중에 Walking으로 변경 시 Allowed Gait는 Walking이 되었지만 실제 캐릭터 속도는 아직 Running의 속도이므로 Actual Gait는 Running입니다. 서서히 캐릭터 속도가 줄어들어 Walking의 속도가 됐을 때 Actual Gait도 Walking이 됩니다.
  • Gait
    • AnimBP에 전달되는 최종 ALS Gait 타입 변수입니다.
    • Allowed Gait, Actual Gait 변수는 Tick마다 새로 써주고 있는데 Actual Gait 변수가 변경 되었을 때만 Gait 변수에 Actual Gait를 그대로 설정.
  • Update Dynamic Movement Settings
    • 현재 허용되어 있는 움직임을 이용하여 gait 값을 설정합니다.
  • Get target movement Settings
    • 현재의 무브먼트 셋팅값과 Rotation Mode에 따라 Movement Setting Structure 값을 반환합니다.

 

 

  • Do While On Ground // Update Grouded Rotation : 아래를 펼쳐서 확인
    • Looking Direction 부분에서는 부드러운 회전을 위해 Velocity Direction 부분에서는 루트모션의 커브값을 제어하기 위해 회전Value를 정확하게 처리하기 위한 공간
더보기

 

  • Can Update Moving Rotation : 루트모션을 사용하는지 이동중인지등을 체크하는 함수 입니다.

 

  • Calculate Grounded Rotation Rate : 이동 설정에서 현재 회전율 곡선을 사용하여 회전율을 계산함. 매핑된 속도와 함께 곡선을 사용하면 각 속도의 회전 속도를 높은 수준으로 제어할 수 있게 됨. 반응성을 높이기 위해서 속도를 높이면 됨.

    • Get Mapped Speed : 0 = 정지, 1=걷기, 2=달리기, 3=질주로 지정하여 캐릭터의 현재속도를 매핑함. 이동 속도를 변경할 수도 있지만, 일관된 결과를 위해 계산에 매핑된 범위만 계속 사용할수 있음.
  • Smooth Character Rotation : 더욱 부드러운 회전을 위해 대상 회전을 보간함.

 

 

  • Not Moving : 움직이지 않을 때 값을 사전에 처리하는 구간
  • Limit Rotation : 캐릭터가 특정 각도이상 회전하는것을 방지하기 위한 도구입니다.

 

현재 상태에서는 스켈레탈 메시의 애님 시퀀스등이 아직 호출되지 않고 있어 단순한 움직임만 처리 되고 있지만, 스켈레탈 메시가 등록되고, 루트모션을 사용하는 모션들이 사용되면 각각의 성격에 맞게 계산이 이루어지게 된다.

 

 

  • Do While In Air : 공중에 떠 있을때 로테이션을 처리하는 부분.
    • Velocity / Looking 보다는 Aiming에서 좀더 빠르게 반응하도록 설정되어 있음.

 

  • Mantle Check :아래를 펼쳐서 확인
    • 공중에서 떨어질 때 맨틀이 체크될 때 적절한 모션이 출력되도록 처리 한다.
더보기

 

 

캡슐을 체크하여 오브젝트와 닿았는지 체크하는 부분
맨틀높이에 따른 적절한 처리를 진해함
조건이 맞을 때 Mantle 움직임을 시작함.
  • Mantle Start : 위 조건들을 수집하여 가장 적절한 모션을 가장 적절한 위치에 업데이트하여 출력하는 역할을 한다.

 

 

  • Do While in Ragdoll : 아래를 펼쳐 확인
    • 주인공이 사망할 때 Ragdoll 시스템이 발동하게 되는데, 가장 좋은 타이밍에 Ragdoll이 작동하고, 캐릭터가 다시 일어날 때 스냅샷을 적절히 사용하도록 셋팅한다.
더보기

 

pelvis가 Physic Body를 설정하는데 중심역할을 하게 된다.
캐릭터가 누울 때 방향이 위인지 아래인지 체크한다.
대상 위치에서 아래쪽을 추적하여 대상 위치를 오프셋하여 봉제 인형이 바닥에 누워 있을 때 캡슐의 아래쪽 절반이 바닥을 통과하는 것을 방지합니다.

 

렉돌이 끝나는 시점에 스냅샷을 쓰게 되는데 위 맵틀 스타트에서 얻은 정보가 스냅샷을 실행하는데 필요한 소스로 활용된다.

 

반응형
반응형

외부 입력에 따른 각각의 이벤트 처리를 알아봅시다.

  • Movement Input - 아래 펼쳐 보기
    • 입력에 따른 캐릭터 방향처리와 카메라 이동 처리 부분
더보기

 

각각의 입력과 회전에 따른 움직임을 함수로 처리하여 폰을 움직이도록 처리하였다. 키보드는 입력값이 일정해서 큰 오류가 없지만, 패드의 입력값은 float단위로 매우 민감하게 떨리게 처리되는 경우가 많아 range clamp 값으로 입력값을 안정되게 들어오도록 처리한 방식이다.

 

 

 

  • Camera Input - 해당 부분은 일반적인 카메라 움직임이 적용되었다.

 

  • Jump Action Input - 점프 입력이 들어왔을 때의 처리

Ragdoll과 Mantle등의 예외처리가 필요하다 보니 다른 부분보다 로직이 복잡하다.

지금 상태에서도 키보드 X버튼을 누르면 Ragdoll이 발동되긴 하지만, Skeletal Mesh의 정확한 렉돌 정보가 아직 들어오고 있지 않기 때문에 컴파일 에러가 발생하게 된다.

Mantle 체크와 Ragdoll 체크등은 스켈레탈 메시가 연결되고 나서 다시 한번 확인을 해볼 필요성이 있다.
 

  • Stance Action Input - 앉기 버튼에 따른 입력처리와 예외 처리 부분.
    • 기본적으로 Movement Action에서 None 상태에서만 Crouch가 작동되도록 설정되어 있다.

 

  • Walk Action Input / Sprint Action Input : 인풋이 올 때 마다 모드가 변경되도록 처리.
더보기

 

ALS Gait 타입으로 된 변수 4개로 캐릭터의 행동을 Tick마다 계산하고 있기 때문에 각각의 Gait변수들의 특성을 알 필요가 있다.

  • Desired Gait
    • 컨트롤러의 키 입력이 들어가면 즉시 변경되는 변수입니다.
    • 예를 들어 Sprint 키인 Left Shift 키를 누르면 그 즉시 Desired Gait 변수는 Sprinting으로 변경됩니다.
  • Allowed Gait
    • 여러 State(Stance, Rotation)에 따라 현재 Desired Gait를 허용할 지 판단합니다.
    • 예를 들어 Crouch 상태에서 Sprint 키를 눌렀을 때 Desired Gait는 Sprinting이 됩니다. 하지만 Crouch 상태에서 Sprint를 하지 못하길 원한다면(최대 Running까지) Desired Gait는 Sprinting이지만 이를 허용하지 않고 Allowed Gait를 Running으로 설정합니다.
    • 설정된 Allowed Gait에 따라 Character Movement Component의 Max Speed와 같은 값들을 변경합니다.
  • Actual Gait
    • Allowed Gait까지 설정 후 캐릭터의 물리적인 속도에 따라 실질적인 Gait를 설정합니다.
    • 예를 들어 캐릭터가 Running 중에 Walking으로 변경 시 Allowed Gait는 Walking이 되었지만 실제 캐릭터 속도는 아직 Running의 속도이므로 Actual Gait는 Running입니다. 서서히 캐릭터 속도가 줄어들어 Walking의 속도가 됐을 때 Actual Gait도 Walking이 됩니다.
  • Gait
    • AnimBP에 전달되는 최종 ALS Gait 타입 변수입니다.
    • Allowed Gait, Actual Gait 변수는 Tick마다 새로 써주고 있는데 Actual Gait 변수가 변경 되었을 때만 Gait 변수에 Actual Gait를 그대로 설정합니다.

 

  • SelectRotationMode Input : VelocityDirection / LookingDirection 셋하는 곳.

 

  • Aim Action Event : 총이나 활등의 무기를 사용할 때 저격 모드 인풋이 들어올 때의 처리 내용이다.

 

  • Camera Action Event : 캐릭터가 카메라의 우측에 배치하게 할 것인지 좌측에 배치하게 될것인지 처리하게 된다. Aim 모드나 Looking Direction(FirstPerson) 모드에서만 작동한다.

 

  • RagdollAction Input : 캐릭터가 렉돌 될때의 처리를 진행한다.
    • Skeletal Mesh가 Pawn으로 적용된 이후 더 확실하게 체크할 수 있다. 
    • 더보기
      Ragdoll Start /Ragdoll End 상황을 처리하게 되는데, Ragdoll 아닐 때는 Ragdoll Start가 처리되고, Ragdoll Start가 되면 End로 오게 하는 구조이다.

      렉돌이 시작되면 Pawn Mesh의 Physics Body의 Collision Type을 활성화 시키게 된다.

      rag처리가 완료되는데로, Physic Body를 다시 꺼주게 한다.

       

       

 

반응형
반응형

캐릭터 블루프린트에서는 통상적으로 세 가지 이벤트를 분류하여 처리하게 되는데, Event Graph / Tick Graph / Input Graph가 그것입니다.

  • Event Graph - Begin 이벤트를 필두로, 사전에 얻어와야할 정보를 미리 등록하는 곳이라 생각하면 좀더 이해가 편할것이다. 캐릭터의 정보를 저장하기 위해 만든 Enum 값이나 Structure등 미리 데이터를 읽어와야 하는 것들을 변수로 지정하거나 하는등의 작업을 통해 사전 빌드업을 처리하는 이벤트 공간이다.
  • Tick Graph - 말 그대로 Tick 단위로 실행되는 이벤트로서 게임플레이중 실시간으로 실행되는 영역이다. 이 부분에서는 너무 과도한 계산식이 무리하게 들어가다보면 랙이 발생할 수 있으므로 항상 과부하되는 지점이 없는지 항상 체크하여야 하는 영역이다.
  • Input Graph - 키보드나 게임패드등 외부에서 입력이 들어왔을 때 처리하는 영역이다. 최근에 언리얼쪽에서 Input 쪽을 좀더 프리시졀하게 작동하도록 여러가지를 도입하고 있는 추세이다.

캐릭터 BP에서 처리되는 모든 내용은 결국 Anim BP 가 처리하는데 용이한 정보를 업데이트하는데 주력하고 있다는 것입니다.

1. ALS_Base_CharacterBP 의 이벤트 그래프 처리에 대한 설명.

  • 굉장히 길고 복잡한 설명이 될 수 있으므로 숨을 크게 들이쉬고, 하나하나 정확하게 작동하는지 확인해 보시길 추천드립니다. 너무 내용이 길어질 수 있어 폴딩형으로 정리합니다. 자세한 확인은 아래를 펼쳐보시길 바랍니다.
  • BeginPlay 이벤트 - 아래 펼쳐보기
더보기
 BeginPlay 이벤트
  • Begin Event에서 가장 기본적인 정보들을 읽어오는 부분을 On Begin Play라는 함수로 처리되었다.  
    • On Begin Play 처리 내용
  • Add Tick Prerequisite Actor - Target인 Mesh Component는 Self 노드(Base Character BP)의 Tick이 실행되고 나서 Tick을 실행하도록 한다.
  • Get Anim Insatnce - 현재 사용되는 캐릭터 BP의 애님 인스턴스와 통신한다.
    • et Movement Model - 현재 사용되는 모델의 데이터 테이블과 통신하도록 설정한다. 아래의 데이터 테이블 정보가 결국 캐릭터 무브먼트의 이동 속도 등을 결정하게 하기 위한 것이다.

      • 캐릭터에 구성되는 각각의 Enum 정보값을 읽어와서 변수로 통신하도록 설정한다. 그 정보는 각각 아래와 같다.
        • ALS_Gait : Walk/ Run/ Sprint
        • ALS_RotataionMode : Velocity Direction / Looking Direction / Aiming 
        • ALS_Stance : Standing / Crouching
        • ALS_OverlayState : 각각의 무기별 혹은 체형별로 구분
          • 이곳은 추후에 AnimBP에서 캐릭터의 Additive 모션을 오버레이로 처리하기 위한 사전 공간이다.
  • Set default rotation values :
  • 이곳은 Velocity Direction 모드를 사용할 경우 현재의 로테이션의 방향을 추출하여 해당되는 모션을 뿌리기 위해 현재의 캐릭터 각도 정보를 얻어오는 공간이다. Begin에서 선언된 이후 상황에 따라 주기적으로 로테이션 값을 새로 셋팅하게 된다.

 

  • State Event - 아래 펼쳐보기
더보기
On Pawn Movement Mode Changed - Ground / In Air / Mantling / Ragdoll 인지를 얻어오는 이벤트와 함수
  • 여기서 사용되는 Enum 값은 'ALS_MovementState'을 참조한다. 




  • Crouch / UnCrouch - 앉기 상태를 얻어오는 이벤트와 함수
    • Stance 상태를 읽어와서 앉기인지 서기인지를 구분시켜 준다.
      • 이때 메크로 기능까지 사용하여 현 재상태의 Local값 / World값 / Transform값 / DoWhile 인지까지 판단하여 캐릭터 상태를 지속적으로 체크하는 기능을 사용한다.






  • State Changes - 앉기와 비슷한 맥락으로 구성되어 있으며 Begin Event에서 ALS_Gait  / ALS_RotataionMode  / ALS_OverlayState  등등의 함수에서 초기 셋팅되었던  각각의 스테이트값을 이벤트가 생길 때 마다 새로 셋팅하는 기능을 갖추게 한다.
    • 여기서도 역시나 메크로 기능을 통해 각각의 상태 값을 디테일하게 가지게 된다.
    • 이 곳에서 꾀나 많은 작업이 일어나게 되므로 세세하게 기능을 확인하고 넘어가야 할 중요한 기능 구현 단계이다.
    • 각각의 On Changed 함수 파악하기
      • On Movement State Changed : 무브먼트 상태가 에어일 경우에 대한 분기로 들어와 에어가 아니면 그라운드 부분을 처리하고, Rolling 일경우에는 Ragdoll 이 시작하게 되어 있다. Ragdoll 에 대한 정의는 아직 알수가 없는것이 메인 캐릭터를 아직 자식으로 넣어놓지 않은 상태라 아직 상태체크가 불가하다.
  • On Movement Action Changed : Crouch 인지 아닌지를 판단하고 상태에 따라 Rolling 모션이 처리하게 하는 기능을 한다. 이 기능도 아직 자식으로 스켈레탈 캐릭터를 연결하지 않았기 때문에 완벽히 확인이 힘들다. Crouch가 잘 작동하는지만 확인해 보자.
  •  On Rotation Mode Changed : 현재 1인칭 모드(Looking Direction)인지 3인칭 모드(Velocity Direction)인지를 감시한 후 View Mode가 First인지 Third인지 알려주게 된다. 카메라 제어할 때 정보를 보내기 위한 용도이다.

  •  
  •  On Gait Changed : Walk / Run / Spint 인지를 감시한다.
  • On View Mode Changed - 위 On Rotation Mode Changed 에서 Bpi Set View Mode의 정보를 얻어와서 현재의 뷰모드를 통해 Rotation Mode를 결정한다.

 

 

  • Movements Events : 아래 펼쳐보기
    • 점프 / 착지 / Falling / Mantle / Rolling 상황등의 특수 상황 처리 내역. 
더보기

On Landed : 땅에 착지 하는 여러가지 순간에 맞게 마찰 인수 제동에 변화를 주는 시스템입니다. 착륙시 제동 마찰을 일시적으로 증가시켜 착륙의 정확성을 올리는 역할을 합니다.

 

On Jumped : 속도가 100이상인 경우 새로운 In Air Rotation 을 속도 회전으로 설정하는 기능을 부여합니다.

 

Breakfall / Roll : 루트모션 몽타주가 재생되어야 할 타이밍에 몽타주 플레이시켜줌. Roll

 

Mantle Timeline : 이 타임라인은 MantleStart 함수에서 트리거되며 캐릭터를 새 위치로 이동시키는 함수를 업데이트하는 기능입니다.벽넘기 이벤트에 사용됩니다.

 

 

 

현 상태에서 각각의 변수를 감시하도록 하고, 플레이를 한다음 여러가지 상태변화를 주면서 정상적으로 블루프린트가 작동하는지 체크한 후에 다음 단계로 넘어가는 것이 중요하다. 현 상태에서 잘작동하지 않는 상태에서 계속해서 그냥 넘어가면 나중에 문제를 체크하는 것이 상당히 어려워 진다. 

 

 

 

반응형
반응형

개인적으로 Advanced Locomotion 라이브러리를 완전히 이해하고 싶다면 프로젝트에 있는 내용을 내 개인적인 프로젝트에 하나씩 옮기면서 실행해 보는 것을 추천합니다. 너무 덩치가 큰 프로젝트이다 보니 세세한 분석이 힘들어 하나씩 뼈대부터 옮겨가며 이해하다보면 해당 라이브러리를 로직 순서에 따라 좀 더 깊이 있게 이해할 수 있게 됩니다.

 

1. ALS_Base_CharacterBP 를 새 프로젝트에 옮기며 하나씩 기능을 익혀가 보자.

  • 먼저 'AL_Study' 라는 이름의 비어있는 새 프로젝트를 만들어 보자.
    • 정상적인 플레이를 위해 반드시 언리얼4 또는 5.0이하에서 만들도록 한다.

이어서 원래 프로젝트의 ALS_Base_CharacterBP 에셋을 새로 만든 프로젝트로 이주 하려고 하면, 관련된 에셋들이 전부 뜨게 되고, 어떤 에셋들이 연결되어 있는지 한눈에 확인할 수 있게 된다.

이주 내용에 따르면 ALS_Base_CharacterBP에 종속되어 있는 것들이 AI, Interface, Library, 캐릭터 메시, Curvedata, datatable, Enum, Structure 등이 종속되어 있는 것을 확인할 수 있다.

이주 대상 컨텐츠를 아래처럼 새로 만든 프로젝트의 content 폴더로 지정해 주면 이주가 정상적으로 이루어진다.

 

최초 이주 후 이주된 프로젝트에서 ALS_Base_CharacterBP 를 컴파일 해보면 여러 에러로그가 발생하게 되는데, Input관련 에러가 가장 많이 뜨게 된다. 그 이유는 키보드 및 게임패드 Input 구조가 Advanced Locomotion 프로젝트와 다르기 때문에 해당 문제가 가장 많이 발생하게 된다.

위 문제를 해결하기 위해 프로젝트 셋팅 -> 입력 탭으로 가서 현재 프로젝트의 입력 맵핑 구조를 익스포트 한 뒤 새 프로젝트에서 임포트해주면 문제가 해결된다.

 

2. Game Mode를 옮겨와서 플레이와 디버그가 가능한 단계로 넘어오자.

Advanced Locomotion의 게임모드를 옮겨오게 되면 ALS_Base_CharacterBP와 연계되는 ALS_Player_Controller도 함께이주하게 되면서 초반 셋팅이 매우 간단해 집니다. 게임모드와 controller에 대한 이해가 부족하다면 새로 만다는 것을 추천드리지만, 해당 내용은 이해한다는 전제하에 진행하도록 하겠습니다.

  • 이주시 주의 사항
    • ALS_GameMode_SP 의 디폴트 폰에는 ALS_Base_CharacterBP가 아닌 ALS_AnimMan_CharacterBP로 되어 있어 이주시 캐릭터 관련 모든 정보와 Anim BP까지 모두 넘어오게 되면, 초기 시스템 구성 파악이 힘드므로 디폴트 폰을 ALS_Base_CharacterBP 로 지정하여 이주 하도록 한다.

  • 위에서  ALS_Base_CharacterBP를 이주하면서 넘어온 데이터가 중복으로 넘어오게 되는데, 중복되는 내용들은 가져오지 않아도 된다.

게임모드까지 정상적으로 이주 하고, 월드 세팅에서 게임모드를 ' ALS_GameMode_SP '로 지정하게 되면 아래처럼 플레이가 가능한 상태가 됩니다.

 

 

다음 포스팅부터는  ALS_Base_CharacterBP를 완전히 해체하듯이 분석을 진행해 보도록 하겠습니다.

반응형
반응형

1. 준비물

  • 엔진 : 언리얼 4 / 5
    • 주의 사항 : 언리얼5는 5.0에서만 설치됨
  • 라이브러리 : Advanced Locomotion System V4

링크 https://www.unrealengine.com/marketplace/ko/product/advanced-locomotion-system-v1

 

2. 폴더와 시스템 구성 분석.

라이브러리를 받고 나면 아래와 같이 폴더가 구성되어 있습니다.

  1. Audio : 각각의 사운드 파일 모음
  2. Blueprints : 각종 캐릭터 BP / 카메라 BP / 게임모드 BP등 실질적인 시스템 코어 폴더라 할 수 있는 곳. 이곳에서 모든 로직이 이루어 진다.
  3. Character Assets : 메인 캐릭터 스켈레탈 메시와 애니메이션 BP가 있는 곳. 캐릭터의 움직임을 위한 소스들이 모여 있다.
  4. Data : 캐릭터 BP와 애니메이션 BP에서 캐릭터의 무브먼트와 카메라 무브먼트등을 처리할 때 스무드한 블렌딩 처리를 위해 많은 커브 데이터가 활용되었다. 또한 각각의 시퀀스가 작동될 때 시퀀스에 필요한 많은 정보를 Struture단위로 처리하게 되는데 거기에 필요한 데이터들이 모여 있다.
  5. Environment : 레벨에 구성되는 배경 에셋들과 static mesh들이 모여있다.
  6. Levels : 배경 레벨들이 있음
  7. Props : 각종 무기 메시들이 모여 있음.

 

3. 어드벤스드 로코모션은 기본적으로 2가지 뷰모드를 제공한다.

  •  Velocity Direction Mode - 흔히 말하는 3인칭 시점을 말하며 주로 RPG 게임등에 사용는 뷰입니다.
Velocity Direction Mode
  • Looking Direction Mode - 1인칭 시점을 말하며 FPS게임이나 1인칭 어드벤쳐 게임에 사용되는 뷰입니다.
Looking Direction Mode

 

4. 캐릭터 블루프린트 구조 파악하기.

모든 로직은 결국 캐릭터 블루프린트와 연결되어 이루어지기 때문에 캐릭터 블루프린트를 완벽히 파악하는 것이 가장 중요하다고 할 수 있습니다.

위치 :

Blueprint'/Game/AdvancedLocomotionV4/Blueprints/CharacterLogic/ALS_Base_CharacterBP.ALS_Base_CharacterBP'

 

기본적으로 ALS_Base_CharacterBP 가 메인 두뇌 역할을 하게 되고, ALS_AnimMan_CharacterBP에서  ALS_Base_CharacterBP의 계산값을 불러와서 필요한 에셋들을 붙히는 역할과 Anim BP와 연결해 주는 역할을 하게 됩니다. 레퍼런스 뷰어로 연결관계를 보면 아래와 같습니다.

 

5. World Setting에서 메인 캐릭터를 Base 캐릭터로 바꿔서 확인해 보기.

현재 테스트중인 에셋은 언리얼 라이브러리에서 언제든지 원래 상태로 롤백할 수 있으니, 다양하게 편집하면서 기능을 파악해 보는 것이 숙지하는데에 많은 도움을 줍니다. 

현재 열려있는 데모레벨에 올라가 있는 캐릭터를 전부 지우고 실행하면 기본적으로 ALS_AnimMan_CharacterBP가 기본적인 Pawn으로 나오게 되는데, World Setting에서 메인 Pawn을 ALS_Base_CharacterBP로 바꿔서 플레이를 실행해보면 어떤 로직으로 구성되는지 파악하는데 도움을 줍니다.

 

아래 영상과 같이 플레이를 해보면 캐릭터의 무브먼트의 특성을 파악할 수 있고, 다양한 토글 키를 통해 디버그 뷰도 확인이 가능한 상태임을 확인할 수 있습니다.

 

 

다음 포스팅에서는 ALS_Base_CharacterBP 의 구조를 심도있게 파악해 보도록 하겠습니다.

반응형

+ Recent posts