메인 콘텐츠로 건너뛰기
Game Saves는 온라인과 오프라인 모두에서 작동하도록 설계되어 있어, 네트워크 연결이 불가능한 경우에도 플레이어가 계속해서 플레이할 수 있습니다. 이 시스템은 네트워크 가용성과 사용자 선택에 따라 두 가지 뚜렷한 모드로 동작합니다.

연결 모드

클라우드 연결 모드

네트워크가 사용 가능하고 PFGameSaveFilesAddUserWithUiAsync()가 성공적으로 완료되면, 시스템은 클라우드 연결 모드로 동작합니다. 이 모드에서는 다음이 이루어집니다.
  • 모든 API가 정상적으로 작동하며 완전한 클라우드 동기화가 수행됩니다.
  • 세이브 데이터 업로드가 정상적으로 작동합니다.
  • 저장소 할당량 정보를 사용할 수 있습니다.
  • 활성 디바이스 모니터링이 제대로 작동합니다.

오프라인 모드(클라우드 미연결)

네트워크를 사용할 수 없거나 사용자가 오프라인 플레이를 선택한 경우, 시스템은 제한된 기능을 가진 오프라인 모드로 진입합니다. PFGameSaveFilesIsConnectedToCloud()를 사용하여 현재 연결 상태를 확인함으로써 시스템이 어떤 모드에서 동작 중인지 확인할 수 있습니다.

초기 동기화 중 네트워크 실패 처리

네트워크 연결 없이 PFGameSaveFilesAddUserWithUiAsync()가 호출되면 PFGameSaveFilesUiSyncFailedCallback이 트리거됩니다. 시스템이 사용자의 응답을 기다리는 동안 XAsyncBlock 콜백은 실행되지 않습니다. 사용자가 종료 액션을 선택할 때까지 비동기 작업이 일시 중지됩니다.
사용자 응답 옵션:
  • 다시 시도(Retry): 네트워크 호출을 재시도합니다. 재시도도 실패하면 이 콜백이 다시 실행되고 사용자가 다시 응답해야 합니다. 각 재시도 루프에서 XAsyncBlock 콜백은 지연된 상태로 유지됩니다.
  • 오프라인으로 사용(UseOffline): XAsyncBlock 콜백이 S_OK로 실행되지만, 시스템은 오프라인 모드로 진입합니다(PFGameSaveFilesIsConnectedToCloud()로 감지 가능).
  • 취소: XAsyncBlock 콜백이 E_PF_GAMESAVE_USER_CANCELLED로 실행됩니다.

오프라인 모드에서의 API 동작

오프라인 모드에서는 API가 다르게 동작합니다.

정상적으로 작동하는 API

  • PFGameSaveFilesGetFolder() - 로컬 세이브 폴더 경로를 반환합니다.

제한된 기능을 가진 API

  • PFGameSaveFilesUploadWithUiAsync() - 즉시 S_OK를 반환하지만, 비동기 완료는 E_PF_GAMESAVE_DISCONNECTED_FROM_CLOUD를 반환합니다.
  • PFGameSaveFilesGetRemainingQuota() - E_PF_GAMESAVE_DISCONNECTED_FROM_CLOUD를 반환합니다.
  • PFGameSaveFilesSetActiveDeviceChangedCallback() - 설정할 수는 있지만 트리거되지 않습니다.

온라인 모드로 복귀

  • PFGameSaveFilesAddUserWithUiAsync()를 다시 호출하여 재연결을 시도합니다.
  • Game Saves 시스템을 완전히 다시 초기화할 필요는 없습니다.
  • 네트워크가 여전히 사용 불가능하면 실패 UI가 다시 표시됩니다.
  • 재시도 후 PFGameSaveFilesIsConnectedToCloud()를 사용하여 연결 상태를 확인합니다.

Game Saves가 오프라인 모드로 진입하거나 오류를 반환하는 경우

통합 시 자주 묻는 질문은 *초기 동기화(PFGameSaveFilesAddUserWithUiAsync)가 언제 플레이어를 오프라인 모드로 전환하고, 언제 오류 코드와 함께 실패하는가?*입니다. 종료 결과는 연결됨, 오프라인, 취소됨의 세 가지이며, 취소는 플레이어 또는 게임 중 어느 쪽에서든 발생할 수 있습니다. 핵심 사항:
  • 오프라인 모드는 오류가 아니라 성공 결과입니다. 명시적인 Use Offline 선택으로만 진입하며, 비동기 작업은 S_OK로 완료됩니다. PFGameSaveFilesIsConnectedToCloud()로 감지합니다.
  • 일시적/기술적 실패는 동기화 실패 UI를 통해 표시되며, PFGameSaveFilesAddUserWithUiAsync에서 직접 반환되지 않습니다. 그런 다음 사용자(또는 자동 응답)가 Retry, UseOffline 또는 Cancel을 선택하며, 이는 위의 세 가지 결과 중 하나로 이어집니다.
  • 취소는 종료 결과이며 세이브 폴더를 생성하지 않습니다. “취소됨”(또는 폴더를 남기지 않는 모든 실패)은 플레이를 허용하지 않음으로 처리하세요.
  • 플레이어 취소와 게임 취소는 서로 다른 코드를 반환합니다. 플레이어가 프롬프트에서 Cancel을 선택한 경우에만 E_PF_GAMESAVE_USER_CANCELLED가 생성됩니다. 게임이 XAsyncCancel로 작업을 직접 취소하면 E_ABORT로 완료됩니다. 둘을 같은 방식으로 처리하려면 두 코드를 모두 확인하세요.
충돌 프롬프트를 취소하는 것도 종료 결과입니다. E_PF_GAMESAVE_USER_CANCELLED로 완료되며, 동기화 실패 “Use Offline” 프롬프트로 자동으로 넘어가지 않습니다. “충돌을 거부하되 오프라인으로 계속 플레이”하는 환경을 원한다면 명시적으로 설계하세요(예: PFGameSaveFilesAddUserWithUiAsync를 다시 실행하고 그 결과로 발생한 실패에서 Use Offline을 선택). Game Saves 충돌을 참조하세요.

Game Saves 오류 코드

다음 HRESULT는 Game Saves SDK에서 정의합니다. 0x8923xxxx 범위의 코드는 Game Saves 전용이며, 0x800704C7은 HRESULT_FROM_WIN32(ERROR_CANCELLED)입니다. 이러한 결과가 기본 제공(out-of-process) 시스템 UI와 사용자 지정 콜백에서 각각 어떻게 생성되는지는 Game Saves UI 콜백을 참조하세요.

추가 연결 상태 시나리오

PFGameSaveFilesIsConnectedToCloud() API는 연결 해제가 여러 방식으로 발생할 수 있기 때문에 특히 유용합니다.
  • 동기화 중 네트워크 사용 불가: 사용자가 명시적으로 오프라인 플레이를 선택합니다.
  • 활성 디바이스 변경: 다른 디바이스가 활성 디바이스로 인계되어 이 디바이스가 자동으로 오프라인 모드로 전환됩니다.
클라우드 작업을 시도하기 전에 이 API를 사용하여 적절한 사용자 피드백을 제공하세요.

오프라인 지원을 위한 모범 사례

  1. 항상 동기화 실패 콜백을 구현하여 네트워크 문제를 원활하게 처리하세요
  2. 클라우드 작업을 시도하기 전에 PFGameSaveFilesIsConnectedToCloud()를 사용하여 연결 상태를 정기적으로 확인하세요
  3. 오프라인 모드로 작동 중일 때 플레이어에게 알려서 세이브가 동기화되지 않는다는 점을 인지시키세요
  4. 네트워크 연결이 복구되면 재시도 옵션을 제공하세요
  5. 로컬 세이브는 항상 작동합니다 - 플레이어는 네트워크 상태와 관계없이 계속 플레이할 수 있습니다
  6. 연결 해제 모니터링 - 다른 디바이스가 활성화될 때 디바이스가 연결 해제될 수 있음을 기억하세요

연결 모드에서의 업로드 동작

연결 모드에서도 네트워크 문제나 속도 제한으로 인해 업로드가 실패할 수 있습니다. 이런 경우 XAsyncBlock 콜백이 즉시 실행되지 않습니다. 시스템이 UI 콜백 상태 머신을 통해 사용자의 응답을 기다리는 동안 비동기 작업이 일시 중지됩니다.
  1. PFGameSaveFilesUiSyncFailedCallback이 오류 세부 정보와 함께 실행됩니다.
  2. XAsyncBlock 콜백은 아직 실행되지 않습니다. 시스템이 응답을 기다리는 동안 작업이 일시 중지됩니다.
  3. 사용자가 Retry를 선택하면 업로드가 재시도됩니다. 다시 실패하면 콜백이 다시 실행되고 사용자가 다시 응답해야 합니다.
  4. 사용자가 Cancel을 선택하면 XAsyncBlock 콜백이 E_PF_GAMESAVE_USER_CANCELLED로 실행됩니다.
  5. 재시도가 성공하면 XAsyncBlock 콜백이 S_OK로 실행됩니다.
게임은 네트워크가 복구된 후 나중에 PFGameSaveFilesUploadWithUiAsync()를 다시 호출할 수 있습니다.
In-process에서는 업로드가 실행 중인 동안 동기화 실패 프롬프트에 Use Offline을 제공하지 마세요. 업로드는 초기 동기화와 동일한 PFGameSaveFilesUiSyncFailedCallback을 실행하므로 SDK가 선택지를 제한하지 않습니다. 하지만 게임이 업로드 실패에 UseOffline으로 응답하면 업로드는 E_ABORT로 실패합니다(디버그 빌드에서는 어설션이 발생합니다). 이 경우 Retry와 Cancel만 제공하세요.

업로드로 인해 세션이 오프라인이 되는 경우

업로드는 일반적으로 연결 모드를 변경하지 않지만, 다음과 같은 경우 세션이 오프라인 상태로 끝날 수 있습니다. 각 경우 업로드는 E_PF_GAMESAVE_DISCONNECTED_FROM_CLOUD로 완료되며, 이후 PFGameSaveFilesIsConnectedToCloud()는 false를 반환합니다.
  • 세션이 이미 오프라인 상태였습니다. 네트워크가 복구되었더라도 업로드는 실행되지 않고 E_PF_GAMESAVE_DISCONNECTED_FROM_CLOUD로 완료됩니다.
  • 클라우드에 더 최신 세이브가 있습니다. 업로드를 마무리할 때 다른 디바이스에서 더 최신 세이브가 커밋되었다고 서비스가 보고하면, Game Saves는 세션을 오프라인으로 전환하고 활성 디바이스 변경 콜백을 실행한 다음 업로드를 E_PF_GAMESAVE_DISCONNECTED_FROM_CLOUD로 완료합니다.
  • 플레이어가 다시 잠금 프롬프트에서 Use Offline을 선택합니다. 이전 업로드가 데이터를 커밋했지만 이후에 실패한 경우, 다음 업로드는 먼저 세이브 잠금을 다시 획득해야 합니다. 이 단계에서 표시되는 동기화 실패 프롬프트에 UseOffline으로 응답할 수 있으며, 그러면 세션이 오프라인으로 전환되고 업로드는 E_PF_GAMESAVE_DISCONNECTED_FROM_CLOUD로 완료됩니다.
다시 연결하려면 PFGameSaveFilesAddUserWithUiAsync()를 다시 호출하세요.

업로드 취소

업로드는 초기 동기화와 같은 방식으로 취소할 수 있습니다. 사용자는 업로드가 진행 중일 때 진행률 UI를 Cancel하거나, 업로드에 오류가 발생한 경우 동기화 실패 프롬프트를 Cancel할 수 있습니다. 어느 경우든 PFGameSaveFilesUploadWithUiAsync()는 E_PF_GAMESAVE_USER_CANCELLED(0x800704C7)로 완료되며 세이브는 업로드되지 않습니다. 종료 결과는 성공, 취소됨 또는 실패입니다(여기서 E_PF_GAMESAVE_DISCONNECTED_FROM_CLOUD는 세션이 이제 오프라인임을 의미합니다. 업로드로 인해 세션이 오프라인이 되는 경우 참조). “플레이어가 취소함”과 “업로드 오류 발생”을 구분할 수 있도록 E_PF_GAMESAVE_USER_CANCELLED를 다른 실패와 별도로 처리하세요. 게임이 XAsyncCancel로 업로드를 직접 취소하면 E_PF_GAMESAVE_USER_CANCELLED가 아닌 E_ABORT로 완료됩니다.
마지막 수정일 2026년 10월 20일