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

jamiser159님의 프로필 이미지
jamiser159

작성한 질문수

[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)

Hit 판정 #1

서버 측에서의 맵데이터 관리 및 충돌판정

작성

·

1.4K

1

이번 강의를 보면서 궁금했던 점 중 하나가 맵에 대한 정보를 사전에 만들어서 클라와 서버가 사용하는 방식의 경우 특정 사용자가 악의적으로 맵에 대한 정보를 클라쪽에서만 수정할 수 있을 거 같습니다. 해당 방식말고 서버측에서만 맵 데이터를 만들고, 클라이언트가 접속을 할 때 서버측에서 파일을 전송하거나 정보를 제공하는 방식으로도 구현하는 경우가 있나요?

다른 궁금점은 타일맵같은 경우는 충돌판정이 비교적 간편해서 사용자가 손쉽게 구현하여 적용할 수 있는데, 2D, 3D 충돌판정은 타일맵보다 복잡하고 성능을 많이 잡아먹는데 서버측에서 계산하여 클라이언트에게 충돌 판정여부를 알리나요? 굳이 알리지 않더라도 2D, 3D 게임에서 충돌판정여부를 서버 측에서도 계산하여  Hit판정이나 이동가능 판정같은 거를 게임에 적용하나요?

답변 4

3

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

그런 경우 고정맵이 아닌 부분들에 대해서는
추가 패킷으로 받아줘서 처리를 해줘야 합니다.
(아니면 워크 유즈맵처럼 맵을 처음부터 받아준다거나)

3

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

이번 강의를 보면서 궁금했던 점 중 하나가 맵에 대한 정보를 사전에 만들어서 클라와 서버가 사용하는 방식의 경우 특정 사용자가 악의적으로 맵에 대한 정보를 클라쪽에서만 수정할 수 있을 거 같습니다.

-> 물론 그럴 수도 있습니다.

해당 방식말고 서버측에서만 맵 데이터를 만들고, 클라이언트가 접속을 할 때 서버측에서 파일을 전송하거나 정보를 제공하는 방식으로도 구현하는 경우가 있나요?

-> 그렇지는 않습니다.
게임 해킹은 굉장히 다양한 방식으로 할 수 있는데, 광범위하게 분류하면
- 리버싱을 통한 바이너리 or 데이터 파일 수정
- 패킷 조작
- 메모리 조작
으로 구분할 수 있습니다.

파일 조작이 의심된다고 서버측에서 파일을 전송하는 것은
단순히 네트워크 트래픽만 잡아먹는 행위이고
보안 관점에서 아무런 도움이 되지 않습니다.
왜냐하면 네트워크 파일 전송을 통해 맵 정보를 로드하나, 클라 데이터 파일을 통해 로드하나,
결과적으로 맵 정보를 클라 쪽 메모리에 올려서
관리해야 하는 것은 동일하기 때문입니다.
따라서 말씀주신 방법으로 서버에서 맵정보를 전송할 경우라도
서버 측에서 전송한 네트워크 정보를 가로채거나,
아니면 메모리에 올라간 부분을 리버싱을 통해 찾아서
맵 정보를 얼마든지 추출하거나 조작할 수 있습니다.

온라인 게임을 만들 때,
[클라는 어차피 모든 소스코드와 데이터가 공개되어 있다 가정하고,
모든 보안은 서버에서 처리한다]~는 절대 법칙을 기억하시면 됩니다.
따라서 당연히 클라에서 맵 정보는 조작할 수 있다고 가정하고
이동할 수 없는 지역에 간다거나 하는 수상한 행동을 하면,
이를 서버 측에서 검증하고 걸러줘야 합니다.
이를 누락하면 스피드핵 등에 뚫릴 수 밖에 없는 것이죠.

다른 궁금점은 타일맵같은 경우는 충돌판정이 비교적 간편해서 사용자가 손쉽게 구현하여 적용할 수 있는데, 2D, 3D 충돌판정은 타일맵보다 복잡하고 성능을 많이 잡아먹는데 서버측에서 계산하여 클라이언트에게 충돌 판정여부를 알리나요? 굳이 알리지 않더라도 2D, 3D 게임에서 충돌판정여부를 서버 측에서도 계산하여  Hit판정이나 이동가능 판정같은 거를 게임에 적용하나요?

클라는 60~200프레임 단위로 돌고 
서버는 잘해야 10프레임이기 때문에
모든 충돌 판별을 서버에서 할 수는 없습니다.

클라에서 먼저 판별을 하고 그것을 서버에서 러프하게 검사하는 식으로 만들게 됩니다.
단 MMO가 아닌 FPS 게임이라면 조금 방식이 다른데,
서버 쪽에서도 30 프레임 정도로 연산을 해서 실제 물리 연산을 해야 합니다.
(그래야 총알 판정을 할 수 있기에)

0

jamiser159님의 프로필 이미지
jamiser159
질문자

세세한 답변감사합니다!

0

jamiser159님의 프로필 이미지
jamiser159
질문자

빠르고 자세한 답변 감사합니다!!

그렇다면은 뭔가 MMO처럼 회사측에서 크게 서버를 관리하는 게임이 아닌 유저 측에서 게임의 콘텐츠를 바꿔서 서버를 유저가 구동하는 게임의 경우에서는 유저마다 맵이나 게임의 구성요소를 추가할수도 있는데, 이러한 요소를 클라가 서버에 접속할 때 다운받거나 정보를 얻는 식으로 구현하는건 괜찮은 방법인가요? 얘를 들어 마인크래프트나 게리모드 등등 다양한 게임들이 유저가 콘텐츠를 제작할 수 있는데 이러한 경우들에서는 어떻게 구현하나 궁금하여 첫번째 질문을 드린 것도 있습니다.

jamiser159님의 프로필 이미지
jamiser159

작성한 질문수

질문하기