1일1알

이동 동기화 본문

유니티/C# 서버 연동 유니티 포트폴리오

이동 동기화

영춘권의달인 2024. 5. 6. 18:06

멀티플레이 게임에서는 모두 같은 화면을 볼 수 있어야 하기 때문에 오브젝트들의 위치를 실시간으로 맞춰주어야 한다. 

동기화 작업에는 크게 두가지 경우가 있다.

하나는 클라이언트에서 먼저 움직인 뒤 서버에 확인을 받는 것이고

다른 방법은 서버에 허락을 받고 움직이는 것이다.

 

반응성이 중요한 Fps같은 게임들은 주로 첫번째 방식을 사용하고, 비교적 덜 중요한 MMORPG같은 게임들은 주로 두번째 방법을 사용한다고 한다.

 

나는 두번째 방법을 사용했다.

 

매 프레임마다 서버와 패킷을 주고받을수는 없기 때문에 위치, 방향 정보 등을 이용해 위치를 예측하고, 어긋났다면 다시 조정해주는 등의 작업이 필요하다.

 

처음에 패킷을 설계할때는 이동 방향, 바라보는 방향 정보만 서로 주고받도록 했더니 플레이어가 움직일수록 위치가 어긋나는 현상이 발행했다.

예를들어 클라이언트에서 A방향을 패킷으로 전송한 직후에 방향을 B로 바꿨다면 다음 패킷을 보내기 전까지 서버에서는 A방향을 향하고 있지만 클라이언트에서는 B방향을 바라보고 있다. 이런 상황이 계속 누적되다보면 위치가 계속 어긋나게 된다.

 

그래서 이방법은 안되겠다 하고 패킷 설계를 다시했다.

클라이언트에서는 이동 방향, 바라보는 방향, 위치 정보가 포함된 패킷을 보낸다.

서버에서는 이 패킷을 받아서 클라 위치, 이동 방향, 이전 패킷을 받은 시간 정보를 이용해서 다음 클라이언트의 위치를 예측하고 서버에 있는 플레이어의 위치 정보를 예측한 위치값으로 변경한다.

 

그리고 예측한 위치값을 해당 플레이어가 속해있는 Room의 모든 플레이어에게 보내준다.

서버에서는 Id, 예측한 위치, 바라보는 방향 정보가 포함된 패킷을 보내준다.

 

패킷을 받은 클라이언트에서는 현재 위치와 패킷으로 받은 위치 정보를 이용해서 이동할 방향을 설정하고 움직여준다.