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

률루랄라님의 프로필 이미지
률루랄라

작성한 질문수

[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버

유니티 연동 #4

강사님, 이동 동기화에 대한 질문 있습니다.

해결된 질문

작성

·

3.5K

1

혹시, 이동 동기화에 대한 방법이 두 가지 있다고 하셨는데,

1) 서버에서 허락 패킷이 왔을 때

2) 클라이언트가 먼저 이동하고 있다가 서버에서 응답이 오면 보정(보간)

먼저,

2)은 배틀그라운드 게임이 제가 기억하기에 이동을 하다가 갑자기 순간적으로 뒤로 가는 현상이 발생하는데 이 방법을 사용한 것인가요?? --- 첫 번째 질문

1)의 경우에 대해서는 어떤 상황인지 잘 모르겠습니다. 혹시 예시가 있을까요?? --- 두 번째 질문

그리고,

제가 두달 전에 Unity의 WebGL 플랫폼을 사용하여 실시간 멀티플레이어 축구 게임을 만든 적이 있습니다. Unity Client + Node.JS로 만든 서버를 사용하였습니다.

저는 동기화에 대한 지식이 없었기에 생각해낸 방법이 Client에서는 숨겨진 '분신'을 만들어 절대 위치 패킷을 받으면 '분신'이 움직이고 실제로 보이는 캐릭터는 따라가도록 구현하였습니다.

그리고 서버에 보내는 좌표는 실제로 보이는 캐릭터의 좌표를 보냈습니다.

(RagDoll Component를 사용하여서 다른 클라이언트와의 물리적 충돌이 활발하기 때문에 조금 늦게 모두 같이 이동시킬 방법을 생각하다가...)

물론 '분신'은 보이지 않고 Colider, Rigidbody도 없기 때문에 많이 애먹으면서 많은 런타임 버그들을 잡았었습니다.

혹시 이런 물리적 충돌이 많이 일어나는 경우의 실시간 멀티플레이어 게임들은 두 가지 동기화 방법 중 어떤 방법을 사용하나요? 또는 어떤 방법을 더 많이 사용하나요? --- 세 번째 질문

그리고 수업 너무 좋았습니다. 아직 더 배워야 겠다는 생각과 함께 뿌듯합니다.

감사합니다!!

답변부탁드리겠습니다!

답변 4

3

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

보여주는 포폴 수준이라면 사실 딱히 상관없는 문제인데
굳이 느린 인터넷 속도도 고려하시는거 보니
추가적인 작업을 하시는거 같군요.
충돌 시뮬레이션을 특정 클라에게 맡기게 되면
아무리 반응속도가 빠른 애를 고른다고 해도
근본적인 해결책은 되지 않을 것 같습니다. (모두 인터넷 속도가 느리다면..?)
결국 가장 큰 문제는 클라 해킹에 무방비로 뚫린다는 점 같네요.

모든 충돌 판정 구현을 서버 로직으로 갖고 오는게 부담이 된다면
언리얼 엔진의 Dedicated Server처럼
클라 코드도 그대로 서버로 갖고 올 수 있는
프레임워크를 알아보는게 맞지 않을까 싶습니다.

그게 아닌 클라 기반 판정은 어차피 '나비 효과'를 막을 방법이 딱히 없습니다.

2

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

첫 번째 질문)
생각하신게 맞습니다.
FPS 게임은 무조건 [클라에서 먼저 이동하고, 서버에 통보하는] 방식을 채택합니다.
그리고 사실 장르와 무관하게 키보드로 이동하는 게임에서
서버의 허락을 기다렸다가 이동하면 지연 시간 때문에 답답해서,
보통 2번 방식을 사용합니다.

배그에서 가위 눌린 현상이 일어나면서 위치가 롤백되는 현상은,
(살짝 렉 걸린) 서버에서 보기에 클라가 비정상적으로 많이 이동했다고 판단해서
강제로 원위치로 복귀하라고 혼내준 현상이라고 보시면 됩니다.

두 번째 질문)
의외로 마우스 기반으로 이동하는 게임에선
서버 허락을 기다렸다가 이동하는 경우가 꽤 있습니다.
가령 지금 북미 LOL 접속해서 테스트를 하시면,
실제 스킬을 쓰거나 이동을 하면 1~2초 후에 캐릭터가 이동할거에요.

세 번째 질문)
[클라에서 먼저 이동하고 서버에 통보하는] 방식에서
보통 클라는 서버한테 자기가 이동할 다음 목적지를 보내주게 됩니다.
그 정보를 서버가 다른 클라한테도 뿌려주면,
설령 좌표가 이미 살짝 틀어진 상태라고 해도,
어차피 동일한 목적지를 향해 달려가므로 어느 정도 자연스럽게 보정이 됩니다.
말씀하신 '숨겨진 분신'이 제가 이해하기론 목적지와 유사한 형태 같네요.

그리고 물리적 충돌, 특히 유닛끼리의 충돌이 일어나는 게임에서의 동기화 방법은,
정말 솔직히 말씀드리면 정해진 답이 없고 매우 어렵습니다.
(특히 MMO에서  유닛 충돌을 제대로 구현한 경우는 없다고 봐야죠.)
클라에서 먼저 이동하고 충돌 연산을 클라에 분산시키면 매우 아름답겠지만
아주 미세한 위치 차이로 인한 나비효과가 어마어마하게 굴러갈 수 있고,
반대로 서버 허락을 일일히 맡기에는 서버측 충돌 연산의 CPU 부하가 어마어마하겠죠.

어느쪽 방법이 낫냐는 질문에는 사실 게임 장르와 유닛(몬스터/PC) 수에 따라 달려 있습니다.
만약 유닛 수가 많지 않다면 그냥 서버에서 판정을 하고
클라에선 야금야금 조금씩 허락맡아 이동하는게 확실하지만,
유닛이 많아지면 동기화 부하가 너무 심해지니 현실적으로 불가능해집니다.
가령 디아블로3에서도 유닛끼리의 충돌이 있는데,
렉이 심해지면 '가위 눌리는' 현상이 일어나면서 전체 위치 롤백을 통해
동기화를 다시 해주는걸 보면
이는 [클라에서 먼저 이동하는] 방식이라고 유추할 수 있습니다.
참고로 리니지M 등 MMO에서 충돌을 구현할 땐,
실제 유닛끼리의 충돌 연산을 하는게 아니라
그리드 방식으로 좌표를 관리해서 해당 그리드에 객체가 있는지만을 봅니다.


0

률루랄라님의 프로필 이미지
률루랄라
질문자

감사합니다!!!

많이 찾아봐야겠네요.

0

률루랄라님의 프로필 이미지
률루랄라
질문자

그리드 방식에 대해서는 처음 들었습니다

한 번 알아봐야겠네요

답변 감사합니다!

죄송하지만 답변 하나만 더 부탁드릴게요

사실은 락스텝을 구현해보려 했는데 많이 어려움을 느껴서 "숨겨진 분신"을 이용하였고 충돌에 관한 시뮬레이션은 방장호스트로 시뮬레이션 했습니다(방장이 유리)

인터넷 속도가 빠른 경우에 원활하게 되는 것을 확인하고 시간이 없어서 프로젝트를 마무리했습니다.

이후 인터넷 속도가 느려질 경우를 테스트 했는데 말씀하신 나비효과들이 게임 진행을 힘들게 하네요

그래서 rtt를 구해서 우선순위를 정하고 스위칭 비용을 최소화하는 방향으로 속도가 빠른 클라이언트로 시뮬레이션하려고 합니다. 물론 컴퓨터 사양에 대해서는 신경 안쓰려고 합니다

rtt의 변화폭에 대한 처리와 어느 주기로 rtt를 사용하는 것이 적당한지 궁금합니다.

물론 게임 서버란 것이 게임 종류에 따라 답이란 것이 존재하지는 않지만 경험에 대한 답을 듣고 싶습니다!

만들어본 게임은 방마다 2~6명씩 플레이하는 축구게임입니다.

참고로 어떤 게임인지에 대해서 자세한 것은 밑에 링크 남깁니다. 뒷 부분에 게임 영상이 있기 때문에 뒷 부분만 보시면 됩니다(7:25~10:40) 사이로 보시면 될거같습니다

https://youtu.be/CY_0aiE8Glg

률루랄라님의 프로필 이미지
률루랄라

작성한 질문수

질문하기