강의

멘토링

커뮤니티

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

홍지범님의 프로필 이미지
홍지범

작성한 질문수

[켠김에 출시까지] 유니티 캐주얼 모바일 MMORPG (M2)

선 이동과 히트 판정에 대해 질문 드립니다.

작성

·

47

0

안녕하세요. 루키스님!
M2 코드를 분석하면서, 약간 다른 게임을 (브롤스타즈같은 모바일 탑뷰 슈팅게임) 만들고 있습니다.

선 이동으로 구현하고 있는데, 서버 판정 이후 해결되지 않는 부분이 있어 질문 드립니다.

 

현재까지 구현한건 키보드 기반 간단한 이동 동기화 입니다.

image.png

 

이동 방법은 키보드나 조이스틱 기반의 선 이동으로 구현하려 합니다.
지금 이동 코드는 루키스님 질의응답과 해외 커뮤 글을 토대로 아래 방식으로 구현 했습니다.

  1. 0.1초마다 동기화를 시도함

  2. 키보드 입력이 있으면 desirePos를 그 방향으로 0.1초동안 갈 수 있는 pos 를 찍음

  3. 클라 판단으로 갈 수 있는 곳(벽X, 장애물 X) 이면 destPos를 갱신

  4. 서버로 전송

  5. 서버에서 정당한 이동 요청인지 판정

  6. 맞으면 브로드캐스트

  7. 각 클라에서 이동 패킷 수신 후 캐릭터 갱신

 

여기까지 하면 어느정도 자연스럽게 작동은 합니다.
하지만 이동을 보낸 클라 입장에서 서버로 부터 받은 판정을 적용하는 부분에 어려운 부분이 있습니다.
아무래도 선 이동이 예측 이동 후 보정이라 네트워크 지연으로 예측과 판정이 너무 많이 틀어지는 경우가 있을 것 같습니다.

예를들어, 클라에서 단순 우측으로만 움직인다고 가정하고, x 축으로 10 -> 11 -> 12 -> 13 선 이동을 했다는 가정으로 시작하겠습니다.
네트워크 지연으로 13에 도달했을 때 서버에서 10 이동 동기화가 왔다면, 선 이동 클라는 10으로 튕겨 버립니다. 그 후 방향을 바꿔 왼쪽으로 움직이면 10 -> 9 -> 8 -> 7 로 먼저 움직이겠지만, 이미 서버로 보낸 이동 좌표로 인해 11, 12, 13이 또 오기 때문에 캐릭터는 퉁퉁 튀면서 움직이지 못하는 상태가 될 것 같습니다.
또한, 다른 클라에서 공격을 해도 히트 판정이 다 꼬여 게임이 이상해질 것 같습니다.

 

이 문제를 해결하기 위해 고민해보니, 클라에서 선 이동 버퍼(기록)을 둔다고 합니다.
이 버퍼는 아래 문제가 생겼을 때 서버 판정을 다시 replay 하고, 서버 판정을 완료하면 다시 저장된 선 이동 버퍼를 replay 해 클라에서 너무 앞서나가지 않도록 하더라구요.

  • 선이동 버퍼의 index와 서버 판정의 index가 n 이상 벌어지면, 서버 판정 index의 pos 로 플레이어 위치를 되돌리고 클라 선 이동 판정을 다시 실행시킴.

     

  • 서버 판정으로 이동할 수 없는 pos 라면, 해당 pos 로 되돌리고 그 그 이후 선 이동 버퍼를 replay

 

여기서부터 질문입니다만,

  1. 이런 방법이 쓰이는 이유는 게임 전체의 공정성 때문 일까요?
    네트워크 문제가 있는 일부 클라는 계속 롤백되는 경험을 하지만, 다른 유저들은 서버에서 허가한 상태만 보니까요.

  2. 보통 선 이동 버퍼와 서버 판정은 어느정도로 갭을 두나요?
    0.1초마다 동기화 한다고 가정 하고 이동 패킷은 ++1 인 정수형 인덱스로 구분한다고 했을 때, 저는 한 4 정도로 생각했습니다.
    선 이동과 서버 판정이 약 0.4초이상 벌어지면 롤백하고 다시 동기화 한다 입니다.

  3. 히트 판정의 경우 클라들, 서버가 같은 ticktime을 공유하고 있고 서버에서 내려준 히트 시작 시간을 보내주면, 클라에서 timejob queue에 넣어두었다가 해당 시간이 되면 애니메이션을 시작하면 되지 않을까? 라는 생각 입니다.


고민을 많이 해보았는데, 이 이상 생각이 안되어 질문 드립니다.
바쁘시겠지만 답변 주시면 감사히 학습에 사용하겠습니다.



 

 

답변 1

0

안녕하세요, 인프런 AI 인턴입니다. 홍지범님!

선 이동과 히트 판정 문제에 대해 상세한 설명과 함께 질문 주셔서 감사합니다. 모바일 탑뷰 슈팅 게임을 개발하신다고 하시니, 동기화와 판정 문제는 매우 중요한 요소입니다. 관련하여 몇 가지 드릴 수 있는 팁과 유사한 답변 정보를 제공드릴게요.

서버 판정과 동기화

먼저, 선 이동을 예측하고 이후 서버판정으로 보정하는 방식은 네트워크를 통해 얼마나 자연스러운 게임플레이를 제공할 수 있는지를 결정하는 중요한 요소입니다.

  1. 게임의 공정성: 말씀하신 것처럼, 이 방식은 철저히 게임의 공정성을 유지하기 위한 것입니다. 네트워크 지연이 있는 경우라도, 서버 판정을 기준으로 모든 플레이어에게 동일한 게임 상태를 보여주기 위해 사용됩니다. 특히, 경쟁적인 게임에서는 클라이언트의 상태를 스스로 결정할 수 없게 하고, 항상 서버의 판단을 따르게 함으로써 치트를 방지하고 공정성을 유지합니다.

  2. 버퍼와 서버 판정의 갭: 0.1초마다 동기화하는 경우, 선 이동 버퍼와 서버 판정을 약 0.4초(즉 4번의 동기화 주기) 이상 벌어지면 롤백하고 다시 동기화하는 방식은 합리적입니다. 이는 네트워크 환경과 게임의 속도에 따라 다를 수 있지만, 일반적인 경우라면 충분히 수용 가능한 범위입니다. 네트워크 품질이 좋지 않거나 환경이 불안정할 경우 갭을 줄이거나 늘리는 조정이 필요할 수 있습니다.

  3. 히트 판정과 타임 매니지먼트: 히트 판정은 클라이언트 간의 동기화된 시간을 기준으로 이루어지는 것이 가장 좋습니다. 서버에서 내려주는 히트 시작 시간을 사용해서 각 클라이언트가 동일한 시간에 애니메이션을 시작하도록 하는 방법은 매우 합리적입니다. 이렇게 하면 모든 클라이언트에서 같은 타이밍에 공격 효과가 나타날 수 있으니 자연스러운 일관성을 유지할 수 있습니다.

관련 질문

또한, 이동 동기화에 대한 정보는 인프런의 다른 유사 답변에서 확인하실 수 있습니다. “강사님, 이동 동기화에 대한 질문 있습니다.” 에서 Rookiss 강사님의 자세한 설명을 참고하시면 많은 인사이트를 얻으실 수 있습니다.

위 링크가 도움이 되길 바라며, 질문자님의 이해를 돕고자 관련 정보와 함께 가능한 해답을 제시해드렸습니다. 추가적으로 궁금한 점이 있으시다면, 이어서 질문 주셔도 좋습니다. 곧 지식공유자께서 답변해주실 것입니다.

현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏

추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

홍지범님의 프로필 이미지
홍지범

작성한 질문수

질문하기