Advanced Locomotion System 2

25 분 소요

Base Layer

Locomotion Cycle

Animatioin Asset

Direction Animation (Blend Space)

  • 바라보는 방향에 따라 3종류, 앞뒤로 2종류로 총 6개의 BS 가 필요함.
  • 2가지 축으로 Stide(0~1) 와 Walk/Run(0, 1) 이 들어감
  • Walk / Run 은 보간을 위한게 아니라 한번에 처리하기 위함임
  • Stride 로 Walk 와 Run 의 속도에 따른 보간을 독립적으로 실행하게 됨.

Sprint / Sprint Impulse (Anim Sequence)

  • Sprint 와 거기서 몸을 조금 더 숙인 Sprint_Impulse 애니메이션임
  • RelativeAcceleration.X 에 따라서 몸을 더 굽히기 위해 Blend 됨.
  • 이것을 Sprint 상태일 때 전방방향으로 사용함.

Lean Animation (BlendSpace)

  • 가속도에 따라 몸을 기울리기 위해 사용됨
  • F<->B, L<->R 의 축으로 -1~+1 의 정규화된 값이 들어감
  • Base Run Pose 의 Addictive Animation 으로 구성되어 있음
  • 따라서 Gait 가 Run 또는 Sprint 의 상태일 때 Apply Addictive 됨

Used Values

이하는 ShouldMove 가 True 일 때 업데이트 됨.

struct VelocityBlend { float F, B, R, L; }

  • Blend Space 의 보간을 위해 사용되며 Velocity 를 Character 의 LocalSpace 로 변환 후 특수한 정규화를 거친 값
  • Locomotion Cycle 에서 FBLR 방향의 Anim 을 보간하는데 쓰임.

float WalkRunBlend

  • Locomotion Cycle 에 쓰이는 6가지 방향의 BlendSpace 의 Input 값임
  • Gait 가 Walk 이면 0, Run, Sprint 면 1을 줌.

float StrideBlend

  • Locomotion Cycle 에 쓰이는 6가지 방향의 BlendSpace 의 Input 값임
  • StrideBlendNWalk 와 StrideBlendNRun 라는 FloatCurve 에서 Speed 로 값을 얻어옴.
    • Maxinum Walk/Run Speed(150, 350) 범위의 Sigmoid 함수와 비슷한 그래프임
  • 각각에서 얻어온 값은 Weight_Gait 라는 Anim Curve 로 보간 받음.
  • Walk 와 Run 을 독립적으로 Blend 하려고 사용함.

float StandingPlayRate

  • Locomotion Cycle 에 쓰이는 6가지 방향의 BlendSpace 의 Input 값임
  • StrideBlend 와 비슷한 작업을 거침
  • WorldScaleStrideBlend 를 나눠서 보정함.

FVector RelativeAccelerationAmount

  • Locomotion Cycle 에서 Sprint_F 와 Sprint_Impulse 라는 Anim 을 보간하는데 쓰임.
  • float MaxValue = Dot(Acceleration, Velocity) > 0 ? CharacterMovement->GetMaxAcceleration() : CharacterMovement->GetMaxBrakingDeceleration(); FVector RelativeAccelerationAmount = ClampSizeMax(Acceleration, MaxValue) / MaxValue; RelativeAccelerationAmount = Character->GetActorRotation().Unrotate(RelativeAccelerationAmount);

struct LeanAmount { float R, F;}

  • Lean Animation 의 Input 값으로 사용됨
  • LeanAmount = Interp(cur, RelativeAccelerationAmount.XY);
  • 즉 앞에서 구한 상대가속도를 사용해 DeltaTime 으로 보간한 것.

enum MovementDir{ F, B, L, R}

  • Locomotion 의 Cycle 전환에 사용되며 현재 캐릭터가 바라보는 Angle 을 Descrete 화 한 값.

float FYaw, BYaw, LYaw, RYaw

  • Yaw Offset Curve 를 이 값으로 업데이트함
  • Locomotion Cycle 에서 대각선 방향으로 움직일 때 캐릭터가 그 방향으로 회전하게 해줌

설명

캐릭터가 움직일 때 적절한 방향으로 움직이는 모션을 만들어냄.

중요한 포인트는 총 5가지임

  • 방향에 따른 F, B, FR, FL, BR, BL 노드를 통해서 방향에 따른 일관적인 움직임을 보임
    • 왼쪽을 보며 앞으로 가다가 오른쪽으로 갈 때 왼쪽을 보며 뒤로가게 함으로써 오른쪽으로 가게 함. 그 반대 방향도 마찬가지.
    • 이때 State 간 Fade 시간을 0.7 로 둬서 부드러운 전환 을 만듬
    • 여기서 BR, BL 에서의 State Weight == 1 의 경우 FR, BR 로 바꾸어 자연스러운 전환을 만듬
  • 방향 전환시 HipsDirection 을 Notify 로 바꾸어줌.
    • 이는 Stop Motion 등에서 사용됨
  • 방향이 정반대로 전환 시 pivot 을 Notify 로 On 해줌.
    • bool pivot = TriggerPivotSpeedLimit > speed
    • Locomotion Detail 에서 가속느낌의 기울기를 주게 됨.
      • CharacterMovement 의 MaxAcceleration 을 1500 근처로 둬야 자연스러운 느낌이 남.
      • 6000 등 큰 값에서는 이 옵션을 사용하면 타이밍을 조절해야함.
    • 0.1 초 Delay 후에 값을 다시 꺼줌.
  • Sprint 의 경우 가속때 적절하게 Sprint/Sprint_Impulse 를 섞어주고, 가속도에 따라 캐릭터를 기울려줌.
    • Gait 가 Sprint 상태일 때 Run_F 를 대신해서 F 방향으로 사용됨
  • Yaw Offset AnimCurve 값을 조정해 Looking Direction(카메라 방향으로 캐릭터가 보게함) 모드일 때 자연스럽게 캐릭터를 회전시킴.
    • CurveVector 2개를 통해 캐릭터와 카메라의 각도차에 따른 FBLR 의 값을 조정함
    • 이건 대각선으로 움직였을 때 그 방향으로 캐릭터가 회전할 수 있게 함.
      • 안그러면 대각선으로 움직이다 멈췄을 때 다시 정면을 보게 될 거임.

Locomotion Detail

Animation Asset

Accel_F/B/L/R (Anim Sequence)

  • 해당방향으로 몸을 기울이는 모양임
  • Run Base Pose 의 Addictive Animation 임

설명

Accel_F/B/L/R 을 달리기 시작/끝 부분과 방향을 반대로 틀 때 Apply Addictive 하기 위한 States 임

Velocity Blend 로 Accel Animation 을 LocomotionCylce 에 더함

  • State 내의 Accel Animation 은 loop 끄고 State 끼리 Group Name 으로 묶어서 Sync Group 을 맞춤.
  • CharacterMovement 의 MaxAcceleration 을 1500 근처로 낮춰야 재생할 시간이 확보됨.
  • PlayRate = 1.25, StartPoint = 0.25 으로 Anim 타이밍을 조절함

이때 Pivot 값에 따라서 PivotState 를 돌리는데 사용하는 옵션이 꽤 있음.

  • State 간 Transition 에서 Duration 이 0.1 이고
  • Blend Logic 을 Inertialization 을 씀.

Locomotion State

Anim Asset

Direction Animation (Anim Sequence)

  • Locomotion Cycle 에서 사용한 그것임
  • 이 애니메이션에 Feet_Position 이 있는데 이걸 정지모션의 분기점으로 사용함.
    • 1 이면 오른발이 땅에, -1 이면 왼발이 땅에, 0 이면 공중에 있음을 말함.

Rotate/Turn (Anim Sequence)

  • 90도의 경우 길이가 1초 이고 RotationAmount Curve 의 그래프의 넓이가 대략 3임.
  • 180도의 경우 길이가 2초 이고 RotationAmount Curve 의 그래프의 넓이가 대략 6임.
  • FootLock L/R Curve 값이 있는데 1이면 고정, 1~0 이면 서서히 이동, 0 이면 완전히 이동임.
  • Rotate 는 Rotation Mode 가 Aiming 일 때 사용되며 90 도 회전만 있음.
  • Turn 은 Rotation Mode 가 Lock Direction 일 때 제자리 회전에서 사용됨.
    • Rotate 가 발은 2번 움직이는데 Turn 은 발을 3번 움직이고 재생시간이 더 김.

Transition (Anim Sequence)

  • BasePose 에 대한 Additional Animation 임
    • 그래서 Montage 로 사용해도 중간에 취소안해도 크게 상관이 없음
    • 관련 애니메이션이 기본 포즈랑 차이가 별로 안나서 그럼
  • FootLock L/R Curve 와 Enable Transition Curve 가 있음
    • Addictive 라 기존 값에서 더하기 때문에 -1 ~ 0 범위를 가짐
  • Enabled_Transition AnimCurve 가 들어가 있음
    • 처음은 0, 후반부에 1이 되어 후반 딜레이를 줄이는 역할을 함

Used Values

이하는 ShouldMove 가 False 일 때 업데이트 됨.(제자리 회전)

bool bRotateR/L; float RotationRate

  • Aiming 상태일 때 쓰이며 Locomotion States 에서 사용되는 값임.

float ElapsedDelayTime

  • 멈춰있고 카메라 방향으로 보게 할 때, 일정 시간이 지나고 회전시킬 때 사용되는 임시값.

FRotator AimingAngle

  • 카메라 방향인 ControlRotation 과 캐릭터 방향인 ActorRotation 의 Normalized Delta
  • 정확히는 위 값을 XY = {Yaw, Pitch} 순으로 해놓은 값.
  • Aim 상태에서도 쓰이고 여기서는 X 값이 일정범위를 넘기면 회전시킬 용도로 쓰임.

enum HipsDir{ F, B, LF, RF, LB, RB}

  • Lomotion 의 Cycle 전환 시 Notify 로 업데이트 되는 값.
  • F/B/L/R 애니메이션에서 막 땅에 닿는 순간으로 Evaluate 할 때 LF/LB 인지 RF/RB 인지 파악할 때 쓰임.

설명

멈췄을 때 FootLock 관련 Animation 을 실행시키고, 제자리 회전을 실행시키는 부분임.

Transition / Stop

  • StopL/R, QuickStop Notify 가 Moving->NonMoving 과 Stop State 에서 호출됨.
    • Foot Lock 을 걸어주기 위한 동작을 실행하기 위해 사용됨
    • Notify 에서 Transition Animation 을 Grounded Slot 에 넣어줌.
    • Enabled_Transition AnimCurve 가 들어가 있음
      • NonMoving State 에서도 이 AnimCurve 를 1로 업데이트함
      • 이 Curve 값이 1인지 보고 PlayerBP 에서 제자리 회전을 할지 판단함(아래설명)
  • StopTransition 이 NotMoving->Moving 과 Moving State 에서 호출됨
    • Grounded, Turn Slot 의 몽타주를 없애줌

Foot Lock Stop

  • Feet_Position 의 절댓값이 1에 가까운지 여부에 따라 FootDown, FootUp 으로 나눔.
  • FootDown
    • 한쪽 발이 땅에 닿아있는 경우로, 그 발을 Lock 시킴
  • FootUp
    • 모든 발이 떠있는 경우로 Feet_Position 에 따라 가장 땅과 가까운 발을 Lock 시킴.
    • 땅과 가까운 발이 , F/B/L/R 애니메이션에서 막 땅에 닿는 파트를 Evaluate 해서 잠깐 가져옴.(Blend Duration 0.1 초 정도)
    • 또한 그때의 땅이 닿는 쪽의 Thigh 와 IK 본을 Blend 를 통해 고정시켜둠.

Rotate / TurnInPlace

  • RotationMode 에 따라 회전이 다르게 들어감
    • Velocity Direction 의 경우 그냥 Velocity 방향으로 회전 시켜줌 (여기랑 관계 x).
    • Looking Direction 의 경우 일정 시간이 초과하면 카메라 방향이 가게 RotationAmount 값을 바꿔줌 (NotMoving State)
    • Aiming Direction 의 경우 앞에서 말한 Rotate R90/L90 State 에서 RotationAmount 값을 바꿔줌. (Rotate R90/L90 State)
  • 모두 RotationAmount 라는 Curve 값을 조정해 외부에서 이 값을 이용해 회전시킴
    • 이때 Rotate Rate 값을 이용해 ModifyCurve 에서 Scale 을 시킴
    • 이 값을 사용해 PlayerBP 에서 캐릭터를 돌리는데 CurveValue * DeltaTime * 30 을 사용함
    • 위의 Animation 설명에서 나오듯 90도 당 그래프의 넓이가 3정도 나오기 때문임.
  • Rotate R90/L90 은 Aim 의 경우에만 적용됨
    • Rotate_L90/R90 Animation 이 들어감
    • 딱 카메라 정면으로 돌진 않고 약간 비정확한 경향이 있었음
  • NotMoving 에서는 Looking Direction 의 경우에 회전시킴.
    • 여기에서 Turn/Rotate Slot 이 합쳐짐.
    • Looking Camera Direction 일 때, 이 Slot 에 TurnIP_L90/L180/R90/R180 Animation 을 넣음
    • 이는 카메라와 캐릭터가 다른 방향을 일정 시간 이상 볼 때 수행됨

댓글남기기