지원 프로그램
home
슬기로운 데모생활
home

6. 매치메이킹 로비 입장

생성일
2024/03/14 23:16
태그
상위 항목
하위 항목
로비 입장시 검색 조건을 주어 원하는 로비에 참여할 수 있습니다. 검색 조건은 메타 데이터(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 메서드를 호출해야 합니다.