# 매치메이킹 SDK 가이드
# 멀티 플레이어 개요
스토브 게임 플랫폼은 멀티 플레이어 환경에서 게임에 적용할 수 있는 매치메이킹, 채팅방, 친구리스트, 방장기능 및 관련 API를 제공하고 있습니다. 그중 매치메이킹 시스템은 다양한 게임 유저가 어느 지역에서 접속하든지 낮은 네트워크 지연시간을 제공하여 유저들이 함께 게임을 즐길 수 있도록 해 주는 서비스입니다. 매치메이킹 SDK를 통해 게임 유저를 하나의 공유된 공간에 모아주고(매칭), 여기에 접속한 게임 유저들에게 채팅 메시지 및 데이터를 실시간으로 전송 및 공유하여 함께 게임을 플레이 할 수 있게 지원합니다.
매칭된 게임 유저들에게 실시간으로 채팅 메시지 및 데이터를 전송을 위해 여러 네트워크 서비스를 제공하고 있습니다.
- 암호화된 보안 세션을 통해 실시간 채팅 메시지 전송을 지원합니다.
- 소규모 게임의 실시간 데이터 전송을 위한 P2P 네트워킹을 지원합니다.
- 좀 더 규모 있는 게임을 위해 UDP 릴레이를 지원합니다.
개발자는 어떠한 네트워크 서비스를 사용할 것인지 사용할 서비스만 선택하시면 됩니다.
# 멀티 플레이어 소개
매치메이킹 시스템은 매치메이킹 서버와 클라이언트 SDK로 이루어져 있습니다.
STOVE Studio (opens new window)의 게임 서비스>매치 메이킹
메뉴를 통해 매치메이킹 서버에 게임을 등록하고, 매치메이킹 클라이언트 SDK로 게임 유저 매칭을 개발할 수 있습니다.
매치메이킹 시스템의 역할은 개개의 게임 유저들이나 그 친구들이 함께 게임을 즐길 수 있도록 한 곳(로비)으로 모아 주는 것입니다. 매치메이킹 시스템은 다음의 3가지 방법을 통해 게임 유저들을 한 곳(로비)으로 모으고, 같이 게임을 즐길 수 있도록 중계합니다.
- 첫 번째 방법은 랜덤 매칭입니다.
게임 유저는 매치메이킹 서버에 빠른 입장을 요청하면, 서버가 알아서 유저를 적절한 로비로 안내하고 매칭시킵니다. 이 방법은 개발이 쉽고 게임 유저 UI를 단순하게 만들 수 있습니다. - 두 번째 방법은 검색 매칭입니다.
게임 유저는 각 게임에서 정의된 특성에 따라 검색 조건을 설정하고, 그 조건에 충족되는 로비 목록을 선택할 수 있습니다. 이 방법으로 최대한 비슷한 레벨의 게임 유저끼리 매칭되어 적절한 난이도에서 게임을 플레이할 수 있게 개발할 수 있습니다. - 세 번째 방법은 친구 초대입니다.
게임 유저는 내가 입장한 로비에서 내 친구를 초대하여 같이 게임을 플레이할 수 있습니다.
매치메이킹 클라이언트 SDK(Unity)를 사용하면 매치메이킹 시스템을 게임에 쉽게 적용할 수 있습니다.
# 매치메이킹 과정 순서
매치메이킹 서버에 접속한 후 랜덤 매칭하여 게임을 플레이하는 방법은 다음과 같습니다.
- 해당 게임에서 멀티 플레이어로 플레이할 종류를 선택합니다. (ex. 난이도 : [쉬움, 어려움], 시나리오 : [맵1, 맵2] )
- 게임 유저가 선택한 값중 하나로 로비 랜덤 입장 API를 호출하여 게임 로비에 입장합니다.
- 게임 유저가 다음 값(난이도 = 쉬움 and 시나리오 = 맵1)으로 로비 랜덤 입장 API를 호출하면 자동으로 로비를 찾아서 입장하거나 로비를 생성합니다.
- 게임 시작에 필요한 최소 인원이 채워질 때까지 대기합니다.
- 로비에 입장한 게임 유저 간 캐릭터나 유저 설정에 대한 데이터를 전송합니다.
- 게임 유저 간에 대화를 나눌 수 있게 채팅 API가 제공됩니다.
- 게임을 시작할 준비가 완료되면 로비 방장은 게임을 시작합니다.
- 데이터 송신 API를 통해 게임 데이터를 주고받을 수 있습니다. (P2P 혹은 UDP 릴레이)
- 게임이 종료되면 로비 방장은 게임을 종료하고 로비는 자동으로 소멸합니다.
# 유니티 데모 설치하기
- 매치메이킹 SDK 다운로드 하기
- 매치메이킹 SDK를 다운로드 받은 다음 데모 프로젝트를 구동하고, 관련 코드를 통해 매치메이킹 SDK 동작 방식에 대해 학습할 수 있습니다.
게임 스타일에 따라 아래 설명에 맞춰 구성합니다.
# 유니티 프로젝트 생성하기
# 유니티 패키지 import 하기
메뉴 - Assets - Import Package - Custom Package - 폴더에서 Matchmaking_demo.unitypackage 선택
import 선택
# 앱 등록하기
- STOVE Studio (opens new window)에서 발급 받은 게임 아이디, 앱 키, 앱 시크릿등을 등록
Scenes 폴더 - 01_LoginScene - StoveEssentialManager 선택
# DefficultySetting
- 난이도 설정 파일 생성/선택
메뉴 – MakeSetting – DefficultySetting 선택
- 난이도 설정
- +/- - 추가/제거
- Value - SDK통신을 위한 meta value(임의 값으로 수정 가능, 값은 중복 불가)
- Name - UI 표시될 이름
- IsDefault - 기본 선택 여부(복수일 경우 처음 것을 사용)
- ResourcePath - UI 표시될 리소스 경로
- 게임에서 적용된 설정
# RoomSetting
- 룸 설정 파일 생성/선택
메뉴 – MakeSetting – RoomSetting 선택
- 룸 설정
- +/- - 추가/제거
- Value - SDK통신을 위한 meta value(임의 값으로 수정 가능, 값은 중복 불가)
- MaxUser - 최대 인원
- Name - UI 표시될 이름
- ResourcePath - UI 표시될 리소스 경로
# ModeSetting
- 모드 설정 파일 생성/선택
메뉴 – MakeSetting – ModeSetting 선택
- 모드 설정
- +/- - 추가/제거
- Value - SDK통신을 위한 meta value(임의 값으로 수정 가능, 값은 중복 불가)
- Name - UI 표시될 이름
- IsDefault - 기본 선택 여부(복수일 경우 처음 것을 사용)
- ResourcePath - UI 표시될 리소스 경로
- IsBattle - 배틀 모드 여부(로비의UI가 모드에 따라 변경)
- RoomValues - 모드에서 사용되는 RoomSetting 의 value(추가/제거 가능)
- 게임에서 적용된 설정
모드 선택에 따라 모드에 사용되는 룸 정보가 변경됩니다.
# StageSetting
- 스테이지 설정 파일 생성/선택
메뉴 – MakeSetting – StageSetting 선택
- 스테이지 설정
- +/- - 추가/제거
- Value - SDK통신을 위한 meta value(임의 값으로 수정 가능, 값은 중복 불가)
- Name - UI 표시될 이름
- IsDefault - 기본 선택 여부(복수일 경우 처음 것을 사용)
- ResourcePath - UI 표시될 리소스 경로
# ItemSetting
- 아이템 설정 파일 생성/선택
메뉴 – MakeSetting – ItemSetting 선택
- 아이템 설정
- +/- - 추가/제거
- Value - SDK통신을 위한 meta value(임의 값으로 수정 가능, 값은 중복 불가)
- Name - UI 표시될 이름
- ResourcePath - UI 표시될 리소스 경로
- ItemType – 아이템타입 구분자와 SDK통신을 위한 meta key으로 사용(임의 값으로 6) 수정 가능, 값은 중복 불가)
- 게임에서 적용된 설정
아이템 타입에 따라 토글 메뉴가 자동으로 생성되고, 타입 아이템끼리 리스트에 보여집니다.
# 유니티 C# 코드 가이드
매치메이킹 SDK(Unity) 사용 방법에 대해 설명합니다.
# 1) 매치메이킹 초기화
# 초기화 메서드 호출
매치메이킹을 초기화하기 위해서 필요한 값을 채운 뒤 StoveMatchSDK.Initialize
메서드를 호출합니다.
using Stove.PCSDK.NET.Matchmaking;
bool result = SDK.Initialize();
if (true == result)
{
// 여기에 초기화 성공 후 게임로직
}
else
{
// 여기에 초기화 실패에 대한 처리
}
2
3
4
5
6
7
8
9
10
11
스토브 런처에 로그인하지 않은 상태로
StoveMatchSDK.Initialize
메서드를 호출하면 초기화에 실패합니다.
# 초기화 실패 시 확인 방법
로그폴더(./log) MatchmakingSDK_날짜.log 파일에서 에러 이유를 확인할 수 있습니다.
# 2) 매치메이킹 종료
매치메이킹 사용이 끝난 뒤에 호출하여 사용 중인 리소스를 정리합니다. 매치메이킹에 등록한 델리게이트 및 입력했던 모든 정보가 삭제됩니다.
using Stove.PCSDK.NET.Matchmaking;
SDK.Uninitialize();
2
3
# 3) RunCallback
매치메이킹의 API는 게임엔진 및 게임 로직에 방해가 되지 않도록 대부분 비동기로 수행됩니다.
- API 호출 후 매치메이킹 서버에서 수신한 결과는 SDK 내부 큐에 적재됩니다.
- 게임에서 수신된 결과를 처리하고자 할 때 RunCallback 메서드를 호출합니다.
- 큐에 적재된 콜백이 순차적으로 실행됩니다.
유니티는 주기적으로 특정 메서드를 호출할 수 있는 수단을 제공합니다.
using Stove.PCSDK.NET.Matchmaking;
private FixedUpdate()
{
// 고정된 프레임마다 반복적으로 호출
SDK.RunCallback();
}
2
3
4
5
6
7
# 4) 매치메이킹 서버에 접속하기
# 서버 접속 API
SDK.Connect 메서드로 매치메이킹 서버에 접속합니다.
using Stove.PCSDK.NET.Matchmaking;
// 닉네임
string nickname = user.Nickname;
StoveMatchSDK.Connect(nickname);
2
3
4
5
# 서버 접속 콜백
서버 접속에 대한 콜백을 받기위해서는 사전에 델리게이트를 등록해야 합니다. StoveMatchSDK.Connect
메서드가 처리되면 OnConnect
콜백이 호출됩니다.
using Stove.PCSDK.NET.Matchmaking;
// 서버 접속 델리게이트를 등록
StoveMatchSDK.EventConnect += GameObj.OnConnect;
private void OnConnect(StovePCMatchmakingError error)
{
// 매치메이킹 서버 접속 성공
// 신 이동등 다음 게임 로직 처리
if (error.result == StovePCMatchmakingResult.NO_ERROR)
{
GameManager.Instance.LoadModScene();
}
// 매치메이킹 서버 접속 실패
// 에러 처리
else
{
StringBuilder sb = new StringBuilder();
// 에러 코드
sb.AppendFormat(" - fail code : {0}", error.result);
// 구체적인 에러 내용이 있을 경우
sb.AppendFormat(" - fail message : {0}", error.message);
Debug.Log(sb.ToString());
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
error.result(에러 코드)는 StovePCMatchmakingResult
에서 내용을 확인할 수 있습니다. 더 구체적인 에러 내용은 error.message 로 전달됩니다.
# 5) 매치메이킹 서버에서 접속 종료하기
# 서버 접속 종료 API
StoveMatchSDK.Disconnect
메서드로 매치메이킹 서버에서 접속 종료합니다.
using Stove.PCSDK.NET.Matchmaking;
StoveMatchSDK.Disconnect()
2
3
# 서버 접속 종료 콜백
서버 접속 종료에 대한 콜백을 받기위해서는 사전에 델리게이트를 등록해야 합니다. StoveMatchSDK.Disconnect
메서드가 정상적으로 처리되면 OnDisconnect
콜백이 호출됩니다.
using Stove.PCSDK.NET.Matchmaking;
// 서버 접속 종료 델리게이트를 등록
StoveMatchSDK.EventDisconnect += GameObj.OnDisconnect;
// 매치메이킹 서버 접속 종료
private void OnDisconnect(StovePCMatchmakingError error, StovePCMatchmakingDisconnectCode code)
{
switch (code)
{
// Disconnect API를 호출하여 접속 종료한 경우
case StovePCMatchmakingDisconnectCode.DISCONNECT_CLIENT:
break;
// 매치메이킹 서버에서 클라이언트 접속 종료
case StovePCMatchmakingDisconnectCode.DISCONNECT_SERVER:
break;
// 핑 타임아웃으로 끊김 (네트워크 불안정)
case StovePCMatchmakingDisconnectCode.DISCONNECT_BY_HOST:
break;
// 중복 로그인으로 접속 종료
case StovePCMatchmakingDisconnectCode.DISCONNECT_CONFLICT:
break;
}
// 신 이동등 다음 게임 로직 처리
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
code(종료 코드)는 StovePCMatchmakingDisconnectCode
에서 내용을 확인할 수 있습니다. 더 구체적인 에러 내용은 error.message로 전달됩니다.
# 추가 정보
정기점검등으로 서버에서 접속이 종료될 수도 있기때문에 접속 종료 코드에 대한 확인이 필요합니다. 다른 런처에서 동일한 유저로 로그인한 경우 현재 연결이 접속 종료되므로 적절한 처리가 필요합니다.
# 6) 매치메이킹 로비 입장
로비 입장시 검색 조건을 주어 원하는 로비에 참여할 수 있습니다. 검색 조건은 메타 데이터(StovePCMatchmakingMetadata)로 설정합니다.
# 로비 메타 데이터
using Stove.PCSDK.NET.Matchmaking;
// meta 데이터의 key값 정의
public struct LOBBY_META_KEY
{
public const string DEFFICULTY_TYPE_KEY = "DefficultyType";
public const string GAMEMODE_TYPE_KEY = "GameModeType";
public const string ROOM_TYPE_KEY = "RoomType";
public const string STAGE_TYPE_KEY = "StageType";
}
// 게임 난이도
public struct Defficulty
{
public string value; //meta value
public string name; //UI 표시될 이름
public bool isDefault; //기본 선택 여부(복수일 경우 처음것을 사용합니다.)
public string resourcePath; //UI 표시될 리소스 경로
}
// 게임 모드
public struct Mode
{
public string value; //meta value
public string name; //UI 표시될 이름
public bool isDefault; //기본 선택 여부(복수일 경우 처음것을 사용합니다.)
public string resourcePath; //UI 표시될 리소스 경로
public bool isBattleMode; //배틀 모드 여부에 따라 UI가 변경됩니다.
public string[] roomValues; //모드에서 사용되는 방정보 meta value
}
//방 설정
public struct Room
{
public string value; //meta value
public int maxUser; //최대 인원수
public string name; //UI 표시될 이름
public string resourcePath; //UI 표시될 리소스 경로
}
//게임 스테이지
public struct Stage
{
public string value; //meta value
public string name; //UI 표시될 이름
public bool isDefault; //기본 선택 여부(복수일 경우 처음것을 사용합니다.)
public string resourcePath; //UI 표시될 리소스 경로
}
Defficulty.value = "Beginner";
Mode.value = "Arcade";
Room.value = "Arcade2";
List<StovePCMatchmakingMetadata> metaList = new List<StovePCMatchmakingMetadata>()
{
// 첫 번째 메타 데이터 설정
// key = "DefficultyType", value = "Beginner"
new StovePCMatchmakingMetadata(LOBBY_META_KEY.DEFFICULTY_TYPE_KEY, Defficulty.value),
// 두 번째 메타 데이터 설정
// key = "GameModType", value = "Arcade"
new StovePCMatchmakingMetadata(LOBBY_META_KEY.GAMEMODE_TYPE_KEY, Mode.value),
// 세 번째 메타 데이터 설정
// key = "RoomType", value = "Arcade2"
new StovePCMatchmakingMetadata(LOBBY_META_KEY.ROOM_TYPE_KEY, Room.value),
};
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
# 로비 입장 API
StoveMatchSDK.JoinRandomLobby
메서드로 매치메이킹 로비에 입장합니다. 검색 조건에 맞는 로비중 하나에 자동으로 입장합니다.
using Stove.PCSDK.NET.Matchmaking;
List<StovePCMatchmakingMetadata> metaList = new List<StovePCMatchmakingMetadata>()
{
// 첫 번째 메타 데이터 설정
// key = "DefficultyType", value = "Beginner"
new StovePCMatchmakingMetadata(LOBBY_META_KEY.DEFFICULTY_TYPE_KEY, Defficulty.value),
// 두 번째 메타 데이터 설정
// key = "GameModType", value = "Arcade"
new StovePCMatchmakingMetadata(LOBBY_META_KEY.GAMEMODE_TYPE_KEY, Mode.value),
// 세 번째 메타 데이터 설정
// key = "RoomType", value = "Arcade2"
new StovePCMatchmakingMetadata(LOBBY_META_KEY.ROOM_TYPE_KEY, Room.value),
}
// 로비를 생성할 시 로비 입장가능한 최대 유저수
int maxUser = 4;
SDK.JoinRandomLobby(metaList.ToArray(), maxUser);
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
검색된 로비가 여러 개 일 경우 검색된 로비중 하나에 랜덤하게 입장합니다. 검색된 로비가 없을시 검색 조건으로 로비를 생성합니다. 로비 생성시 유저는 방장이 되며, OnUserJoin
콜백에서 StovePCMatchmakingAffiliation
을 통해 유저 등급을 확인할 수 있습니다.
# 로비 콜백
StoveMatchSDK.JoinRandomLobby
메서드가 실행중에 오류가 발생하면 error.result(에러 코드) StovePCMatchmakingResult
에서 내용을 확인할 수 있습니다.
로비에 대한 여러 콜백을 받기 위해서는 사전에 델리게이트를 등록해야 합니다.
- 로비에 입장하면
OnJoinLobby
=> (OnUserJoin
* 자신을 포함한 유저 수)가 연속적으로 호출됩니다. - 다른 유저가 로비에 입장 시마다
OnUserJoin
콜백이 호출됩니다. **OnUserJoin
콜백에서StovePCMatchmakingAffiliation
을 통해 유저 등급을 확인할 수 있습니다. - 다른 유저가 로비에서 퇴장 시마다
OnUserLeave
콜백이 호출됩니다. - 로비에서 퇴장하면
OnLeaveLobby
콜백이 호출됩니다. ** API 호출 외에 로비 킥/밴, 로비 삭제 등으로 강제 퇴장당할 시에도 호출됩니다. - 방장이 퇴장하면 입장 순서에 방장이 이양되며,
OnUserUpdate
콜백이 호출됩니다. **OnUserUpdate
콜백에서 방장이 이양된 유저 정보를 확인할 수 있습니다.
using Stove.PCSDK.NET.Matchmaking;
// 로비 관련 델리게이트
// 로비 입장 델리게이트를 등록
SDK.EventJoinLobby += GameObj.OnJoinLobby;
// 로비에 유저 입장 델리게이트를 등록
SDK.EventUserJoin += GameObj.OnUserJoin;
// 로비에 유저 정보 갱신 델리게이트를 등록
SDK.EventUserUpdate += GameObj.OnUserUpdate;
// 로비에서 유저 퇴장 델리게이트를 등록
SDK.EventUserLeave += GameObj.OnUserLeave;
// 로비 퇴장 델리게이트를 등록
SDK.EventLeaveLobby += GameObj.OnLeaveLobby;
// 매치메이킹 로비 입장
private void OnJoinLobby(StovePCMatchmakingError error, StovePCMatchmakingJoinLobby joinLobby)
{
// 신 이동등 다음 게임 로직 처리
if (error.result == StovePCMatchmakingResult.NO_ERROR)
{
}
// 에러 처리
else
{
StringBuilder sb = new StringBuilder();
// 에러 코드
sb.AppendFormat(" - fail code : {0}", error.result);
// 구체적인 에러 내용이 있을 경우
sb.AppendFormat(" - fail message : {0}", error.message);
Debug.Log(sb.ToString());
}
}
// 로비에 유저 입장(나 포함)
private void OnUserJoin(StovePCMatchmakingError error, StovePCMatchmakingUserJoin userJoin)
{
StringBuilder sb = new StringBuilder();
// 로비 고유 아이디
sb.AppendFormat("lobby = {0}", userJoin.lobby);
// 유저 아이디
sb.AppendFormat("userID = {0}", userJoin.UID);
// 유저 닉네임
sb.AppendFormat("userNickname = {0}", nickname);
// 로비에서 유저 등급 ( 0 = 일반, 4 = 방장 )
sb.AppendFormat("affiliation = {0}", userJoin.affiliation);
// 유저 메타 데이터, 로비에서 해당 유저의 저장공간
foreach (var data in userJoin.userDataArray)
{
sb.AppendFormat("meta {0} = {1}", data.key, data.value);
}
Debug.Log(sb.ToString());
// 게임 로직 처리
}
// 로비에 유저 정보(나 포함) 업데이트
private void OnUserUpdate(StovePCMatchmakingError error, StovePCMatchmakingUpdateLobbyUser userUpdate)
{
StringBuilder sb = new StringBuilder();
// 로비 고유 아이디
sb.AppendFormat("lobby = {0}", userUpdate.lobby);
// 유저 아이디
sb.AppendFormat("userID = {0}", userUpdate.UID);
// 유저 닉네임
sb.AppendFormat("userNickname = {0}", userUpdate.nickname);
// 로비에서 유저 등급 ( 0 = 일반, 4 = 방장 )
sb.AppendFormat("affiliation = {0}", userUpdate.affiliation);
// 유저 메타 데이터, 로비에서 해당 유저의 저장공간
foreach (var data in userUpdate.userDataArray)
{
sb.AppendFormat("meta {0} = {1}", data.key, data.value);
}
Debug.Log(sb.ToString());
// 게임 로직 처리
}
// 로비에서 다른 유저 퇴장
private void OnUserLeave(StovePCMatchmakingError error, StovePCMatchmakingUserLeave userLeave)
{
StringBuilder sb = new StringBuilder();
// 로비 고유 아이디
sb.AppendFormat("lobby = {0}", userLeave.lobby);
// 유저 아이디
sb.AppendFormat("userID = {0}", userLeave.userID);
// 유저 닉네임
sb.AppendFormat("userNickname = {0}", userLeave.nickname);
// 유저가 퇴장한 이유 코드 ( `StovePCMatchmakingResult` 에서 내용을 확인할 수 있습니다. )
sb.AppendFormat("leaveCode = {0}", error.result);
Debug.Log(sb.ToString());
// 다른 유저 로비 퇴장 사유
switch(error.result)
{
// API 호출하여 로비 퇴장
case StovePCMatchmakingResult.NO_ERROR:
break;
// 방장이 킥
case StovePCMatchmakingResult.USER_KICKED:
break;
// 방장이 밴
case StovePCMatchmakingResult.USER_BANNED:
break;
// 방장이 로비 삭제
case StovePCMatchmakingResult.USER_ROOM_DESTROYED:
break;
// 서버에서 로비 제거
case StovePCMatchmakingResult.USER_ROOM_SHUTDOWN:
break;
// 운영이슈로 로비 제거
case StovePCMatchmakingResult.ROOM_DELETED_AS_OPERATIONAL:
break;
}
// 게임 로직 처리
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
로비 아이디(lobby)는 로비 고유의 아이디입니다. 다른 로비 관련 API호출 시 사용합니다.
로비에서 다른 유저 입장이나 정보 갱신, 메시지를 송신 받을 수 있기 때문에 주기적으로 RunCallback 메서드를 호출해야 합니다.
# 7) 매치메이킹 로비 퇴장
# 로비 퇴장 API
StoveMatchSDK.LeaveLobby
메서드로 매치메이킹 로비에서 퇴장합니다.
using Stove.PCSDK.NET.Matchmaking;
string lobby = this.lobby;
StoveMatchSDK.LeaveLobby(lobby);
2
3
4
# 로비 콜백
StoveMatchSDK.LeaveLobby
메서드가 실행중에 오류가 발생하면 error.result(에러 코드) StovePCMatchmakingResult
에서 내용을 확인할 수 있습니다.
로비 퇴장에 대한 콜백을 받기위해서는 사전에 델리게이트를 등록해야 합니다.
- 내가 로비에서 퇴장시
OnLeaveLobby
콜백이 호출됩니다. - 방장에 의한 로비 킥/밴, 로비 삭제 등으로 강제 퇴장당할 시에도 콜백 됩니다.
- 다른 유저는
OnUserLeave
콜백이 호출됩니다.
using Stove.PCSDK.NET.Matchmaking;
// 로비 퇴장 델리게이트를 등록
StoveMatchSDK.EventLeaveLobby += GameObj.OnLeaveLobby;
// 로비에서 퇴장
private void OnLeaveLobby(StovePCMatchmakingError error, StovePCMatchmakingLeaveLobby leaveLobby)
{
StringBuilder sb = new StringBuilder();
// 로비 고유 아이디
sb.AppendFormat("lobby = {0}", lobby);
// 유저가 퇴장한 이유 코드 ( `StovePCMatchmakingResult` 에서 내용을 확인할 수 있습니다. )
sb.AppendFormat("leaveCode = {0}", error.result);
Debug.Log(sb.ToString());
// 로비 퇴장 사유
switch(error.result)
{
// API 호출하여 로비 퇴장
case StovePCMatchmakingResult.NO_ERROR:
break;
// 방장이 킥
case StovePCMatchmakingResult.USER_KICKED:
break;
// 방장이 밴
case StovePCMatchmakingResult.USER_BANNED:
break;
// 방장이 로비 삭제
case StovePCMatchmakingResult.USER_ROOM_DESTROYED:
break;
// 서버에서 로비 제거
case StovePCMatchmakingResult.USER_ROOM_SHUTDOWN:
break;
// 운영이슈로 로비 제거
case StovePCMatchmakingResult.ROOM_DELETED_AS_OPERATIONAL:
break;
}
// 게임 로직 처리
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
강제 퇴장당한 경우 error.result 를 통해 StovePCMatchmakingResult
에서 내용을 확인할 수 있습니다.
# 8) 매치메이킹 로비 채팅 메시지 송수신
# 로비 채팅 메시지 전송 API
StoveMatchSDK.SendLobbyMsg
메서드로 매치메이킹 로비 내의 모든 유저에게 채팅 메시지를 송신합니다.
using Stove.PCSDK.NET.Matchmaking;
string lobby = this.lobby;
string message = "채팅 메시지";
string myProfile = "http://onstove.myprofile";
StoveMatchSDK.SendLobbyMsg(lobby, message, myProfile);
2
3
4
5
6
채팅 메시지(message)는 금칙어가 적용됩니다. 금칙어로 필터링된 메시지는 "****" 형태로 전송됩니다. 마지막 파라미터(myProfile)는 금칙어 적용없이 데이터 그대로 전송하며, json string / 내 프로필 uri등을 전송시 활용할 수 있습니다.
# 로비 채팅 메시지 송수신 콜백
StoveMatchSDK.SendLobbyMsg
메서드가 실행중에 오류가 발생하면 error.result(에러 코드) StovePCMatchmakingResult
에서 내용을 확인할 수 있습니다.
로비 채팅에 대한 콜백을 받기위해서는 사전에 델리게이트를 등록해야 합니다.
- 내가 로비에 채팅 메시지 전송시
OnSendLobbyMessage
콜백이 호출됩니다. - 로비에서 다른 유저의 채팅 메시지 수신시
OnRecvLobbyMessage
콜백이 호출됩니다.
using Stove.PCSDK.NET.Matchmaking;
// 로비 채팅 송신 델리게이트를 등록
SDK.EventSendLobbyMessage += GameObj.OnSendLobbyMessage;
// 로비 채팅 수신 델리게이트를 등록
SDK.EventRecvLobbyMessage += GameObj.OnRecvLobbyMessage;
// 로비에서 채팅 전송
private void OnSendLobbyMessage(StovePCMatchmakingError error, StovePCMatchmakingSendLobbyMessage sendLobbyMessage)
{
// 게임 로직 처리
if (error.result == StovePCMatchmakingResult.NO_ERROR)
{
}
// 에러 처리
else
{
StringBuilder sb = new StringBuilder();
// 에러 코드
sb.AppendFormat(" - fail code : {0}", error.result);
// 구체적인 에러 내용이 있을 경우
sb.AppendFormat(" - fail message : {0}", error.message);
Debug.Log(sb.ToString());
}
}
// 로비에서 채팅 수신
private void OnRecvLobbyMessage(StovePCMatchmakingError error, StovePCMatchmakingRecvLobbyMessage recvLobbyMessage)
{
// 게임 로직 처리
if (error.result == StovePCMatchmakingResult.NO_ERROR)
{
}
// 에러 처리
else
{
StringBuilder sb = new StringBuilder();
// 에러 코드
sb.AppendFormat(" - fail code : {0}", error.result);
// 구체적인 에러 내용이 있을 경우
sb.AppendFormat(" - fail message : {0}", error.message);
Debug.Log(sb.ToString());
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
로비에서 다른 유저 메시지를 수신할 수 있기때문에 주기적으로 RunCallback 메서드를 호출해야 합니다.
# 9) 매치메이킹 로비 데이터 송수신
# 로비 데이터 전송 API
StoveMatchSDK.SendLobbyBinarydata
메서드로 매치메이킹 로비 내의 모든 유저에게 데이터를 송신합니다.
using Stove.PCSDK.NET.Matchmaking;
string lobby = this.lobby;
byte[] data = new byte[5]{ (byte)'h', (byte)'e', (byte)'l', (byte)'l', (byte)'o', };
string myProfile = "http://onstove.myprofile";
SDK.SendLobbyBinarydata(lobby, data, myProfile);
2
3
4
5
6
데이터는 금칙어가 적용되지 않습니다. 마지막 파라미터(myProfile)는 데이터 그대로 전송하며, json string / 내 프로필 uri등을 전송시 활용할 수 있습니다.
# 로비 데이터 송수신 콜백
SDK.SendLobbyBinarydata
메서드가 실행중에 오류가 발생하면 error.result(에러 코드) StovePCMatchmakingResult
에서 내용을 확인할 수 있습니다.
로비 데이터에 대한 콜백을 받기위해서는 사전에 델리게이트를 등록해야 합니다.
- 내가 로비에 데이터 전송시
OnSendLobbyBinarydata
콜백이 호출됩니다. - 로비에서 다른 유저의 데이터 수신시
OnRecvLobbyBinarydata
콜백이 호출됩니다.
using Stove.PCSDK.NET.Matchmaking;
// 로비 데이터 전송 델리게이트를 등록
StoveMatchSDK.EventSendLobbyBinarydata += GameObj.OnSendLobbyBinarydata;
// 로비 데이터 수신 델리게이트를 등록
StoveMatchSDK.EventRecvLobbyBinarydata += GameObj.OnRecvLobbyBinarydata;
// 로비에서 데이터 전송
private void OnSendLobbyBinarydata(StovePCMatchmakingError error, StovePCMatchmakingSendLobbyBinarydata sendLobbyBinarydata)
{
// 게임 로직 처리
if (error.result == StovePCMatchmakingResult.NO_ERROR)
{
}
// 에러 처리
else
{
StringBuilder sb = new StringBuilder();
// 에러 코드
sb.AppendFormat(" - fail code : {0}", error.result);
// 구체적인 에러 내용이 있을 경우
sb.AppendFormat(" - fail message : {0}", error.message);
Debug.Log(sb.ToString());
}
}
// 로비에서 데이터 수신
private void OnRecvLobbyMessage(StovePCMatchmakingError error, StovePCMatchmakingRecvLobbyBinarydata recvLobbyBinarydata)
{
// 게임 로직 처리
if (error.result == StovePCMatchmakingResult.NO_ERROR)
{
}
// 에러 처리
else
{
StringBuilder sb = new StringBuilder();
// 에러 코드
sb.AppendFormat(" - fail code : {0}", error.result);
// 구체적인 에러 내용이 있을 경우
sb.AppendFormat(" - fail message : {0}", error.message);
Debug.Log(sb.ToString());
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
로비에서 다른 유저 데이터를 수신할 수 있기때문에 주기적으로 RunCallback 메서드를 호출해야 합니다.
# 10) 매치메이킹 로비 게임 시작
# 로비 게임 시작 API
StoveMatchSDK.StartGame
메서드로 로비가 게임을 시작함을 매치메이킹 서버와 모든 유저에게 알립니다.
using Stove.PCSDK.NET.Matchmaking;
string lobby = this.lobby;
SDK.StartGame(lobby, "", 0);
2
3
4
방장만 호출할 수 있습니다. 방장이 아닌 유저가 호출할 시 에러가 콜백됩니다. 서버 아이피와 포트는 클라이언트에서 연동할 게임서버 주소를 입력합니다. 연동할 게임 서버가 없을 시 빈값을 입력합니다. 게임이 시작된 후에는 해당 로비에 입장할 수 없습니다.
# 로비 게임 시작 콜백
StoveMatchSDK.StartGame
메서드가 실행중에 오류가 발생하면 error.result(에러 코드) StovePCMatchmakingResult에서 내용을 확인할 수 있습니다.
로비 게임 시작에 대한 콜백을 받기위해서는 사전에 델리게이트를 등록해야 합니다. 로비 내 모든 유저에게 StartGame
콜백이 호출됩니다.
using Stove.PCSDK.NET.Matchmaking;
// 로비 게임시작 델리게이트를 등록
StoveMatchSDK.EventStartGame += GameObj.OnStartGame;
// 로비 게임 시작
private void OnStartGame(StovePCMatchmakingError error, StovePCMatchmakingStartGame startGame)
{
// 신 이동등 게임 로직 처리
if (error.result == StovePCMatchmakingResult.NO_ERROR)
{
}
// 에러 처리
else
{
StringBuilder sb = new StringBuilder();
// 에러 코드
sb.AppendFormat(" - fail code : {0}", error.result);
// 구체적인 에러 내용이 있을 경우
sb.AppendFormat(" - fail message : {0}", error.message);
Debug.Log(sb.ToString());
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
로비에서 게임 시작 통보를 수신할 수 있기때문에 주기적으로 RunCallback 메서드를 호출해야 합니다.
# 11) 매치메이킹 로비 게임 종료
# 로비 게임 종표 API
StoveMatchSDK.EndGame
메서드로 로비가 게임을 종료함을 매치메이킹 서버와 모든 유저에게 알립니다.
using Stove.PCSDK.NET.Matchmaking;
string lobby = this.lobby;
StoveMatchSDK.EndGame(lobby, "", 0);
2
3
4
방장만 호출할 수 있습니다. 방장이 아닌 유저가 호출할 시 에러가 콜백됩니다. 서버 아이피와 포트는 클라이언트에서 연동할 게임서버 주소를 입력합니다. 연동할 게임 서버가 없을 시 빈값을 입력합니다. 게임이 종료된 후에 로비는 자동으로 삭제됩니다.
# 로비 게임 종료 콜백
StoveMatchSDK.EndGame
메서드가 실행중에 오류가 발생하면 error.result(에러 코드) StovePCMatchmakingResult
에서 내용을 확인할 수 있습니다.
로비 게임 종료에 대한 콜백을 받기위해서는 사전에 델리게이트를 등록해야 합니다.
- 로비 내 모든 유저에게
EndGame
콜백이 호출됩니다. - 로비 내 모든 유저는
OnLeaveLobby
콜백이 호출됩니다.
using Stove.PCSDK.NET.Matchmaking;
// 로비 게임 시작 델리게이트를 등록
StoveMatchSDK.EventEndGame += GameObj.OnEndGame;
// 로비 게임 종료
private void OnEndGame(StovePCMatchmakingError error, StovePCMatchmakingEndGame endGame)
{
// 신 이동등 게임 로직 처리
if (error.result == StovePCMatchmakingResult.NO_ERROR)
{
}
// 에러 처리
else
{
StringBuilder sb = new StringBuilder();
// 에러 코드
sb.AppendFormat(" - fail code : {0}", error.result);
// 구체적인 에러 내용이 있을 경우
sb.AppendFormat(" - fail message : {0}", error.message);
Debug.Log(sb.ToString());
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
로비에서 게임 종료 통보를 수신할 수 있기때문에 주기적으로 RunCallback 메서드를 호출해야 합니다.