Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

58 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

[개요]

JNetLibrary의 JNetGroupServer를 상속받은 게임 서버이다. 다양한 그룹 스레드를 만들기 위해 로비와 매치룸이 존재하는 게임을 선택하고자 하였고, 더미보다는 소수의 인원으로 비교적 더 많은 클라이언트 세션을 테스트 할 수 있는 RTS 장르를 선택하였다. 여러 유닛을 하나의 클라이언트로 제어할 수 있기에 개별 유닛에 네트워크 세션을 붙여 행위(공격, 이동, 동기화) 패킷을 독립적으로 서버에 송신하는 방식을 사용하였다.

그룹 스레드 활용: Hub group / MatchRoom group / battlefield group

  • 클라이언트의 초기 연결과 매치룸 생성, 로비 및 매치룸 입장, 그리고 게임 시작 전까지 Hub 그룹(스레드)과 MatchRoom 그룹가 관장
  • 유닛 선택 필드에서 유닛이 생성할 때 유닛은 각각 개별 세션으로써 서버에 연결됩니다. 유닛 이동 및 공격 시 각자의 상태 함수를 통해 이동/공격 패킷등을 송신

비트 연산/마스킹을 적용한 빠른 JPS 알고리즘 라이브러리 활용

  • 비트 연산, 마스킹을 활용한 JPS(Jump Point Search) 길찾기 알고리즘을 구현한 라이브러리를 활용
  • 유닛의 경로가 막혀 제자리 걸음을 할 때 서버에 JPS 요청을 보내 경로를 가로막은 다른 유닛을 회피할 수 있도록 로직을 구현
  • https://github.com/JINs-software/PathFinderLibrary

간단 시연 영상

https://www.youtube.com/watch?v=5YbUqW7MBsM

[HubThread, MatchRoomThread]

  1. 클라이언트는 게임 접속 시 초기 화면(이하 Hub 창)에 게임 서버의 IP/Port 번호를 입력하고 닉네임을 전달함. 본 서버는 계정을 관리하지 않음. 일회성의 닉네임을 사용한다. 서버와의 연결이 수립되면 닉네임 정보를 담은 패킷을 전달한다. 서버는 연결 직후의 클라이언트 패킷을 Gateway 그룹 스레드에 전달한다. Gateway 그룹 스레드는 메시지를 식별하고 세션 정보를 Hub 그룹 스레드로 이동시키고, 닉네임 패킷을 포워딩한다.

connect 접속

  1. 클라이언트가 매치룸 생성 요청 패킷을 송신, 허브 그룹에선 매치룸 중복과 매치룸 생성 제한을 확인하여 생성 가능 시 매치룸 그룹을 생성하고 세션을 전달하며, 성공 응답 패킷을 반환(매치룸 그룹 스레드)한다.

createRoom 방생성

  1. 초기 화면에서 'Join a Match'를 클릭하면 로비로 이동하게 되고 기존에 생성된 매치룸 리스트를 확인할 수 있다. 접속하고자 하는 매치룸을 클릭하면 입장 패킷을 서버에 송신한다. 서버의 허브 그룹은 매칭룸 ID를 통한 유효성 확인을 하며, 매치룸 인원을 확인하여 입장이 가능하다면 세션 정보를 전달하면서 동시에 입장 성공 패킷으로 응답한다.
join1
  1. 매치룸 내 호스트를 제외한 인원이 'READY' 상태이고, 호스트가 'Start' 버튼 클릭 시 게임 시작 요청 패킷을 서버에 전송한다. 매치룸 그룹에서 게임 시작이 가능하다는 판단 하에 '배틀 필드' 그룹 스레드를 생성하고, 플레이어 세션 정보를 전달 및 응답 패킷을 전송한다.

join2 방입장

[BattleThread]

게임은 유닛들의 선택을 하고, 선택된 유닛들을 배틀 필드의 전장에서 싸워 적군의 구형 상징물을 파괴하는 것을 승리로 하는 게임이다. 건설 시스템은 없지만, RTS 류의 다중 유닛을 제어할 수 있도록 한 이유는 각 유닛 생성 시 서버와의 접속을 수행하여 세션을 만들고, 최대 4인용 게임이지만 그 배가 되는 세션을 만들어 부하를 조금이라도 더 주며 서버를 테스트하기 위함이 있다. 따라서 유닛 생성 시 서버와의 연결이 수립되며, 연결 후 유닛 생성 메시지를 송신한다. 유닛 생성 메시지는 배틀 필드 고유의 ID와 함께 전달되어 Gateway 그룹은 이를 통해 배틀 그룹을 식별하여 해당 그룹으로 메시지를 포워딩 할 수 있다.

전투

[JPS PathFinding 라이브러리 적용]

길찾기 알고리즘은 유니티의 NavMeshAgent를 활용하고 있지만, 다른 Nav 오브젝트들에 막혀 목적지 또는 추적 대상 타겟에게 이동하지 못하고 제자리 걸음을 하는 경우, 일정 시간 또는 횟수가 지나면 서버에 JPS 길찾기 요청을 송신한다. 서버는 이 요청을 받아 JPS 알고리즘 연산을 수행하는 쓰레드(쓰레드 풀링으로 관리)를 깨워 요청의 작업을 수행하도록 한다. 작업의 결과는 우회 경로의 일부 좌표들이며, 클라이언트는 이 유닛을 바탕으로 제자리 걸음을 하던 유닛이 이동하도록 한다.

(디버그 모드로 더미 유닛들을 생성하여 타겟까지 이동 경로를 막도록 함) JPS1 (기즈모를 통해 플레이어 유닛의 추적 범위와 공격 거리를 확인할 수 있다. 노란색 원이 추적 범위이고, 빨간색 원이 공격 거리이다.) JPS2

서버에서는 모든 유닛들의 반지름 크기를 기준으로 그 둘레를 채우는 좌표들을 가지고, 이동 및 정지 시 이 좌표들을 갱신한다. 서버에서는 콜라이더 집합이라 표현하며, 이 콜라이더 집합을 토대로 유닛의 제자리 걸음을 판정하고, JPS 알고리즘의 설정 값으로 활용한다.

About

바람의 행진곡(March of Wind, 가칭) 게임 서버

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages