[게임 서버] 플레이어 이동

이정석·2023년 8월 30일

게임서버

목록 보기
2/14

플레이어 이동

이동기능을 구현할 때 나의 이동방식과 다른 사람의 이동방식은 비슷하지만 다른 사람의 이동방식은 서버의 정보를 바탕으로 움직인다는 것이 다른점이다. 만약, 싱글게임을 먼저 구현한 후 멀티게임으로 이식하는 과정을 거친다면 플레이어 이동을 구현하기 위해 가장 먼저 해야할 일은 다른 플레이어를 구분하는 것이다.

내 플레이어의 이동방식은 주로 사용자의 입력값이다. 게임의 종류에 따라 다르겠지만 FPS의 경우는 WASD일 것이고 RPG인 경우는 마우스, 방향기가 이동을 위한 입력값이 될 것이다.

1. 패킷

이동을 위한 패킷을 설계할 때는 플레이어의 정보위치 정보를 분리 시키는 방법이 있다. 이동패킷은 총 두 종류로 클라이언트가 서버에게, 서버가 클라이언트에게 보내는 패킷이 존재한다.

  1. 클라이언트 --> 서버
    클라이언트가 서버로 보내는 패킷은 '내가 [X,Y]로 이동함'을 의미한다. 그렇기 때문에 패킷에 포함된 내용은 이동하고자하는 위치 정보면 충분하다.

  2. 서버 --> 클라이언트
    서버가 클라이언트에게 보내는 패킷은 '~~가 [X,Y]로 이동함'을 의미하기 때문에 플레이어를 구분하기 위한 PlayerID가 패킷에 포함되어야 한다.

2. 서버

플레이어 이동을 구현하는데 서버가 하는 역할은 간단하다. 클라이언트로부터 받은 정보에 클라이언트 식별번호를 추가해 다른 클라이언트에게 전달하는 에코서버로써 작동한다.

패킷을 받고 전달하는 과정 사이에 '정말로 받은 이동정보가 유효한것인가?'에 대한 검증단계를 추가할 수 있다. 만약, 이후에 플레이어 상태를 추가하고자 하면 이동정보에 체력이나 그로기상태와 같은 추가정보를 같이 전달할 수 있다.


MyPlayer

클라이언트에서 이동정보를 서버로 보낼 때 '언제 서버에 이동정보를 보내야 하는가?'를 정해야 한다.

첫번째로 클라이언트에서 먼저 이동한 후 이동한 위치를 보내는 방식이 있다. 물론 서버에서는 이동정보에 대한 검증과 피드백이 이뤄져야한다. 사용자 입정에는 입력과 거의 동시에 이동이 이뤄지기 때문에 쾌적한 이동이 가능하다.

두번째는 클라이언트에서 이동이 가능한지 서버에 물어본 후 OK판정이 나면 이동하는 방식이다. 이러한 방식은 위의 방식보다 사용자의 입력으로부터 실제 이동까지의 시간이 걸리긴 하지만 서버의 구현이 위 방식보다 비교적 간단하다는 장점이 있다.

두번째 방법의 구현이 더 간단한 이유는 이동정보의 검증과 피드백이 동시에 이루어지기 때문이다. 만약 첫번째 방법에서 핵프로그램과 같은 유효하지 않은 입력정보가 들어온다면 서버는 해당 클라이언트의 위치정보를 보정하기 위한 추가조치를 취해야할 것이다. 하지만 두번째 방법에서 같은 상황이 발생한다면 OK판정이 아닌 NO판정을 내림으로 비교적 간단하게 위치정보를 수정할 수 있다.


Player

클라이언트에서 다른 플레이어를 랜더링할 때 가장 중요한 요소중 하나는 동기화이다. 즉, 내 플레이어가 나타나는 모습과 다른 사용자에게 보이는 모습이 같아야 한다는 것이다. 이를 위해 클라이언트는 내 플레이어다른 플레이어의 기능을 구분해야할 것이고 오직 서버로부터 받은 정보만 랜더링하고 직접 다른 플레이어의 상태를 변경하지 않아야 한다.

내 플레이어와 다른 플레이어의 대표적인 기능차이는 다음과 같다.

  1. 사용자 입력: 사용자의 입력이 다른 플레이어의 상태에 영향을 미치면 안된다. 여기서 말하는 영향은 공격이나 스킬사용으로 인한 상태변화가 아닌 서버를 거치지 않고 랜더링단계의 상태변화를 의미한다.
  2. 카메라 고정: 기본적으로 카메라는 내 플레이어를 가리키고 있어야한다.
  3. 패킷 전송: 이동정보는 내 플레이어의 이동정보를 담은 패킷을 전송해야하며 다른 플레이어의 이동정보를 전송하지 않는다.
profile
게임 개발자가 되고 싶은 한 소?년

0개의 댓글