Make Unreal REAL.
article thumbnail
Unreal Engine 5 C++ Multiplayer Shooter

 

이제 [-90°, 90°] 범위를 벗어났을 때 옆으로 도는 애니메이션은 작동하니, 실제로 캐릭터의 회전도 돌려보도록 한다.

 

현재 가만히 있을 때는 bUseControllerRotationYaw 옵션을 꺼서 캐릭터의 몸은 바닥에 고정되어 있고, Aim Rotation을 통해 AO_Yaw를 계산해 무기를 조준하고 있다.

 

 

따라서, 현재는 좌측과 같은 상황이다.

  • 무기는 마우스에 따라 해당 방향을 조준하고 있지만, 실제로 캐릭터는 빨간 화살표의 방향을 보고 있는 것이다.

 

[-90°, 90°] 범위를 벗어났을 때 해당 방향(회전)으로 몸을 돌리기 위해서는, 우측과 같이 실제 캐릭터의 방향도 빨간 화살표의 방향이 되어야 한다.

  • 단, 이때도 캐릭터의 발은 땅에 고정되어 있어야 한다.

 

 

이를 간단하게 해결하고자 bUseControllerRotationYaw 옵션만 켜주게 되면 캐릭터가 빨간 화살표 방향을 보게 되지만, 캐릭터 자체가 돌게되어 다리가 함께 돌게게 된다.

  • 캐릭터는 빨간색 화살표의 방향(회전)을 갖지만, 회전한 만큼 Aim Offset이 적용되어 무기는 더 먼 곳을 조준하게 된다.

 

 

따라서 다리는 땅에 고정되어 있고 캐릭터는 앞을 보고 있는 것 같지만, 캐릭터의 실제 방향(회전)과 무기가 조준하고 있는 방향은 빨간 화살표에 맞추기 위해서는 추가적인 작업이 필요하다.

 

 

캐릭터의 방향을 빨간 화살표에 맞추기 위해서는 bUseControllerRotationYaw 옵션이 필수적으로 켜져 있어야 하기 때문에 이것을 끌 수는 없다.

 

그래서 생각해볼 수 있는 방법은, 기준점(하늘색 화살표)으로부터 회전한 양인 AO_Yaw만큼 반대 방향으로 애니메이션을 회전시켜 재생하는 것이다.

 

그러면 Aim Offset에 따라 무기도 조준되고, 캐릭터는 가만히 서서 조준하고 있는 것처럼 보이지만, 실제로는 빨간 화살표의 방향(회전)을 가지게 된다.

 

 

애니메이션을 특정 회전만큼 회전시켜 재생하는 노드가 Rotate Root Bone 노드이다.

  • Pitch와 Mesh to Component Rotator는 사용하지 않을 것이므로 숨겨준다.

 

회전한 AO_Yaw만큼 반대 방향으로 회전해 재생시켜 줘야 가만히 서있는 것처럼 보일 것이므로, -1을 곱해줘야 한다.

 

 

그러면 이제 앞을 보고 무기를 조준하는 것 같지만, 실제로 캐릭터는 빨간 화살표의 방향(회전)을 갖게 된다.

  • 회전한만큼 애니메이션이 반대로 회전해 재생되어 가만히 서서 조준하는 것처럼 보이기 때문이다.

 

 

[-90°, 90°] 범위를 넘어갔을 때 부자연스럽게 회전이 끊기는 것처럼 보이는 걸 방지하기 위해, 보간을 사용할 것이다.

 

[-90°, 90°] 범위가 넘어가 TurningInPlace의 상태가 ETIP_Right나 ETIP_Left가 되면, FMath::FInterpTo() 함수를 이용해 서서히 0으로 수렴시킨다.

  • 0과의 차이가 15 미만이 되면 회전을 멈춘다.
  • 회전이 멈추면 상태를 초기화하고, AO_Yaw를 구할 때 새로운 기준 회전이 될 StartingAimRotation도 새로 할당해준다.

 

 

보간을 통해 AO_Yaw 값을 0에 수렴시킨다는 건, Rotate Root Bone 노드에 이 값이 전달되어 서서히 회전된 애니메이션의 하늘색 화살표 방향이 빨간 화살표 방향에 맞춰진다는 뜻이다.

  • 15°가 되면 멈추게 했으므로, 75°의 방향으로 옆으로 돌게 된다.

 

 

이제 서 있을 때와 앉았을 때 모두에서 옆으로 도는 애니메이션이 끝나는 시점을 정해준다.

 

 

보간이 끝났거나, 움직이거나, 점프하거나, 재생 시간이 0.1초 밑으로 남았으면 Idle 상태로 복귀한다.

 

 

멀티 플레이어에서도 잘 작동한다.

 

 

기존에 클라이언트에서는 Yaw가 서버로 동기화됐는데, 서버에서는 클라이언트로 동기화되지 않는 버그가 있었다.

 

하지만, bUseControllerRotationYaw 옵션을 켜주면서 이 문제가 해결되었다.

 

'Unreal Engine > UE5 C++ Multiplayer Shooter' 카테고리의 다른 글

움직임 개선  (0) 2023.04.19
네트워크 갱신 주기  (0) 2023.04.18
옆으로 도는 애니메이션 적용  (0) 2023.04.16
FABRIK  (0) 2023.04.15
회전 리플리케이션 시 고려할 사항  (0) 2023.04.14
profile

Make Unreal REAL.

@diesuki4

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

검색 태그