로비 SDK 빠른 시작
이 문서에서는 Azure PlayFab Lobby용 개발 환경을 설정하고 PlayFab Multiplayer C/C++ SDK를 사용하여 첫 번째 로비를 만드는 방법을 설명합니다.
참고 항목
PlayFab 멀티 플레이어 SDK는 PlayFab 매치 메이킹을 위한 API도 제공합니다.
- C++ API에 대한 자세한 내용은 매치 메이킹 SDK 빠른 시작을 참조하세요.
- Unity API에 대한 자세한 내용은 Unity 빠른 시작을 참조하세요.
- Unreal API에 대한 자세한 내용은 Unreal용 빠른 시작을 참조하세요.
필수 구성 요소
PlayFab 로비를 사용하려면 PlayFab 계정이 필요합니다. 계정을 만드는 방법은 빠른 시작: 게임 관리자를 참조하세요.
PlayFab 멀티 플레이어 SDK 다운로드 및 설정
플랫폼용 C/C++ SDK를 다운로드하고 제공자 헤더와 라이브러리 파일을 빌드에 통합합니다.
참고 항목
이 빠른 시작은 C/C++ SDK 사용에 중점을 둡니다. Unity 및 Unreal 인터페이스에 대해서는 다음 문서를 참조하세요.
PlayFab 엔터티에 로그인
PlayFab Lobby SDK를 사용하려면 PlayFab 엔터티 키 및 엔터티 토큰을 사용하여 클라이언트를 인증해야 합니다. LoginWithCustomId REST API로 로그인하여 PlayFab 엔터티 키와 토큰 쌍을 획득합니다. 이 API는 PlayFab REST SDK를 통해 C/C++ 프로젝션으로도 사용할 수 있습니다.
참고 항목
LoginWithCustomId는 PlayFab 기능을 시작하는 빠른 방법이지만 함께 제공되는 로그인 메커니즘은 아닙니다. 로그인 지침은 로그인 기본 사항 및 모범 사례를 참조하세요.
PlayFab 멀티 플레이어 SDK 초기화
다음 기본 단계에 따라 PlayFab Multiplayer SDK를 초기화합니다.
- PFMultiplayerInitialize를 호출하여 SDK를 초기화합니다.
- PFMultiplayerSetEntityToken을 호출하여 플레이어 대신 라이브러리에서 사용하는 엔터티 키와 토큰을 설정합니다.
static PFMultiplayerHandle g_pfmHandle = nullptr;
...
...
HRESULT hr = S_OK;
// Initialize the PFMultiplayer library.
hr = PFMultiplayerInitialize(titleId, &g_pfmHandle);
if (FAILED(hr))
{
// handle initialize failure
printf("PFMultiplayerInitialize failed! %s\n", PFMultiplayerGetErrorMessage(hr));
return hr;
}
// Set an entity token for a local user. The token is used to authenticate PlayFab operations on behalf of this user.
// Tokens can expire, and this API token should be called again when this token is refreshed.
hr = PFMultiplayerSetEntityToken(g_pfmHandle, localUserEntity, entityToken);
if (FAILED(hr))
{
// handle set entity token failure
printf("PFMultiplayerSetEntityToken failed! %s\n", PFMultiplayerGetErrorMessage(hr));
return hr;
}
로비 만들기
마지막으로 다음 기본 단계에 따라 로비를 만듭니다.
- PFMultiplayerCreateAndJoinLobby를 호출합니다.
- PFLobbyCreateAndJoinLobbyCompletedStateChange에 대해 PFMultiplayerStartProcessingLobbyStateChanges를 주기적으로 폴링하여 비동기 완료를 확인합니다.
PFLobbyCreateConfiguration lobbyConfiguration{};
lobbyConfiguration.maxMemberCount = 16;
lobbyConfiguration.ownerMigrationPolicy = PFLobbyOwnerMigrationPolicy::Automatic;
lobbyConfiguration.accessPolicy = PFLobbyAccessPolicy::Public;
PFLobbyJoinConfiguration memberConfiguration{};
PFLobbyHandle lobby;
HRESULT hr = PFMultiplayerCreateAndJoinLobby(g_pfmHandle, localUserEntity, &lobbyConfiguration, &memberConfiguration, nullptr, &lobby);
if (FAILED(hr))
{
// handle immediate create failure
printf("PFMultiplayerCreateAndJoinLobby failed! %s\n", PFMultiplayerGetErrorMessage(hr));
return hr;
}
// NOTE: to simplify this quickstart, we'll synchronously block waiting waiting for the CreateAndJoinLobby operation
// to finish. In a real implementation, this polling would be done asynchronously on a background thread/worker.
bool createAndJoinLobbyFinished = false;
while (!createAndJoinLobbyFinished)
{
uint32_t lobbyStateChangeCount;
const PFLobbyStateChange * const * lobbyStateChanges;
HRESULT hr = PFMultiplayerStartProcessingLobbyStateChanges(m_pfmHandle, &lobbyStateChangeCount, &lobbyStateChanges);
if (FAILED(hr))
{
// handle the failure
printf("PFMultiplayerStartProcessingLobbyStateChanges failed! %s\n", PFMultiplayerGetErrorMessage(hr));
return hr;
}
for (uint32_t i = 0; i < lobbyStateChangeCount; ++i)
{
const PFLobbyStateChange* stateChange = lobbyStateChanges[i];
switch (stateChange->stateChangeType)
{
case PFLobbyStateChangeType::CreateAndJoinLobbyCompleted:
{
auto createAndJoinStateChange =
static_cast<const PFLobbyCreateAndJoinLobbyCompletedStateChange*>(stateChange);
if (SUCCEEDED(createAndJoinStateChange->result))
{
// lobby successfully created!
printf("Lobby 0x%p successfully created!\n", createAndJoinStateChange->lobby);
}
else
{
// report asynchronous failure
printf("Failed to create lobby 0x%p! %s\n",
createAndJoinStateChange->lobby,
PFMultiplayerGetErrorMessage(createAndJoinStateChange->result));
}
createAndJoinLobbyFinished = true;
break;
}
}
}
hr = PFMultiplayerFinishProcessingLobbyStateChanges(m_pfmHandle, lobbyStateChangeCount, lobbyStateChanges);
if (FAILED(hr))
{
printf("PFMultiplayerFinishProcessingLobbyStateChanges failed! %s\n", PFMultiplayerGetErrorMessage(hr));
return hr;
}
}
로비를 만드는 방법에 대한 자세한 내용은 로비 만들기를 참조하세요.
비동기 작업 처리에 대한 자세한 내용은 비동기 작업 및 알림을 참조 하세요.