Win32용 PlayFab Services SDK를 시작해 보세요. 다음 단계에 따라 라이브러리를 프로젝트에 포함하고 기본 PlayFab 기능을 위한 샘플 코드를 시도해 보세요.이 빠른 시작은 Win32 SDK를 사용해 첫 번째 PlayFab API 호출을 수행하는 데 도움이 됩니다. 계속하기 전에 빠른 시작: Game Manager의 단계를 완료했는지 확인하세요. 이 단계에서는 PlayFab 계정이 있고 PlayFab Game Manager에 익숙한지 확인합니다.
PlayFab SDK 릴리스 페이지에서 PlayFab SDK를 프로젝트에 다운로드하세요.PlayFabServicesSDK.Win32.props를 프로젝트로 가져옵니다. 프로젝트 파일에서 수동으로 또는 Visual Studio에서 속성 관리자 창을 열고 프로젝트를 마우스 오른쪽 버튼으로 클릭한 후 __Add Existing Property Sheet__를 선택해 이 작업을 수행할 수 있습니다.
PlayFab 초기화에는 __PFServicesInitialize__와 PFServiceConfigCreateHandle 두 함수 호출이 필요합니다. 이 초기화의 결과가 __PFServiceConfigHandle__입니다. 이 핸들을 이후 로그인 호출에 제공하여 PlayFab 백엔드의 올바른 타이틀로 호출을 지시합니다.
HRESULT hr = PFServicesInitialize(nullptr); // Add your own error handling when FAILED(hr) == true PFServiceConfigHandle serviceConfigHandle{ nullptr }; hr = PFServiceConfigCreateHandle( "https://ABCDEF.playfabapi.com", // PlayFab API endpoint - obtained in the Game Manager "ABCDEF", // PlayFab Title id - obtained in the Game Manager &serviceConfigHandle);
__PFServiceConfigHandle__을 얻은 후에는 이를 사용해 플레이어 로그인 호출을 수행할 수 있습니다. SDK에서는 __PFAuthenticationLoginWithSteamAsync__와 같은 PFAuthenticationReLoginWith*Async 메서드를 사용합니다. 이 함수를 사용하면 __SteamTicket__을 사용해 플레이어를 PlayFab에 로그인할 수 있습니다.로그인 호출을 수행한 후 __XAsyncGetStatus__로 호출 상태를 확인할 수 있습니다. 상태는 __E_PENDING__으로 시작하여 호출이 성공적으로 완료된 후 __S_OK__로 변경됩니다. 어떤 이유로 호출이 실패하면 상태에 해당 실패가 반영됩니다. 모든 PlayFab Services 호출에 대한 오류 처리는 이 방식으로 작동합니다.S_OK 결과와 함께 __PFEntityHandle__을 다시 받게 됩니다. 이 핸들을 사용해 로그인된 플레이어로서 이후의 PlayFab 호출을 수행합니다. 여기에는 해당 플레이어로 PlayFab 서비스에 인증하는 데 필요한 모든 자료가 포함됩니다.
PFAuthenticationLoginWithSteamRequest request{}; request.createAccount = true; request.steamTicket = steamTicket; // A ticket obtained from Steam XAsyncBlock async{}; HRESULT hr = PFAuthenticationLoginWithSteamAsync(serviceConfigHandle, &request, &async); // Add your own error handling when FAILED(hr) == true hr = XAsyncGetStatus(&async, true); // This is doing a blocking wait for completion, but you can use the XAsyncBlock to set a callback instead for async style usage std::vector<char> loginResultBuffer; PFAuthenticationLoginResult const* loginResult; size_t bufferSize; hr = PFAuthenticationLoginWithSteamGetResultSize(&async, &bufferSize); loginResultBuffer.resize(bufferSize); PFEntityHandle entityHandle{ nullptr }; hr = PFAuthenticationLoginWithSteamGetResult(&async, &entityHandle, loginResultBuffer.size(), loginResultBuffer.data(), &loginResult, nullptr);
모든 PlayFab 호출은 요청 객체를 준비하고, (로그인의 __PFEntityHandle__을 사용해) 호출을 수행하고, 응답을 받을 객체를 생성한 다음, GetResult 함수를 호출해 새로 생성된 컨테이너를 채우는 유사한 패턴을 따릅니다.
XAsyncBlock async{}; PFDataGetFilesRequest requestFiles{}; requestFiles.entity = pEntityKey; HRESULT hr = PFDataGetFilesAsync(entityHandle, &requestFiles, &async); // Add your own error handling when FAILED(hr) == true hr = XAsyncGetStatus(&async, true); // This is doing a blocking wait for completion, but you can use the XAsyncBlock to set a callback instead for async style usage size_t resultSize; hr = PFDataGetFilesGetResultSize(&async, &resultSize); std::vector<char> getFilesResultBuffer(resultSize); PFDataGetFilesResponse* getFilesResponseResult{ nullptr }; hr = PFDataGetFilesGetResult(&async, getFilesResultBuffer.size(), getFilesResultBuffer.data(), &getFilesResponseResult, nullptr);
게임이 종료될 준비가 되었거나 다른 이유로 PlayFab을 정리해야 하는 경우, 열려 있는 모든 핸들을 닫고 __PFServicesUninitializeAsync__를 호출해야 합니다.
PFEntityCloseHandle(entityHandle); entityHandle = nullptr; PFServiceConfigCloseHandle(serviceConfigHandle); serviceConfigHandle = nullptr; XAsyncBlock async{}; HRESULT hr = PFServicesUninitializeAsync(&async); // Add your own error handling when FAILED(hr) == true hr = XAsyncGetStatus(&async, true); // This is doing a blocking wait for completion, but you can use the XAsyncBlock to set a callback instead for async style usage
PlayFab Services SDK는 GDK에서 구현된 비동기 프로그래밍 모델을 따릅니다. 이 프로그래밍 모델은 XAsync 라이브러리에서 제공하는 Tasks와 Task Queues 사용을 포함합니다. 이 모델은 다른 GDK 함수 및 확장(예: XBOX Services API)과 일관성이 있습니다. 약간의 복잡성을 도입하지만, 비동기 작업에 대한 높은 수준의 제어도 제공합니다.이 예제는 __PFDataGetFilesAsync__에 대한 비동기 호출을 수행하는 방법을 보여줍니다.
auto async = std::make_unique<XAsyncBlock>(); async->callback = [](XAsyncBlock* async) { std::unique_ptr<XAsyncBlock> asyncBlockPtr{ async }; // take ownership of XAsyncBlock size_t resultSize; HRESULT hr = PFDataGetFilesGetResultSize(async, &resultSize); if (SUCCEEDED(hr)) { std::vector<char> getFilesResultBuffer(resultSize); PFDataGetFilesResponse* getFilesResponseResult{ nullptr }; PFDataGetFilesGetResult(async, getFilesResultBuffer.size(), getFilesResultBuffer.data(), &getFilesResponseResult, nullptr); } }; PFDataGetFilesRequest requestFiles{}; requestFiles.entity = m_pEntityKey; HRESULT hr = PFDataGetFilesAsync(m_entityHandle, &requestFiles, async.get()); if (SUCCEEDED(hr)) { async.release(); // at this point, the callback will be called so release the unique ptr }
완료된 XAsync 작업은 HTTP 상태 코드를 반환합니다. 오류 상태 코드는 XAsyncGetStatus() 또는 PF*Get() API 중 하나를 호출할 때 HTTP_E_STATUS_NOT_FOUND와 같은 실패 HRESULT로 나타납니다.서비스에서 반환된 자세한 오류 메시지를 보려면 디버깅에 대한 다음 섹션을 참조하세요. 이러한 자세한 오류 메시지는 개발 중에 PlayFab 서비스가 클라이언트의 요청에 어떻게 반응하는지 더 잘 이해하는 데 유용할 수 있습니다.