- Multiplayer Session Directory(MPSD) 세션 변경 알림 구독
- MPSD 세션 생성
- MPSD 세션의 중재자 설정
- 타이틀 활성화 관리
- 사용자를 참가 가능하게 만들기
- 게임 초대 전송
- 로비 세션에서 게임 세션에 참가
- 타이틀 활성화에서 MPSD 세션에 참가
- 사용자의 현재 액티비티 설정
- MPSD 세션 업데이트
- MPSD 세션 나가기
- 매치메이킹 중 열려 있는 세션 슬롯 채우기
- 매치 티켓 생성
- 매치 티켓 상태 가져오기
Multiplayer Session Directory(MPSD) 세션 변경 알림 구독
세션의 변경 사항을 구독하려면 연결된 플레이어가 세션에서 활성 상태여야 합니다. 또한 세션의
/constants/system/capabilities 객체에서 connectionRequiredForActiveMembers 필드를 true로 설정해야 합니다. 이 필드는 일반적으로 세션 템플릿에 설정됩니다. 자세한 내용은 멀티플레이어 세션 템플릿 및 Multiplayer Session Directory 개요를 참조하세요.-
동일한 사용자의 모든 호출에 동일한
XblContextHandle객체를 사용합니다. 구독은 이 객체의 수명과 연결되어 있습니다. 여러 로컬 사용자가 있는 경우 각 사용자마다 별도의XblContextHandle객체를 사용합니다. - XblMultiplayerAddSessionChangedHandler 및 XblMultiplayerSessionSubscriptionLostHandler에 대한 이벤트 처리기를 구현합니다.
-
둘 이상의 사용자에 대해 변경 사항을 구독하는 경우 불필요한 작업을 피하기 위해
XblMultiplayerAddSessionChangedHandler이벤트 처리기에 코드를 추가합니다. XblMultiplayerSessionChangeEventArgs::Branch속성과 XblMultiplayerSessionChangeEventArgs::ChangeNumber속성을 사용합니다. 이러한 속성을 사용하면 마지막으로 확인한 변경 사항을 추적하고 이전 변경 사항을 무시할 수 있습니다. - 구독을 허용하려면 XblMultiplayerSetSubscriptionsEnabled를 호출합니다.
- 로컬 세션 객체를 만든 다음, 해당 세션에 활성 상태로 참가합니다.
-
각 사용자에 대해
XblMultiplayerAddSessionChangedHandler를 호출하여 알림을 받을 세션 변경 유형을 전달합니다. - 이 항목의 MPSD 세션 업데이트 섹션에 설명된 대로 세션을 MPSD에 씁니다.
중복 세션 변경 알림 구문 분석
동일한 세션에 대한 알림을 구독하는 사용자가 여러 명일 경우 해당 세션의 모든 변경 사항이 각 사용자에 대해 숄더 탭을 트리거합니다. 이러한 숄더 탭 중 하나를 제외한 모든 항목은 중복입니다. 세션의 모든 사용자를 알림에 구독하는 것을 여전히 권장하지만, 타이틀은 이미 알림을 받은 변경 사항은 무시해야 합니다.Branch 및 ChangeNumber 속성을 사용하여 이를 수행할 수 있습니다.
여러 숄더 탭을 감지하려면 타이틀에서 다음을 수행해야 합니다.
-
평가된 각
Branch속성 값에 대해 가장 최근의ChangeNumber속성 값을 저장합니다. -
숄더 탭의
ChangeNumber속성 값이 해당Branch속성 값에 대해 저장된 최신 값보다 높으면 숄더 탭을 처리한 다음 가장 최근의ChangeNumber속성 값을 업데이트합니다. -
숄더 탭에 해당
Branch속성 값에 대해 더 높은ChangeNumber속성 값이 없으면 숄더 탭 처리를 건너뜁니다. 해당 세션 변경 사항은 이미 처리되었습니다.
ChangeNumber 속성 값은 세션이 아닌 Branch 속성 값별로 추적해야 합니다. Branch 속성 값은 세션의 수명 내에서 변경될 수 있으며, 그러면 ChangeNumber 속성 값이 재설정됩니다.MPSD 세션 생성
기본적으로 MPSD 세션은 첫 번째 구성원이 참가할 때 생성됩니다. 타이틀 로직에서 참가 시점에 타이틀이 존재하거나 존재하지 않는 것을 예상하는 경우, 세션 업데이트 중 write 메서드에 적절한 쓰기 모드 값을 전달할 수 있습니다.
-
새
XblContextHandle객체를 만듭니다. 타이틀은 이 객체를 한 번 만들어 저장한 후 소스 코드 전체에서 필요에 따라 재사용합니다. 특히 세션 구독 작업 시 정확히 동일한 컨텍스트를 사용하는 것이 필수입니다. -
XblMultiplayerSessionCreateHandle을 사용하여 새
XblMultiplayerSessionHandle을 만들어 MPSD가 새 세션을 만드는 데 필요한 모든 세션 데이터를 준비합니다. - 세션을 MPSD에 쓰기 전에 필요한 변경 사항을 수행합니다. 예를 들어 XblMultiplayerSessionJoin 호출로 구성원을 세션에 참가시킬 때, 클라이언트는 세션 업데이트 호출 시 참가하도록 MPSD에 지시하는 숨겨진 로컬 요청 데이터를 추가합니다.
- 로컬 변경이 완료되면 이 항목의 MPSD 세션 업데이트 섹션에 설명된 대로 MPSD에 씁니다.
-
많은 필드가 채워진 새
XblMultiplayerSessionHandle객체를 MPSD로부터 받습니다. - 이후에는 새 세션 객체를 사용합니다. 새 세션을 만들라는 숨겨진 요청이 포함된 이전 사본은 폐기합니다.
예제
Flat C API- XAsyncBlock
- XblMultiplayerSessionCreateHandle
- XblMultiplayerSessionInitArgs
- XblMultiplayerSessionReference
- XblMultiplayerSessionWriteMode
- XblMultiplayerWriteSessionAsync
- XblMultiplayerWriteSessionResult
MPSD 세션의 중재자 설정
타이틀은 이미 생성된 세션에 대한 중재자를 설정하기 위해 다음 절차를 사용합니다.구성원(잠재적 호스트)의 디바이스 토큰은 구성원이 세션에 참가하고 보안 디바이스 주소를 포함할 때까지 사용할 수 없습니다.
-
XblMultiplayerSessionMembers를 호출하여 MPSD에서 호스트 후보의 디바이스 토큰을 검색합니다.
[!NOTE] 세션이 SmartMatch 매치메이킹으로 생성된 경우, 클라이언트는 XblMultiplayerSessionHostCandidates를 호출하여 MPSD에서 사용할 수 있는 호스트 후보를 사용할 수 있습니다.
- 호스트 후보 목록에서 필요한 호스트를 선택합니다.
- XblMultiplayerSessionSetHostDeviceToken을 호출하여 MPSD의 로컬 캐시에 디바이스 토큰을 설정합니다. 호스트 디바이스 토큰 설정 호출이 성공하면 로컬 디바이스 토큰이 호스트의 토큰을 대체합니다.
-
호스트 디바이스 토큰을 설정하려고 할 때 HTTP/412 상태 코드가 수신되면 세션 데이터를 쿼리합니다. 호스트 디바이스 토큰이 로컬 콘솔의 것인지 확인합니다. 로컬 콘솔의 것이 아니라면 다른 콘솔이 중재자로 지정된 것입니다.
[!NOTE] HTTP/412는 표준 실패를 나타내지 않으므로 클라이언트는 HTTP/412 상태 코드를 다른 HTTP 코드와 별도로 처리해야 합니다. 이 상태 코드에 대한 자세한 내용은 멀티플레이어 세션 상태 코드를 참조하세요.
-
이 항목의 MPSD 세션 업데이트 섹션에 설명된 대로 MPSD의 세션을 업데이트합니다.
[!NOTE] 더 나은 알고리즘이 없다면, 각 호스트 후보가 아직 아무도 그렇게 하지 않았을 때 스스로 호스트로 설정하려고 하는 그리디 알고리즘을 클라이언트에서 구현할 수 있습니다. 자세한 내용은 Multiplayer Session 고급 항목의 세션 중재자 섹션을 참조하세요.
타이틀 활성화 관리
XBOX One(또는 이후 버전)은 프로토콜 활성화 중에CoreApplicationView.Activated 이벤트를 발생시킵니다.
멀티플레이어 API의 맥락에서, 이 이벤트는 사용자가 초대를 수락하거나 다른 사용자에게 참가할 때 발생합니다.
이러한 작업은 활성화를 트리거하며, 타이틀은 참가한 사용자를 대상 사용자와의 게임 플레이로 유도해 반응해야 합니다.
타이틀은 언제든지 새로운 활성화 인수가 들어올 것에 대비해야 하며, 절대로 길이에 종속되는 방식으로 코드를 작성해서는 안 됩니다.
-
CoreApplicationView.Activated이벤트에 대한 이벤트 처리기를 설정합니다. 이 처리기는 타이틀이 이미 실행 중이더라도 프로토콜 활성화가 발생할 때마다 트리거됩니다. - 타이틀 활성화 시 세션을 시작하고 세션 변경 알림을 구독합니다. 자세한 내용은 이 항목의 MPSD 세션 변경 알림 구독을 참조하세요.
- 사용자를 세션에 활성 상태로 참가시킵니다. 자세한 내용은 이 항목의 타이틀 활성화에서 MPSD 세션에 참가를 참조하세요.
- 프로필 UI를 통해 노출되는 액티비티 세션으로 로비 세션을 설정합니다. 자세한 내용은 이 항목의 사용자의 현재 액티비티 설정을 참조하세요.
- 사용자를 게임 세션에 활성 상태로 참가시킵니다. 이제 사용자는 피어에 연결하여 게임 플레이 또는 로비에 진입할 수 있습니다.
사용자를 참가 가능하게 만들기
사용자를 참가 가능하게 만들려면 타이틀에서 다음을 수행해야 합니다.- 세션 객체를 만든 다음 필요에 따라 속성을 수정합니다.
- 사용자를 세션에 활성 상태로 참가시킵니다. 자세한 내용은 이 항목의 타이틀 활성화에서 MPSD 세션에 참가를 참조하세요.
- 사용자가 세션 중재자로 지정되었는지 확인합니다.
- 사용자가 중재자가 아닌 경우 7단계로 이동합니다.
- 사용자가 중재자이면 XblMultiplayerSessionSetHostDeviceToken을 호출합니다.
- XblMultiplayerWriteSessionAsync 호출을 사용하여 세션을 쓰려고 시도합니다.
- 세션을 활성 세션으로 설정합니다. 자세한 내용은 이 항목의 사용자의 현재 액티비티 설정을 참조하세요.
게임 초대 전송
타이틀은 플레이어가 게임 초대를 보낼 수 있도록 다음과 같은 방법을 지원할 수 있습니다.- 로비 세션에 대한 초대를 보냅니다.
- 게임 세션 참조를 사용하여 일반 XBOX 플랫폼 초대 UI를 통해 초대를 보냅니다.
- 초대하는 게임 플레이어를 참가 가능하게 만듭니다. 자세한 내용은 이 항목의 사용자를 참가 가능하게 만들기를 참조하세요.
- 초대를 로비 세션을 통해 보낼지 아니면 초대 UI를 사용하여 보낼지 결정합니다.
- 로비 세션이 사용되는 경우, XblMultiplayerSendInvitesAsync 호출을 사용하여 초대를 보냅니다. 이 메서드는 XGameUiShowPlayerPickerAsync를 호출하여 게임 내 UI 명단을 만들어야 할 수도 있습니다.
- 초대 UI가 사용되는 경우 XGameUiShowSendGameInviteAsync를 호출하여 초대 UI를 표시합니다.
- 원격 플레이어가 참가한 후 로컬 플레이어에 대한 XblMultiplayerAddSessionChangedHandler를 처리합니다.
- 원격 플레이어의 경우 타이틀 활성화 코드를 구현합니다. 자세한 내용은 이 항목의 타이틀 활성화 관리를 참조하세요.
로비 세션에서 게임 세션에 참가
Windows 10 디바이스의 게임 플레이 세션은 대형 세션이 아닌 경우userAuthorizationStyle 기능을 true로 설정해야 합니다. 그 결과 joinRestriction 속성은 none이 될 수 없으며, 이는 세션을 공개적으로 직접 참가할 수 없음을 의미합니다.
일반적인 시나리오는 로비 세션을 만들어 플레이어를 모은 다음, 이러한 플레이어를 게임 플레이 세션 또는 매치메이킹 세션으로 이동시키는 것입니다. 그러나 게임 플레이 세션이 공개적으로 참가할 수 없는 경우, 게임 클라이언트는 joinRestriction 설정을 충족하지 않는 한 게임 플레이 세션에 참가할 수 없습니다. 대부분의 경우 이 시나리오에서는 제한이 지나치게 엄격합니다.
해결책은 전송 핸들을 사용하여 로비 세션과 게임 세션을 연결하는 것입니다. 타이틀은 다음을 수행하여 이를 처리할 수 있습니다.
- 게임 세션을 만들 때 XblMultiplayerSetTransferHandleAsync API를 사용하여 로비 세션과 게임 세션을 연결하는 전송 핸들을 만듭니다.
- 게임 세션의 세션 참조 대신 로비 세션에 전송 핸들 GUID를 저장합니다.
- 타이틀이 구성원을 로비 세션에서 게임 세션으로 이동시키려는 경우, 각 클라이언트는 로비 세션의 전송 핸들을 사용하여 XblMultiplayerWriteSessionByHandleAsync API를 통해 게임 세션에 참가합니다.
- MPSD는 로비 세션을 조회하여 전송 핸들을 사용하여 게임 세션에 참가하려는 구성원이 로비 세션에도 있는지 확인합니다.
- 구성원이 로비 세션에 있으면 게임 세션에 액세스할 수 있습니다.
타이틀 활성화에서 MPSD 세션에 참가
사용자가 XBOX 셸 UI를 사용하여 친구의 액티비티에 참가하거나 초대를 수락하기로 선택하면, 타이틀은 사용자가 참가하려는 세션을 나타내는 매개 변수와 함께 활성화됩니다. 타이틀은 이러한 활성화를 처리하고 사용자를 해당 세션에 추가해야 합니다. 타이틀이 따라야 할 단계는 다음과 같습니다.-
CoreApplicationView.Activated이벤트에 대한 이벤트 처리기를 구현합니다. 이는 타이틀에 대한 활성화를 알립니다. -
처리기가 실행되면
IActivatedEventArgs.Kind속성을 검사합니다.Protocol로 설정되어 있으면 이벤트 인수를ProtocolActivatedEventArgs클래스로 캐스팅합니다. -
ProtocolActivatedEventArgs객체를 검사합니다.ProtocolActivatedEventArgs.Uri속성에 지정된 URI가inviteHandleAccept(수락된 초대에 해당) 또는activityHandleJoin(셸 UI를 통한 참가에 해당) 중 하나와 일치하면, URI의 쿼리 문자열을 구문 분석합니다. 이 문자열은 키/값 쌍이 있는 일반 URI 쿼리 문자열로 형식화되어 있으며, 다음 필드를 추출합니다.- 수락된 초대의 경우:
handleinvitedXuidsenderXuid
- 참가의 경우:
handlejoinerXuidjoineeXuid
- 수락된 초대의 경우:
- 타이틀의 멀티플레이어 코드를 시작합니다. 여기에는 XblMultiplayerSetSubscriptionsEnabled 호출이 포함되어야 합니다.
-
XblMultiplayerSessionCreateHandle을 호출하여 로컬
XblMultiplayerSessionHandle객체를 만듭니다. -
XblMultiplayerSessionJoin을 호출하여 세션에 참가합니다. 참가가 활성 상태로 설정되도록 다음 매개 변수 설정을 사용합니다.
memberCustomConstantsJson=nullinitializeRequested=falsejoinWithActiveStatus=true
- XblMultiplayerSessionSetSessionChangeSubscription을 호출하여 참가 후 세션이 변경될 때 숄더 탭을 받도록 합니다.
- 3단계에서 설명한 대로 획득한 핸들을 사용하여 XblMultiplayerWriteSessionByHandleAsync를 호출합니다. 이제 사용자는 세션의 구성원이며, 세션의 데이터를 사용하여 게임에 연결할 수 있습니다.
사용자의 현재 액티비티 설정
사용자의 현재 액티비티는 타이틀의 XBOX 대시보드 사용자 경험에 표시됩니다. 사용자에 대한 액티비티는 세션이나 타이틀 활성화를 통해 설정할 수 있습니다. 후자의 경우 사용자는 매치메이킹을 통해 또는 게임을 시작하여 세션에 진입합니다.세션을 통해 설정된 액티비티는 XblMultiplayerClearActivityAsync를 호출하여 삭제할 수 있습니다.
MPSD 세션 업데이트
타이틀이 멀티플레이어 API를 사용하여 기존 세션을 업데이트할 때, 세션을 쓰라는 호출을 할 때까지 로컬 사본을 다루고 있음을 기억하세요.
- 예를 들어 XblMultiplayerSessionLeave 호출과 같이 필요에 따라 현재 세션을 변경합니다.
-
모든 변경이 완료되면 다음 메서드 중 하나를 사용하여 로컬 변경 사항을 MPSD에 씁니다.
다른 타이틀도 수정할 수 있는 공유 부분에 쓰는 경우 쓰기 모드를 XblMultiplayerSessionWriteMode
::SynchronizedUpdate로 설정합니다. 자세한 내용은 Multiplayer Session Directory 개요 항목의 세션 업데이트 동기화 섹션을 참조하세요. write 메서드는 서버에 참가를 쓰고 최신 세션을 가져와서 다른 세션 구성원과 해당 콘솔의 보안 디바이스 주소(SDA)를 검색합니다. 이러한 콘솔 간에 네트워크 연결을 설정하는 방법에 대한 자세한 내용은 XBOX One의 Winsock 소개를 참조하세요. - 이전 로컬 세션 객체를 폐기합니다. 향후 작업이 최신의 알려진 세션 상태를 기반으로 하도록 새로 검색된 세션 객체를 사용합니다.
MPSD 세션 나가기
사용자가 세션을 나갈 수 있도록 하려면 타이틀에서 다음을 수행해야 합니다.- 게임 세션에 대해 XblMultiplayerSessionLeave를 호출합니다.
- 이 항목의 MPSD 세션 업데이트 섹션에 설명된 대로 MPSD의 게임 세션을 업데이트합니다.
-
필요한 경우 로비 세션에 대해
XblMultiplayerSessionLeave메서드를 호출한 다음, 해당 세션을 업데이트합니다. - 로비 세션에 필요한 경우, XblMultiplayerRemoveSubscriptionLostHandler 및 XblMultiplayerRemoveSessionChangedHandler를 호출하여 등록을 해제함으로써 멀티플레이어 API를 종료합니다.
매치메이킹 중 열려 있는 세션 슬롯 채우기
매치메이킹 중 티켓 세션의 열려 있는 슬롯을 채우려면 타이틀에서 다음과 유사한 단계를 수행해야 합니다.- 매치메이킹 중에 생성된 티켓 세션의 최신 세션 상태에 액세스합니다.
- 로비 세션에서 게임 플레이에 사용할 수 있는 플레이어를 추가합니다.
- 티켓 세션이 가득 찼는지 확인합니다.
- 세션이 가득 찼다면 게임 플레이를 계속합니다.
-
세션이 아직 가득 차지 않았다면 이 항목의 매치 티켓 생성에 설명된 대로 매치 티켓을 생성합니다.
preserveSession매개 변수를Always로 설정하여 티켓을 생성해야 합니다. - 매치메이킹을 계속합니다. 자세한 내용은 매치메이킹 개요를 참조하세요.
매치 티켓 생성
매치 티켓을 생성하려면 매치메이킹 스카우트가 다음을 수행해야 합니다.-
티켓 세션에 대한 참조를 전달하여 XblMatchmakingCreateMatchTicketAsync를 호출합니다. 이 메서드는 MPSD에서 티켓 세션을 읽고 세션의 사용자에 대한 매치메이킹을 시작합니다. 내부적으로 이 메서드는
POST (/serviceconfigs/{scid}/hoppers/{hoppername})을 호출합니다. -
매치메이킹 서비스가 세션의 구성원을 새 세션 또는 다른 기존 세션에 매치시키려는 경우
preserveSession매개 변수를Never로 설정합니다. 타이틀이 기존 게임 세션을 티켓 세션으로 재사용하여 게임 플레이를 계속하도록 하려면preserveSession매개 변수를Always로 설정합니다. 그러면 매치메이킹 서비스가 제출된 세션이 유지되도록 하고, 매치된 플레이어를 해당 세션에 추가하도록 할 수 있습니다. -
CreateMatchTicketResponse객체에서 반환되는 XblCreateMatchTicketResponse::EstimatedWaitTime을 사용하여 매치메이킹 시간에 대한 사용자 기대치를 설정합니다. -
필요한 경우 응답 객체에서 반환되는 XblCreateMatchTicketResponse
::MatchTicketId를 사용하여 티켓을 삭제함으로써 세션에 대한 매치메이킹을 취소합니다. 티켓 삭제는 XblMatchmakingDeleteMatchTicketAsync를 사용합니다.
매치 티켓 상태 가져오기
타이틀에서 매치 티켓 상태를 검색하려면 다음을 수행해야 합니다.-
티켓 세션에 대한
XblMultiplayerSessionHandle객체를 얻습니다. - XblMultiplayerSessionMatchmakingServer를 호출하여 매치메이킹에 사용된 XblMultiplayerMatchmakingServer 객체에 액세스합니다.
-
XblMultiplayerMatchmakingServer객체를 확인하여 매치메이킹 프로세스의 상태, 세션의 일반적인 대기 시간, 그리고 매치가 발견된 경우 대상 세션 참조를 확인합니다.
