인프런 커뮤니티 질문&답변

초보언리얼님의 프로필 이미지

작성한 질문수

이득우의 언리얼 프로그래밍 Part3 - 네트웍 멀티플레이 프레임웍의 이해

SetActorLocation, Rotation이 제대로 적용되지 않는 이슈

해결된 질문

23.11.13 17:11 작성

·

328

·

수정됨

0

안녕하세요 이득우 선생님.

강의를 듣고 혼자 실습해보다가 의문이 생겨서 결국 이곳에 질문을 드리게 되었습니다.

 

제가 데디케이티드 서버 환경에서 캐릭터의 위치와 회전을 원하는 값(정해진 위치와 회전)으로 지정하여 변경시키는 실습을 혼자 해보고 있었는데, 간헐적으로 캐릭터가 제대로 정해진 위치로 이동하지 않거나, 회전값도 제대로 돌아가지 않는 문제가 발생하는것 같습니다.

혼자 열심히 찾아보고 고민하면서 내린 생각은, 서버 RPC함수를 통해 SetActorLocation을 수행하였는데, 서버에서 위치 혹은 회전값을 변경시키기전에 캐릭터가 '직전에' 이동하려고 했던 값이 아직 서버 패킷? 같은곳에 남아있어서 이전 이동 정보로 인해 위치 혹은 회전 변경 함수가 서버에서 적용된 이후 곧이어서 뒤늦게 도착한 캐릭터 위치 혹은 회전 변경값에 의해 다시 값이 바뀌어서 원하는 위치와 회전이 나오지 않는거지 않을까 혼자 추측만 하고 있습니다.

 

제가 원하는 결과를 얻기 위해서 무엇을 고려하고, 혹은 이런 상황이 많이 벌어질것 같은데, 어떻게 해결하면 좋을지 궁금합니다.

 

추운 날씨에 좋은 강의 주셔서 공부하는데 몹시 도움되고 있습니다. 감사합니다.

답변 1

0

이득우님의 프로필 이미지
이득우
지식공유자

2023. 11. 13. 20:39

안녕하세요.
캐릭터의 트랜스폼 동기화는 간단하면서도 어려운 주제입니다.
게임의 성향과 스타일에 따라 추구하는 동기화 전략이 다르기 때문에 어떤 방법이 정답이다라고 단정할 수 없습니다.
몇 강까지 들으셨는지 잘 모르겠습니다만, 언리얼의 경우 기본적으로 100명이 들어가는 배틀로열 슈팅장르에 적합한 기능으로 구현되어 있습니다. 한턴 한턴의 움직임이 중요한 전략게임이나 대규모 유저를 수용해야하는 MMORPG는 또 다른 전략으로 접근해야 합니다.
언리얼 엔진으로 한정해 설명드리자면, 캐릭터의 움직임 동기화는 캐릭터 무브먼트 컴포넌트가 전담하고 있습니다.
캐릭터 무브먼트는 패킷 손실을 감수하고 최대한 움직임에 대한 많은 정보를 보내 동기화되는 방식을 택하고 있지만, 이 중에서 또 중요한 패킷은 별도로 처리하는 과정을 내부적으로 프로토콜을 만들어 진행합니다. 그리고 모든 움직임 정보를 보내기보다 보내기전에 최대한 움직임 정보를 병합하고 데이터를 최소화하는 작업등을 거칩니다.
클라이언트 패킷 및 서버의 패킷은 언제든지 소멸될 수 있고 지연될 가능성이 있습니다. 그래서 수업에서 의도적으로 랙을 발생시켰던 것이고, 이를 보완하기 위한 부가 장치를 고민해야 합니다. 언리얼 엔진이 진행하는 것처럼 인해전술(?)을 사용하는 방법도 있고, 돌다리 건너듯이 하나의 움직임을 확실히 체크하는 방법도 있겠습니다.
다만 게임에서의 움직임이 어떤 것을 지향하느냐에 따라 최적의 전략은 달라지기 때문에, 저도 어떻게 해야한다라고 설명드리기 어렵네요.
13강에서 설명드리긴 하지만 하단의 고급 토픽을 한번 참고해보시기 바랍니다.
https://docs.unrealengine.com/5.1/ko/understanding-networked-movement-in-the-character-movement-component-for-unreal-engine/

좋은 하루 되세요.