[Unity]멀티플레이 FPS게임 개발기 3 - 서버: 목표와 기능구현1

RisingJade의 개발기록·2022년 5월 7일
2

KILLER BEAN 제작기

목록 보기
3/5

서버

"자세한 코드 설명 및 전체적인 구성은 따로 포트폴리오 페이지에서 정리하겠습니다.
여기선 현재 구현된 기능과 해당 기능에 대한 간단한 설명 및 추후 개발할 것들을 정리합니다"

목표

  • 지연보정으로 인한 자잘한 렉 줄이기 (어디까지 가능한지가 사실 이번 프로젝트로 얻으려는 것)
  • 데디케이트 서버로 해당 라운드만 관장하는 방식, 따라서 최대 접속자 8:8 = 16인
  • 데드레커닝 적용
  • 위와 비슷한 말이긴하지만 패킷전송양(대역폭) 줄일 수 있을만큼 줄여보기
  • 피격, 충돌, 보간등은 일단 유니티 내부적으로 컨트롤하는 것으로 - 현실적인 목표
  • 서버 내부에서 물리적 판단까지 하여 클라에서 보낸 충돌 및 히트 판정에 대한 진위 판별하기 - 최종 목표...
  • 클린코드를 지향하자

기능 구현 상태 1(LastUpdate.22.05.07)

일반적인 구현 코드는 생략하겠습니다.

Main Program

  • ConfigManager에서 config.json을 불러오고, 불러온 config파일에 기반하여 Data를 불러온다.
    아직 config파일과 Data파일에는 대단한게 들어있지는 않다. config에는 data path정도 들어가 있으며 data파일에는 플레이어들의 초기값 세팅정도와 맵의 사이즈와 연관된 minX,maxX,etcRespawnPoint정도 밖에 없다.

  • 아직 프로토타입이라 보기만해도 눈살을 찌푸리게 만드는 주석들이 많은데 이건 ver.1.0.0이 완성되면 한번에 summary형식으로 정리를 해야한다.
  • 현재 게임룸은 서버가 켜질때 RoomManager의 instance로 딱 하나만 생성하며 50ms당 한번씩(20hz) Job Scheduler가 기동된다.

Ngrok(무료 터널링 앱)

AWS EC2 프리티어 사용이 이미 끝나서 서버를 올릴때가 마땅치 않아 찾은 ngrok라는 앱이 있다. 따로 어떤 포트포워딩이나 방화벽 설정이 없이 ngrok 엔드포인트에 데이터를 전송하면 내가 열어둔 포트로 포워딩이 된다. ngrok에서는 터널링 시스템이라 부르는 것 같다.

문제는 ngrok가 엔드포인트에서 포트를 제외하고 이곳 저곳 공유해서 쓰는지 가끔 이상한 접속이 들어와서 멀티플레이 테스트하다가 도중에 이상한 플레이어가 난입하기도 한다... 하하... IP접속을 확인해서 내가 허락한 주소범위가 아니면 쫒아내던가 해야한다.


Packet Format - protobuf


서버와 클라이언트 사이의 공통된 패킷규약을 만들기 위해 구글이 만든 Protobuf라는 데이터포맷을 사용하였다.
직접 packet generator를 만들어서 하는 것보다 훨씬 이것저것 지원되는 것들이 많아서 사용하였다.

이때, 가장 많이 전달되는 Keyboard입력은 int32 타입 안에 BitFlag를 이용하여 큰 폭으로 대역폭을 줄였다.
또한, transform 데이터로 position을 계속 보내는 것이 아니라 Input값을 BitFlag로 입력되었을 때만 보내고 버튼에서 손을 뗐을때 보내는 방식으로 패킷2번으로 Movement를 제어한다.
(물론 일정시간마다 실제 position을 보내어 서버와의 오차를 체크하고 싱크를 맞추는 부분도 있다.)


Packet Handler

  • 위와 같은 방식으로 packet이 오면 온 packet에 걸맞는 Action을 자동으로 Invoke 해준다.
  • Handler에서는 unpacket을 하고 현재 클라이언트를 담당하는 room의 JobQueue에 Action을 push해준다.

Job Scheduler

  • JobSerializer


ClientSession에서 들어온 패킷들은 해당 패킷에 맞는 핸들러로 간 뒤에 Job에다가 넣어준다. 보통 일반패킷들은 몆초후에 처리할 일이 없으니 따로 예약시간은 두지 않는다.
위의 Main Program에서도 말했듯이 Job은 50ms(20hz)마다 한번씩 돌아간다.

개발해야 할 추가 컨텐츠

  • 팀에 따른 스폰 위치 및 맵 데이터 추가 저장
  • 3:3 대결용 GameRoom 설정
  • 게임 승리시 GameRoom Reset기능
profile
언제나 감사하며 살자!

0개의 댓글