01 실시간 게임서버를만들어야 한다
KOCCA 지원사업 선정
실시간 카드배틀 야구게임
1:1 실시간 대전 / 관전
7.
02 실시간 게임서버를만들어야 한다
제가 한번 해볼게요
실시간 서버 개발이 필요한 상황
잼있을것 같은데? 제가 해볼까요?
내 전문분야는 아니지만... 어떻게 되겠지... ㅋㅋㅋ
8.
03 실시간 게임서버를만들어야 한다
우리 게임의 특징
실시간 매칭을 통한 1:1 PvP 대전 게임
Turn Base 기반 가위바위보 전략 플레이
실시간 관전 / Replay
9.
04 실시간 게임서버를만들어야 한다
어떤 서버엔진을 쓸까?
GBaaS
게임 서비스를 위한 인프라를 클라우드 형태로 제공하는 서비스
인증, 매치메이킹, 랭킹등의 기능을 API형태로 클라우드로 제공
Game Spark, Photon Cloud, Amazon Game Lift..
제공하는 범위외의 기능이 필요할시 커스터마이징 어려움
사용량 또는 CCU에 따른 이용금액 지불
설치형 게임서버 엔진
서버엔진을 이용하여 원하는 형태로 직접 개발
대부분의 기능을 직접 개발해야 함
Photon, Proud Net, iFun Engine...
입맛에 맞게 개발 가능
엔진 라이센스 비용만 지불
설치형 게임서버 엔진으로 결정!
VS
클라우드 서비스로 서버관리 이슈가 적음 자체 서버관리 필요
10.
05 실시간 게임서버를만들어야 한다
유니티 UNet으로 결정
Photon, Proud Net, iFun 등 다양한 게임서버 엔진을 고민하던 중...
모든 조건을 만족시키는 유니티 UNet 발견
C#으로 개발 가능
Mac OS에서 개발 가능
윈도우/리눅스 서버 배포 가능
무료
01 유니티로 게임서버를만들어보자
유니티 네트워킹
유니티에서 제공하는 네트워킹 API
유니티 멀티플레이어 서비스
매치 메이킹
릴레이 서버
각종 네트워킹 컴포넌트로 에디터에서 멀티플레어 게임 손쉽게 개발 가능
HLAPI / LLAPI 제공으로 고수준에서 저수준의 네트워킹 API 사용 가능
P2P 기반 실시간 멀티플레이 게임 개발에 적합 (RPC)
13.
02 유니티로 게임서버를만들어보자
하지만 우리가 개발할 서버에 필요한 기능
Match Maker
Room
Turn Base Game Play
AI Bot Player
실시간 관전 / Replay
오브젝트 위치 / 변수 동기화 사용안함
P2P 사용안함
Client / Server 형태 서비스 필요
Turn Base 게임 플레이
14.
03 유니티로 게임서버를만들어보자
네트워크 클라이언트와 서버
LLAPI를 사용하여 Client / Server 방식의 멀티플레이 개발
Transport Layer API 사용 가능
다수의 통신 채널과 다양한 QoS 설정 가능
유연한 네트워크 토폴리지 설정
로우레벨 NetworkServer, NetworkClient 클래스 직접 사용
원하는 형태로 클라이언트 접속 관리
RPC 이외에도 사용자 정의 네트워크 메세지 전송 가능
바이트 배열 수준의 메세지 송수신 가능
15.
04 유니티로 게임서버를만들어보자
Network Server 시작
NetworkServer.Listen (serverPort)
서버 시작. 해당 서버포트로 클라이언트 접속 대기 상태
16.
05 유니티로 게임서버를만들어보자
Network Client 접속
NetworkClient.Connect (serverIp, serverPort)
클라이언트 서버 접속. 해당 서버주소와 포트로 서버에 접속요청.
17.
06 유니티로 게임서버를만들어보자
Network Connection
NetworkMessage 클래스내 NetworkConnection 정보
18.
07 유니티로 게임서버를만들어보자
Network Message
MessageBase 상속받아 사용자 정의 메세지 구현
함수를 정의하지 않으면 자동으로 Serialize 함수 생성
Serialize / Deserialize 함수 Override시 직접 구현가능
자동으로 Serialize 되지 않는 데이터 타입
컬렉션
복잡한 클래스
19.
08 유니티로 게임서버를만들어보자
MsgType 정의
메세지를 구분하기 위한 메세지 ID
시스템에서 정의한 MsgType 보다 큰 값으로 정의해야 함
20.
09 유니티로 게임서버를만들어보자
네트워크 메세지 보내기
NetworkClient.Send (short messageType, MessageBase msg)
NetworkServer.SendToClient (int connectionId, short messageType, MessageBase msg)
21.
10 유니티로 게임서버를만들어보자
네트워크 메세지 받기
RegisterHandler 등록 - MsgType, 호출될 함수
해당 메세지를 받으면 등록된 함수가 호출된다
22.
11 유니티로 게임서버를만들어보자
서버용 스크립트 엔진
다양한 형태의 작전카드 제작을 위한 스크립트 필요
작전카드 종류 100여개 - 일일이 하드코딩 하기 힘들다
유니티용 자바스크립트 인터프리터 탑재
23.
12 유니티로 게임서버를만들어보자
현재까지 진행상황
Match Maker
Room
Player Manager
1:1 TurnBase
Game Play
기본적인 1:1 대전 플레이 가능
데이터베이스 연동은 자체 API 서버 이용
서버 분산 작업 필요
아직까지는 큰 문제 없이 개발중...
01 UNet 소소한팁
서버가 잠들어요
유니티 Standalone 빌드는 앱이 비활성화 되면 멈춘다
PlayerSetting -> Resolution and Presentation -> Run In Background 체크
26.
02 UNet 소소한팁
복잡한 클래스 / 컬렉션이 Serialize 되지 않아요
유니티 메뉴얼에 아래와 같이 명시되어 있음
JSON 사용
메세지 클래스를 JSON으로 Serialize 하고 JSON Data(String)로 전송
Newtonsoft.Json 라이브러리 사용
Client
Message
Server
Message
Message
Base
Message
Base
JSON Serialize
JSON Deserialize
JSON Serialize
JSON Deserialize
JSON Data (String)
27.
03 UNet 소소한팁
동시에 10명이상 접속되지 않아요
Max Connections 기본설정은 10
NetworkServer.Configure(ConnectionConfig config, int maxConnecions)
NetworkClient도 동일하게 수정해야 한다 (다르면 CRCMismatch 오류 발생)
28.
04 UNet 소소한팁
다양한 Connection Config 설정
Disconnect Timeout
연결이 끊어진 것으로 간주되기 전까지의 시간 제한을 밀리 초 단위로 정의합니다. 기본값 = 2000입니다.
Packet Size
최대 패킷 크기 (바이트) 패킷은 내부에 여러 메시지를 포함 할 수 있습니다. 기본값 = 1500입니다.
Ping Timeout
keep-alive 패킷 (ping이라고도 함) 사이의 지속 기간을 밀리 초 단위로 정의합니다. 기본값은 500입니다.
Send Delay
패킷을 보내기 전에 Send ()를 호출 한 후 지연 시간 (밀리 초)을 가져 오거나 설정합니다.
이 시간 동안 새 메시지가 대기중인 패킷에 결합 될 수 있습니다. 기본값 : 10ms.
01 마무리 하며...
향후서버구성 계획
Match Maker
API Server
Room
1:1 TurnBase
Room
1:1 TurnBase
Room
1:1 TurnBase
Room
1:1 TurnBase
Room
1:1 TurnBase
………
Amazon Game Lift
Unity Multiplayer
31.
02 마무리하며...
이런 프로젝트라면유니티를 고려해 보세요
네트웍 속도에 큰 영향을 받지 않는다
오픈 월드나 MMO가 아니다 = 방 기반
하나의 방에 2~6명 정도의 인원이 플레이 한다
우리 게임만의 특별한 게임로직이 있다
Turn Base Game Play 이다
다양한 서버에 배포가 가능해야 한다 (Windows, Mac, Linux)
C#으로 개발하고 싶다