본문 바로가기

C# 유니티서버

C# 유니티 서버 : 몬스터 피격판정 Part8

이전 작업 이슈

1.Part7

  • 위아래로 이동할수 없는 부분에 체크할때 패킷이 전송되며 클라에서 미리 체크하지 못햇던 부분
  • 좌우는 관계 없는것같다.
이슈 영상1번
이슈 영상2번

 

 

 

 

- 해결 과정

 서버 : -

 클라 : 사다리 상태에서 위아래 이동의 맵 체크 방식이 잘못되어 재수정 - 이슈영상1번

            사다리가 아닌 상태에서 위아래 체크시 패킷 전송이 되었던것도 수정 - 이슈영상2번

 

이슈 영상1번
이슈 영상 2번

 

- 결과물

 

 



 

이번 작업 정보 얻기

-검색 전

  1. 피격 판정은 무조건으로 서버에서 판단한다.
  2. 클라에서 판정시 변조의 위험이 존재한다.
  3. 지금 현재 원거리공격을 시행했을때 서버에서 이동계산을 진행한다.
  4. 그럼으로 나는 서버에서 피격판정을 진행해야한다.

-검색 후

  1. 클라에서 판정 하는 경우도 있다. 배트필드3 : ( https://kotaku.com/5869564/networking-how-a-shooter-shoots ) 번역 : (https://bbs.ruliweb.com/hobby/board/300007/read/664453)
  2. 특히 논타겟팅 MMORPG 또는 FPS 경우 서버에서 모든걸 처리하면 서버가 재기능을 하지 못하거나 터진다.
  3. 만들려고하는게임이 MO 인가? MMO인가? 처리해야하는 방식이 다르다. 두개의 차이 : (https://www.thisisgame.com/bns/tboard/?n=99500&board=36)
  4. MO는 서버가 전부처리해도 무방하다.
  5. MMO는 서버가 전부처리하면 터진다.
  6. 클라가 주는 정보는 믿어선 안된다.

 

플랜 설계 문제점

 

첫번째 문제이다.

 

일단 몬스터는 필연적으로 서버에서 처리해야한다.

하지만 서버에서 총알(편의상 총알로 지칭함)이 몬스터의 리스트를 돌면서 

 

"나 1번이랑 맞았나? 아니네"

"나 2번이랑 맞았나? 아니네"

.....

"나 103번이랑 맞았나? 아니네"

 

시간복잡도 O(N)의 방식으로 서버에서 처리하다간

지금은 포트폴리오이면서 2D MMORPG 이기때문 별 무리 없을것으로 판단이 된다만,

실 업무에선 큰일이 날 수도 있다.

 

문제는 총알이 클라에서 업데이트 하더라도 "클라의 정보는 신용 할 수 없다."  이다. 

클라에서 위치값을 업데이트 하더라도 프레임 단위로 서버에 업데이트값을 넣어줄수도 없을 뿐더러

넣어준다 하더라도 클라에서 주는 정보를 믿을수도 없다.


두번째 문제이다.

https://naver.me/GFYBywqf

 

[170730 게임고찰] 28. 넌 이미 죽어있다. 논타겟팅 게임의 고질병

저는 PvE 논타겟팅 게임을 아주 좋아합니다. 순간순간 적의 움직임에 대응하여 내가 어디까지 행동할 수 ...

blog.naver.com

 

서버가 처리한다면 피격판정을 처리한다면 흔히 "피했는데 왜 맞아?" 라는 반응이 나올수있다.

 

 

 

플랜 결정 전 작성

일단 작업 들어가기전 적는 부분임으로

결론뭐냐 물어본다면 "모르겠습니다........." 입니다.

이렇게 또 고민하게 되는건 이동동기화가 마지막일줄 알았는데 .........

 

 



플랜 설계

자, 생각의 시간은 끝났다. 완벽하진 않을 것 이고 또 다시 수정 할 수도 있겟지만 

일어나 앞으로 걸어나가야지 다른 길이 보인다.

 

차례

  1. 총알 생성 단계
  2. 총알 이동 단계
  3. 몬스터 피격의 단계

 

1.총알생성 단계

 

검증단계 (Packet 전송 누적, Client : 1 , Server : 클라N)

  • 클라가 쿨타임 선 검증후 서버에 전송 -> 서버에서 쿨타임 검증 후 사용가능 여부를 (Client - 패킷전송)
  • 사용 가능시 - 본인 클라 포함 모든 클라에게 스킬 애니메이션을 실행라고 패킷 전송 (Server - 클라N 전송)
  • 사용 불가능시 - 서버 쿨타임을 패킷으로 전송 클라에게 업데이트 (Server - 본인 클라에게만 전송)

 

실현단계 (Packet 전송 누적, Client : 2 , Server : 클라N)

  • UseSkill 에서 해당스킬의 발사체를 생성하는 패킷을 전송  (Client - 패킷전송)

 

생성단계 (Packet 전송 누적, Client : 2 , Server : 클라N + 클라 N)

  • 서버에서 총알을 생성하라는 패킷 전송 (Server - 클라N 전송)

 

마무리 단계 (Packet 전송 누적, Client : 3 , Server : 클라N + 클라 N + 1)

  • 애니메이션 마무리부분에 서버와 스킬 쿨타임 동기화 (Client - 패킷전송)

  • 서버에서 초기화 된 쿨타임을 본인에게 전송 (Server - 본인 클라에게만 전송)

 

2. 총알생성 단계

  • 최초로 생성된 총알은 클라에게 생성을 배포함 (Server N클라 배포)
  • 클라는 서버로 최초생성단계에서만 위치 업데이트받고 이후로 받지않음
  • 클라는 본인이 알아서 총알 이동함 이때, 서버에서도 똑같은 스피드로 이동함(총알위치 서버 업데이트)
  • 클라가 변조하여 총알이 반대편으로 날라간다. 한들 서버의 값에 영향을 주지 않기때문에
    피격처리는 정상적으로 진행됨

3.몬스터 피격의 단계

  • 서버도 맵타일 정보를 가지고 있기때문에 해당 위치에 누가 존재하는지 알수있음 // 
    클라에서도 위치는 알수있으나 List는 서버만 가지고있음 변조가능성 없음
    (몬스터가 타일을 넘어갈때마다 삭제 하고 다른 타일에 몬스터 정보를 삽입함)
  • 총알은 다음 장소로 넘어가면서 해당 타일에 몬스터의 존재 여부를 파악함
  • 없다면 시간 복잡도가 없음

 

  • 해당 타일에 몬스터가 있다면 MonsterList 를 전부 돌지 않고 MonsterList  중의 [0] 인덱스의 정보를 불러옴
  • 몬스터가 필드에 200마리있든 300마리있든 해당 타일안의 몬스터 정보만 불러오기때문에 
    현재로써는 순환조차 하지않기때문에 시간복잡도가 없음. 앞으로 기획에 따라 달라질듯함 

 

 

작업 진행

차례

  1. 총알 생성 단계
  2. 총알 이동 단계
  3. 몬스터 피격의 단계

 

1.총알생성 단계

  • 코루틴을 사용하여 해당 스킬 사용 여부 체크 후 

  • 서버로부터 응답이 오기전까지 대기 

  • 서버에서 2차 검증후 가능하다면 본인포함 클라에게 배포
  • 아니라면 본인 클라에게만 배포

플랜설계 단계처럼 진행후 생성 패킷 전송

 

  • 스킬 패킷 전달후 생성 배포

 

 

2. 총알생성 단계

  • 최초로 생성된 총알은 최초 1회만 클라에게 위치포함 정보를 배포 

  • 총알은 틱마다 업데이트하여 배포하지 않고 스스로 서버에 업데이트

3.몬스터 피격의 단계

 

 

  • 총알은 이동중 다음 이동할 장소에 적이 있는지 체크 

일단 맨먼저 들어온 몬스터 부터 피격 이후 기획에 따라 변경예정입니다.

 

  • 해당 타일의 위치한 몬스터만 가져오기때문에 매우 적은 순환의 진행만으로 피격대상을 찾을 수 있음.

 

  • 피격 판정후 삭제 (서버에서도 오브젝트 풀을 써야하는지 여부를 모르겠음으로 일단 삭제)

 

결과물

https://youtu.be/NOG5vOMyYBc

 

작업후기

정말 힘들었습니다. 어떻게 해야할지몰라서 마지막 글 업데이트 이후에 계속 고민했던것같습니다.

자꾸 일정이 미뤄지니 일단 심플하게 해보자라는 마인드로 진행했습니다.