"자세한 코드 설명 및 전체적인 구성은 따로 포트폴리오 페이지에서 정리하겠습니다.
여기선 현재 구현된 기능과 해당 기능에 대한 간단한 설명 및 추후 개발할 것들을 정리합니다"
목표
- 지연보정으로 인한 자잘한 렉 줄이기 (어디까지 가능한지가 사실 이번 프로젝트로 얻으려는 것)
- 데디케이트 서버로 해당 라운드만 관장하는 방식, 따라서 최대 접속자 8:8 = 16인
- 데드레커닝 적용
- 위와 비슷한 말이긴하지만 패킷전송양(대역폭) 줄일 수 있을만큼 줄여보기
- 피격, 충돌, 보간등은 일단 유니티 내부적으로 컨트롤하는 것으로 - 현실적인 목표
- 서버 내부에서 물리적 판단까지 하여 클라에서 보낸 충돌 및 히트 판정에 대한 진위 판별하기 - 최종 목표...
- 클린코드를 지향하자
일반적인 구현 코드는 생략하겠습니다.
ConfigManager
에서 config.json
을 불러오고, 불러온 config
파일에 기반하여 Data
를 불러온다.config
파일과 Data
파일에는 대단한게 들어있지는 않다. config
에는 data path
정도 들어가 있으며 data
파일에는 플레이어들의 초기값 세팅정도와 맵의 사이즈와 연관된 minX
,maxX
,etc
와 RespawnPoint
정도 밖에 없다.ver.1.0.0
이 완성되면 한번에 summary
형식으로 정리를 해야한다.AWS EC2 프리티어 사용이 이미 끝나서 서버를 올릴때가 마땅치 않아 찾은 ngrok라는 앱이 있다. 따로 어떤 포트포워딩이나 방화벽 설정이 없이 ngrok 엔드포인트에 데이터를 전송하면 내가 열어둔 포트로 포워딩이 된다. ngrok에서는 터널링 시스템이라 부르는 것 같다.
문제는 ngrok가 엔드포인트에서 포트를 제외하고 이곳 저곳 공유해서 쓰는지 가끔 이상한 접속이 들어와서 멀티플레이 테스트하다가 도중에 이상한 플레이어가 난입하기도 한다... 하하... IP접속을 확인해서 내가 허락한 주소범위가 아니면 쫒아내던가 해야한다.
서버와 클라이언트 사이의 공통된 패킷규약을 만들기 위해 구글이 만든 Protobuf
라는 데이터포맷을 사용하였다.
직접 packet generator
를 만들어서 하는 것보다 훨씬 이것저것 지원되는 것들이 많아서 사용하였다.
이때, 가장 많이 전달되는 Keyboard입력은 int32
타입 안에 BitFlag
를 이용하여 큰 폭으로 대역폭을 줄였다.
또한, transform 데이터로 position을 계속 보내는 것이 아니라 Input
값을 BitFlag
로 입력되었을 때만 보내고 버튼에서 손을 뗐을때 보내는 방식으로 패킷2번으로 Movement
를 제어한다.
(물론 일정시간마다 실제 position을 보내어 서버와의 오차를 체크하고 싱크를 맞추는 부분도 있다.)
ClientSession
에서 들어온 패킷들은 해당 패킷에 맞는 핸들러로 간 뒤에 Job에다가 넣어준다. 보통 일반패킷들은 몆초후에 처리할 일이 없으니 따로 예약시간은 두지 않는다.
위의 Main Program
에서도 말했듯이 Job은 50ms(20hz)마다 한번씩 돌아간다.