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

 

로컬에서는 잘 되는데, 클라이언트에서 테스트 해보면 특정 상황에서 왠지 하늘만 보고 있는 현상이 생긴다.

 

 

서버에서 왜 이상한 곳을 바라보고 있는지 확인하기 위해, Pitch 값을 출력해본다.

 

 

0도 기준 위를 보고 있을 때는 문제가 없다.

 

 

0도보다 낮은 곳을 보고 있으면, Pitch가 음수가 아닌 360° - θ°의 값을 갖는 것을 볼 수 있다.

 

 

왜 네트워크를 통해 복제된 Pitch는 양수 값을 갖는지 확인해보자.

 

Character Movement 컴포넌트에서 PitchINT로 검색하면, 이 부분에서 Yaw, Pitch, Roll을 패킹하여 서버에 전송하는 것을 확인할 수 있다.

 

 

패킹된 Yaw, Pitch와 Roll의 자료형이 unsigned 타입으로 양수 값이다.

  • SavedControlRotation의 Yaw, Pitch, Roll에는 [0, 360) 으로 매핑된 각도가 들어있다.

 

 

이 곳에서 복제된 Pitch가 양수가 된 이유를 알 수 있다.

 

네트워크를 통해 동기화 요청을 자주 보내는 것은 부하를 일으키기 때문에 좋지 않다.

  • 그래서 RPC 요청은 Tick() 함수에서 하지 않는 것이 좋다.

 

네트워크 부하를 줄이기 위해 uint32에 2바이트 씩 Yaw와 Pitch를 끼워넣어 보내기 때문이다.

 

 

네트워크 부하를 줄이기 위해, [0, 360) 사이의 4바이트 float 각도는 아래와 같은 과정을 거쳐 [0, 65536) 사이의 2바이트 short 타입으로 압축된다.


0xFFFF와 AND 연산을 하는 이유는, 362° 등 범위를 넘어서는 값을 2°로 감아주기(Winding) 위함이다.

 

 

이제 이유를 알았으니 수정해준다.

 

로컬이 아닌 복제된 값이 90°보다 크면, [270, 360) 사이의 값을 [90, 0) 사이의 값으로 매핑시킨다.

 

 

Pitch 동기화 시 부호가 바뀌는 문제를 해결했다.

 

 

이제 애니메이션 블루프린트에서 Aim Offset을 제대로 적용해준다.

 

새로운 상태와 포즈 캐시를 만들어준다.

 

 

조준 시 true가 되는 애님 인스턴스의 bAiming 값을 따라, 올바른 Base Pose가 입력된 Aim Offset을 선택해 출력한다.

 

 

포즈 캐시를 추가한 최종 애님 그래프는 다음과 같다.

 

 

하지만, 아직 버그가 남아있긴 하다.

 

클라이언트에서는 서버로 동기화되지만, 서버에서 무기를 집고 시야를 조정할 경우 Yaw과 동기화되지 않는다.

  • 이건 캐릭터에 있는 bUseControllerRotationYaw 옵션 등이 자동으로 복제되는 변수가 아니기 때문이다.
  • 강사에 따르면 이후 강의에서 다룰 내용이니 지금은 넘겨도 된다고 한다.

 

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

옆으로 도는 애니메이션 적용  (0) 2023.04.16
FABRIK  (0) 2023.04.15
Aim Offset 적용  (0) 2023.04.13
Aim Offset  (0) 2023.04.12
조준하면서 걷기  (0) 2023.04.12
profile

Make Unreal REAL.

@diesuki4

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

검색 태그