멀티 플레이어 작업
이 항목에서는 2015 멀티 플레이어 사용과 관련된 특정 작업을 구현하는 방법을 설명합니다.
이 항목에서는 다음에 대해 설명합니다.
- MPSD(멀티 플레이어 세션 디렉터리) 세션 변경 알림 구독
- MPSD 세션 생성
- MPSD 세션에 대한 중재자 설정
- 타이틀 인증 관리
- 사용자를 참가 가능 상태로 전환
- 게임 초대 보내기
- 로비 세션에서 게임 세션 참가
- 타이틀 활성화에서 MPSD 세션에 참가
- 사용자의 현재 활동 설정
- MPSD 세션 업데이트
- MPSD 세션 나가기
- 매치 메이킹 도중 열린 세션 슬롯 채우기
- 매치 티켓 만들기
- 매치 티켓 상태 가져오기
MPSD(멀티 플레이어 세션 디렉터리) 세션 변경 알림 구독
참고 항목
세션 변경 구독 시 연결된 플레이어가 세션에서 활성 상태여야 합니다.
connectionRequiredForActiveMembers
필드도 세션의 /constants/system/capabilities
개체에서 true
(으)로 설정해야 합니다. 이 필드는 대체로 세션 템플릿에서 설정됩니다. 자세한 내용은 멀티 플레이어 세션 템플릿 및 멀티 플레이어 세션 디렉토리 개요를 참조하세요.
MPSD 세션 변경 알림을 받으려면 타이틀에서 다음 절차를 사용할 수 있습니다.
동일한 사용자의 모든 통화에 동일한
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 세션은 첫 번째 멤버가 참가하면 생성됩니다. 타이틀 논리에서 타이틀이 참가 시점에 존재하거나 존재하지 않는 것으로 예상하는 경우 세션 업데이트 동안 적절한 쓰기 모드 값을 쓰기 메서드로 전달할 수 있습니다.
새 세션을 만들려면 타이틀이 다음을 수행 해야 합니다.
새
XblContextHandle
객체 생성. 제목이 객체를 한번 생성하면 저작하고 소스 코드에서 요청할 때 마다 재사용합니다. 특히 세션 구독 작업 중에 동일한 내용을 사용해야 합니다.신규 세션을 생성하기 위해 MPSD가 필요로 하는 모든 세션 데이터를 준비하기 위해 XblMultiplayerSessionCreateHandle와 함께 새로운
XblMultiplayerSessionHandle
을(를) 생성합니다.MPSD에 세션을 작성 하기 전에 필수 사항을 변경합니다. 예를 들어 XblMultiplayerSessionJoin에 호출함으로써 구성원을 세션에 추가할 때 클라이언트는 MPSD에 세션 업데이트시 가입할 것을 알리는 숨겨진 로컬 요청 데이터를 추가합니다.
로컬 변경이 끝나면 이 항목의 MPSD 세션 업데이트 섹션에 설명된 대로 MPSD에 작성합니다.
MPSD로부터 많은 필드가 입력되어 있는 새
XblMultiplayerSessionHandle
개체를 받습니다.앞으로 새 세션 개체를 사용합니다. 새 세션을 만들기 위한 숨겨진 요청이 포함된 이전 복사본을 삭제합니다.
예제
플랫 C API
auto asyncBlock = std::make_unique<XAsyncBlock>();
asyncBlock->queue = queue;
asyncBlock->context = nullptr;
asyncBlock->callback = [](XAsyncBlock* asyncBlock)
{
std::unique_ptr<XAsyncBlock> asyncBlockPtr{ asyncBlock }; // Take over ownership of the XAsyncBlock*.
XblMultiplayerSessionHandle sessionHandle;
HRESULT hr = XblMultiplayerWriteSessionResult(asyncBlock, &sessionHandle);
if (SUCCEEDED(hr))
{
// Process multiplayer session handle.
}
else
{
// Handle failure.
}
};
XblMultiplayerSessionReference ref;
pal::strcpy(ref.Scid, sizeof(ref.Scid), SCID);
pal::strcpy(ref.SessionTemplateName, sizeof(ref.SessionTemplateName), SESSION_TEMPLATE_NAME);
pal::strcpy(ref.SessionName, sizeof(ref.SessionName), SESSION_NAME);
XblMultiplayerSessionInitArgs args = {};
XblMultiplayerSessionHandle sessionHandle = XblMultiplayerSessionCreateHandle(XUID, &ref, &args);
auto hr = XblMultiplayerSessionJoin(
sessionHandle,
memberCustomConstantsJson.c_str(),
initializeRequested,
joinWithActiveStatus);
hr = XblMultiplayerWriteSessionAsync(xblContextHandle, sessionHandle, XblMultiplayerSessionWriteMode::CreateNew, asyncBlock.get());
if (SUCCEEDED(hr))
{
// The call succeeded, so release the std::unique_ptr ownership of XAsyncBlock* because the callback will take over ownership.
// If the call fails, std::unique_ptr will keep ownership and delete XAsyncBlock*.
asyncBlock.release();
}
자세한 내용은 다음을 참조하십시오.
MPSD 세션에 대한 중재자 설정
타이틀에서는 다음 절차를 사용하여 이미 생성된 세션에 대한 중재자를 설정합니다.
참고 항목
멤버(잠재적 호스트)를 위한 장치 토큰은 멤버가 세션에 참여하고 보안 장치 주소를 포함해야 사용 가능합니다.
MPSD에서 XblMultiplayerSessionMembers호출 하여 호스트 후보의 장치 토큰을 불러옵니다.
참고 항목
만약 세션이 SmartMatch의 매치 메이킹에 의해 생성되었다면 사용자의 클라이언트는 XblMultiplayerSessionHostCandidates를 호출함으로써 MPSD에서 사용 가능한 호스트 후보를 사용할 수 있습니다.
호스트 후보 목록에서 필수 호스트를 선택 합니다.
XblMultiplayerSessionSetHostDeviceToken를 호출하여 MPSD의 로컬 캐시에 장치 토큰을 설정합니다. 호스트 장치 토큰 설정 호출이 성공하면 로컬 장치 토큰이 호스트 토큰을 대체합니다.
호스트 장치 토큰을 설정하려 할 때 HTTP/412 상태 코드를 받은 경우 세션 데이터를 쿼리합니다. 호스트 디바이스 토큰이 로컬 콘솔용인지 확인합니다. 로컬 콘솔용이 아닌 경우 다른 콘솔이 중재자로 지정되었습니다.
참고 항목
HTTP/412는 표준 오류를 나타내지 않으므로 클라이언트에서 HTTP/412 상태 코드를 다른 HTTP 코드와 별도로 처리해야 합니다. 이 상태 코드에 대한 자세한 내용은 멀티 플레이어 세션 상태 코드를 참조하세요.
이 항목의 MPSD 세션 업데이트 섹션의 설명대로 MPSD에서 세션을 업데이트합니다.
참고 항목
더 나은 알고리즘이 없는 경우 클라이언트에서 탐욕(Greedy) 알고리즘을 구현하고, 각 호스트 후보는 아무도 아직 호스트로 설정되지 않은 경우 스스로를 호스트로 설정하려 합니다. 자세한 내용은 멀티플레이어 세션 고급 항목의 세션 중재자 섹션을 참조하세요.
타이틀 인증 관리
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 장치의 게임 플레이 세션이 대규모 세션이 아닌 경우 true
설정을 위한 userAuthorizationStyle
기능이 있어야 합니다. 따라서 joinRestriction
속성은 none
이(가) 될 수 없고, 이는 세션이 공개적으로 직접 가입할 수 없음을 의미합니다.
일반적인 시나리오는 로비 세션을 만들어 플레이어를 수집한 다음 이러한 플레이어를 게임 플레이 세션 또는 매치 메이킹 세션으로 옮기는 것입니다. 그러나 게임 플레이 세션이 공개적으로 참가할 수 없는 경우 게임 클라이언트는 joinRestriction
설정을 충족하지 않는 한 게임 플레이 세션에 참가할 수 없습니다. 대부분의 경우 이 시나리오에서는 너무 제한적입니다.
해결 방법은 전송 핸들을 사용하여 로비 세션과 게임 세션을 연결하는 것입니다. 제목은 다음을 수행하여 이것을 할 수 있습니다.
게임 세션을 생성할 때 XblMultiplayerSetTransferHandleAsyncAPI를 사용하여 로비 세션과 게임 세션을 연결하는 전송 관리를 생성합니다.
전송 관리 GUID를 게임 세션 참조가 아닌 로비 세션에 저장하세요.
제목이 로비 세션에서 게임 세션으로 구성원을 이전하길 원하는 경우 각 클라이언트는 XblMultiplayerWriteSessionByHandleAsync API를 사용함으로써 로비 세션에서부터 게임 세션에 가입하게 하기 위해 전송 관리를 사용합니다.
MPSD는 로비 세션을 조회하여 전송 핸들을 사용함으로써 게임 세션에 참가하려 하는 멤버가 로비 세션에도 있는지 확인합니다.
멤버가 로비 세션에 있는 경우 게임 세션에 액세스할 수 있습니다.
타이틀 활성화에서 MPSD 세션에 참가
사용자가 Xbox 셸 UI를 사용하여 친구의 활동에 참가하거나 초대를 수락한 경우 타이틀은 사용자가 참가하고자 하는 세션을 나타내는 매개 변수와 함께 활성화됩니다. 타이틀에서 이 활성화를 처리하고 사용자를 해당 세션에 추가해야 합니다.
타이틀은 다음 단계를 수행해야 합니다.
CoreApplicationView.Activated
이벤트를 위한 이벤트 관리자를 구현합니다. 이는 타이틀의 활성화를 알립니다.관리자가 잘리마녀
IActivatedEventArgs.Kind
속성 검토.Protocol
(으)로 설정된 경우 이벤트 인수를ProtocolActivatedEventArgs
클래스로 캐스팅합니다.ProtocolActivatedEventArgs
객체 확인.ProtocolActivatedEventArgs.Uri
속성에 표시된 URI가inviteHandleAccept
(수락된 초대에 해당) 또는activityHandleJoin
(셸 UI를 통한 참가에 해당)과(와) 일치하는 경우 URI의 쿼리 문자열을 구문 분석합니다. 키/값 쌍이 있는 일반 URI 쿼리 문자열로 형식이 지정되어 다음 필드를 추출합니다.- 받아들인 초대의 경우:
handle
invitedXuid
senderXuid
- 참가의 경우:
handle
joinerXuid
joineeXuid
- 받아들인 초대의 경우:
XblMultiplayerSetSubscriptionsEnabled호출을 포함하는 제목 멀티플레이어 코드 시작
XblMultiplayerSessionCreateHandle을 호출하여 로컬
XblMultiplayerSessionHandle
객체 생성.세션에 참가하기 위해 XblMultiplayerSessionJoin를 호출 합니다. 다음 매개 변수 설정을 사용하여 참여가 활성으로 설정되도록 합니다.
memberCustomConstantsJson
=null
initializeRequested
=false
joinWithActiveStatus
=true
참가 후 세션 변경이 된 경우 어깨 탭이 되기 위해 XblMultiplayerSessionSetSessionChangeSubscription 호출.
3단계에 설정된 대로 가져온 핸들을 사용하여 XblMultiplayerWriteSessionByHandleAsync 호출합니다. 이제 사용자는 세션의 멤버이며 게임에 연결하기 위해 세션에서 데이터를 사용할 수 있습니다.
사용자의 현재 활동 설정
사용자의 현재 활동은 타이틀에 대한 Xbox 대시보드 사용자 환경에 표시됩니다. 사용자에 대한 활동은 세션 또는 타이틀 활성화를 통해 설정될 수 있습니다. 후자의 경우 사용자는 매치 메이킹을 통해 또는 게임을 시작하여 세션에 들어옵니다.
참고
세션을 통해 설정 된 활동은 XblMultiplayerClearActivityAsync를 호출하여 삭제할 수 있습니다.
사용자의 현재 활동으로 세션을 설정하기 위해 타이틀이 XblMultiplayerSetActivityAsync를 호출합니다. 세션에 대한 세션 참조를 전달합니다.
제목 정품 인증을 통해 사용자의 현재 활동을 설정하려면 이 항목에서 제목 정품 인증에서 MPSD 세션에 참가를 참조하세요.
MPSD 세션 업데이트
참고 항목
타이틀에서 멀티 플레이어 API를 사용하여 기존 세션을 업데이트하는 경우 세션 쓰기 호출이 있기까지 로컬 복사본으로 작동한다는 점을 명심해야 합니다.
기존 세션을 업데이트 하려면 타이틀이 다음을 수행해야 합니다.
현재 세션을 필수로 변경(예: XblMultiplayerSessionLeave 호출).
모든 변경 내용이 완료되면 다음의 방법을 사용하여 MPSD에 대한 로컬 변경 내용을 기록 합니다.
다른 타이틀에서도 수정할 수 있는 공유 부분에 쓰는 경우 쓰기 모드를 XblMultiplayerSessionWriteMode
::SynchronizedUpdate
(으)로 설정합니다. 자세한 내용은 멀티 플레이어 세션 디렉토리 개요 항목의 세션 업데이트 동기화 섹션을 참조하세요.쓰기 메서드는 서버에 참가를 쓰고 최신 세션을 가져옵니다. 여기에서 다른 세션 멤버 및 콘솔의 보안 장치 주소(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
개체를 구합니다.매치 메이킹에 사용되는 XblMultiplayerMatchmakingServer 개체에 액세스하기 위해 XblMultiplayerSessionMatchmakingServer 호출합니다.
XblMultiplayerMatchmakingServer
개체를 확인하여 매치 메이킹 프로세스의 상태, 세션에 대한 일반적 대기 시간 및 매치를 찾은 경우 대상 세션 참조를 결정합니다.