로비 입장시 검색 조건을 주어 원하는 로비에 참여할 수 있습니다. 검색 조건은 메타 데이터(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),
};

로비 입장 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);

검색된 로비가 여러 개 일 경우 검색된 로비중 하나에 랜덤하게 입장합니다. 검색된 로비가 없을시 검색 조건으로 로비를 생성합니다. 로비 생성시 유저는 방장이 되며, OnUserJoin 콜백에서 StovePCMatchmakingAffiliation을 통해 유저 등급을 확인할 수 있습니다.

로비 콜백

StoveMatchSDK.JoinRandomLobby 메서드가 실행중에 오류가 발생하면 error.result(에러 코드) StovePCMatchmakingResult에서 내용을 확인할 수 있습니다.

로비에 대한 여러 콜백을 받기 위해서는 사전에 델리게이트를 등록해야 합니다.

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;
    }

    // 게임 로직 처리
}

로비 아이디(lobby)는 로비 고유의 아이디입니다. 다른 로비 관련 API호출 시 사용합니다.

<aside> 💡 로비에서 다른 유저 입장이나 정보 갱신, 메시지를 송신 받을 수 있기 때문에 주기적으로 RunCallback 메서드를 호출해야 합니다.

</aside>