로비 입장시 검색 조건을 주어 원하는 로비에 참여할 수 있습니다. 검색 조건은 메타 데이터(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),
};
Plain Text
복사
로비 입장 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);
Plain Text
복사
검색된 로비가 여러 개 일 경우 검색된 로비중 하나에 랜덤하게 입장합니다. 검색된 로비가 없을시 검색 조건으로 로비를 생성합니다. 로비 생성시 유저는 방장이 되며, 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;
}
// 게임 로직 처리
}
Plain Text
복사
로비 아이디(lobby)는 로비 고유의 아이디입니다. 다른 로비 관련 API호출 시 사용합니다.
로비에서 다른 유저 입장이나 정보 갱신, 메시지를 송신 받을 수 있기 때문에 주기적으로 RunCallback 메서드를 호출해야 합니다.