버그 해결을 위한 모든 질문을 던져
+1 vote
117 views
멀티플레이 FPS을 개발할 때 총을 쏘면 레이캐스트 실행은 어디서 해야 하나요?

총을 쏜 플레이어의 컴퓨터에서 해야 하나요? 아니면 서버에서 해야 하나요?
보안적인 측면에서는 RayCast 함수을 서버에서 실행하고 그 결과에 대한 처리도 서버에서 한 후 클라이언트에 통보해 줘야 할것 같은데...
이거 왜 질문하냐면 언리얼 멀티플레이 FPS 예제 프로젝트을 분석하고 있는데 RayCast함수을 클라이언트에서 하고 그 결과인 HitResult을 서버에 넘겨서 서버에서 Hit한 캐릭터에 데미지을 적용하는 식으로 구현되어 있어서요~

RayCast은 클라이언트에서 하지만 그 결과인 HitResult은 서버에 넘겨서 실제 데미지 적용은 서버에서 합니다. 그런데 만일 클라이언트에서 서버에 이 HitResult값을 조작해서 보내게 되면 문제가 발생하지 않을까요?

서버에서 모든 클라이언트들의 총알 한발 한발에 대해 RayCast을 처리하게 되면 너무 많은 부하가 발생해서 이런식으로 처리한 걸까요?

온라인 FPS 실무 경험이 있는 분들은 어떻게 처리하시나요?
asked (13 point)
수정됨 , 117 views

2 answers

+1 vote
말씀하신대로 클라이언트에서 판정을 진행하고 결과를 쏘면 해킹 이슈가 발생할 수 있습니다. 아레나 방식의 온라인 FPS 게임(8vs8)들은 이와 같은 판정을 사용 했습니다. 서버 부하 문제도 있고, 무엇보다 10ms의 반응성 차이가 게임 경험을 크게 좌지우지하다보니 "눈에 보이는 걸 쐈을때 맞아야 한다"라는 유저들의 요구를 맞추기 위해서는 조금이라도 그 레이턴시를 줄여야 했습니다. 요즘 월드가 큰 배틀로얄 같은 게임들은 데디에서 총알의 발리스틱까지 다 계산을 합니다. 아레나 게임에선 타격감을 명목으로 빵빵하게 울리는 킬사운드와 메시지 같은 스타일은 사라지고, 킬로그가 바로 뜨지 않고 조금 늦게 뜨도록 연출하거나 하는 식으로 그 감각을 무디게 연출합니다. FPS라고 해도 일관적으로 하나의 방식을 택하진 않고, 그 세부 장르(아레나, 배틀로얄, 코옵 등)와 유저 성향에 따라 트레이드오프지점을 선택합니다.

적당한 타협점으로 클라이언트 사이드에서도 레이캐스트를 진행하고 판정하며 서버는 그 데이터를 기본적으로는 신뢰하나 서버사이드 검증로직을 넣어 실시간으로 확인하거나 로깅해서 데이터로 검출하려는 시스템을 넣는 방식도 있습니다. 서버에서 판정을 다 하더라도 클라이언트에서 역시 레이캐스트를 진행하나 히트판정보다는 시각적 요소를 위해 사용하거나 즉각적인 반응인것처럼 보이려고 사용하는 경우도 있습니다. (클라에선 맞으면 바로 혈흔효과를 뿌리지만 서버사이드에서 맞지 않았다면 데미지는 들어가지 않고, 플레이어에게 따로 정정통지는 하지 않음, 치팅유저가 아니라 정상플레이어였다면 게임 경험에 불쾌함을 느낄 수 있다는 단점)
answered (134 point)
답변 감사합니다.

많은 도움이 되었습니다.
+2 votes
FPS 게임은 응답성이 중요해서 클라 계산은 거의 필수입니다.

여러가지 상황별로 설명을 해볼게요.

 

1.순수하게 서버에서만 한다.

   네트워크 응답성이 좋은 환경. 예를 들어 랜파티 등의 상황에서만 가능하겠네요.

   아주 예전 FPS 게임에서는 종종 이 방식도 사용했었습니다.

 

2.순수하게 클라에서 한다.

   공격자 클라에서 직접 판단해서 결과만 서버에 알려 주는 방식인데, 아시다시피 해킹에 취약합니다.

   콘솔게임처럼 하드웨어 보안성이 어느정도 보장되는 경우라면 일부 가능하겠네요.

 

3.클라에서 일단 계산하고 서버에서 검증한다.

    상용게임에서는 이 방식을 가장 많이 쓸 거 같은데요. 게임의 상황에 따라 여러가지 전략을 취할 수 있을 거 같습니다.

    모든 레이캐스트를 다 검증할 수도 있겠지만, 서버 비용을 아끼기 위해 의심이 가는 상황이나 특정 플레이어만 집중적으로 검사해서 비용을 아낄 수 있습니다.

    좀 부정확하지만 시간과 관계 없이 레이가 스태틱한 오브젝트를 투과했는지 정도만 검증하는 방법이 있을 수 있고요. (월핵 방지용)

    서버에서 게임의 상태를 일일이 기록하고 있다가 플레이어가 총을 쏜 시간으로 정확히 되돌려서 그 상황을 재현한 후 검증을 할 수도 있습니다.

    마지막 방식은 카운터 스트라이크에서 구현한 방식이고요. 공개된 문서에서 자세한 내용을 확인 하실 수 있습니다. 참고 링크: https://developer.valvesoftware.com/wiki/Source_Multiplayer_Networking
answered (558 point)
답변 감사합니다.

많은 도움이 되었습니다.

버그 해결을 위해 도움을 구하고, 도움을 주세요. 우리는 그렇게 발전합니다.

throw bug 는 프로그래밍에 대한 전분야를 다룹니다. 질문,논의거리,팁,정보공유 모든 것이 가능합니다. 프로그래밍과 관련이 없는 내용은 환영받지 못합니다.

476 질문
631 answers
610 댓글
82,568 users