Unity 게임에 저장된 게임

이 주제에서는 Unity 게임에서 Play 게임즈 서비스에 저장된 게임을 사용하는 방법을 설명합니다.

시작하기 전에

  • Unity 프로젝트와 Unity용 Google Play 게임즈 플러그인을 설정합니다. 자세한 내용은 시작 가이드를 참고하세요.

  • 저장된 게임을 사용 설정합니다. 자세한 내용은 저장된 게임 가이드를 참고하세요.

저장된 게임 UI 표시

다음 메서드를 호출하면 저장된 게임 항목을 선택하거나 생성하는 표준 UI가 표시됩니다.

    void ShowSelectUI() {
        uint maxNumToDisplay = 5;
        bool allowCreateNew = false;
        bool allowDelete = true;

        ISavedGameClient savedGameClient = PlayGamesPlatform.Instance.SavedGame;
        savedGameClient.ShowSelectSavedGameUI("Select saved game",
            maxNumToDisplay,
            allowCreateNew,
            allowDelete,
            OnSavedGameSelected);
    }


    public void OnSavedGameSelected (SelectUIStatus status, ISavedGameMetadata game) {
        if (status == SelectUIStatus.SavedGameSelected) {
            // handle selected game save
        } else {
            // handle cancel or error
        }
    }

저장된 게임 열기

저장된 게임에 데이터를 읽거나 쓰려면 저장된 게임을 열어야 합니다. 저장된 게임 상태는 기기에 로컬로 캐시되며 클라우드에 저장되므로 저장된 데이터의 상태에서는 충돌이 발생할 수 있습니다. 기기가 상태를 클라우드에 저장하려고 시도하지만 현재 클라우드에 있는 데이터를 다른 기기에서 작성한 경우 충돌이 발생합니다. 이러한 충돌은 저장된 게임 데이터를 열 때 해결해야 합니다.

충돌 해결을 처리하는 두 가지 개방형 메서드가 있습니다. 첫 번째 메서드 OpenWithAutomaticConflictResolution은 표준 해결 전략 유형을 허용하고 충돌을 자동으로 해결합니다. 다른 메서드 OpenWithManualConflictResolution은 콜백 메서드를 허용하여 충돌의 수동 해결을 허용합니다.

이러한 메서드에 관한 자세한 내용은 GooglePlayGames/BasicApi/SavedGame/ISavedGameClient.cs를 참고하세요.

    void OpenSavedGame(string filename) {
        ISavedGameClient savedGameClient = PlayGamesPlatform.Instance.SavedGame;
        savedGameClient.OpenWithAutomaticConflictResolution(filename, DataSource.ReadCacheOrNetwork,
            ConflictResolutionStrategy.UseLongestPlaytime, OnSavedGameOpened);
    }

    public void OnSavedGameOpened(SavedGameRequestStatus status, ISavedGameMetadata game) {
        if (status == SavedGameRequestStatus.Success) {
            // handle reading or writing of saved game.
        } else {
            // handle error
        }
    }

저장된 게임 작성

저장된 게임 파일이 열리면 파일을 작성하여 게임 상태를 저장할 수 있습니다. 이를 위해 CommitUpdate를 호출하면 됩니다. CommitUpdate에 다음과 같은 네 가지 매개변수가 있습니다.

  1. 콜백(공개 호출 중 하나에 전달된 콜백)에 전달된, 저장된 게임 메타데이터
  2. 메타데이터에 적용할 업데이트
  3. 데이터의 실제 바이트 배열
  4. 커밋이 완료될 때 호출할 콜백
    void SaveGame (ISavedGameMetadata game, byte[] savedData, TimeSpan totalPlaytime) {
        ISavedGameClient savedGameClient = PlayGamesPlatform.Instance.SavedGame;

        SavedGameMetadataUpdate.Builder builder = new SavedGameMetadataUpdate.Builder();
        builder = builder
            .WithUpdatedPlayedTime(totalPlaytime)
            .WithUpdatedDescription("Saved game at " + DateTime.Now());
        if (savedImage != null) {
            // This assumes that savedImage is an instance of Texture2D
            // and that you have already called a function equivalent to
            // getScreenshot() to set savedImage
            // NOTE: see sample definition of getScreenshot() method below
            byte[] pngData = savedImage.EncodeToPNG();
            builder = builder.WithUpdatedPngCoverImage(pngData);
        }
        SavedGameMetadataUpdate updatedMetadata = builder.Build();
        savedGameClient.CommitUpdate(game, updatedMetadata, savedData, OnSavedGameWritten);
    }

    public void OnSavedGameWritten (SavedGameRequestStatus status, ISavedGameMetadata game) {
        if (status == SavedGameRequestStatus.Success) {
            // handle reading or writing of saved game.
        } else {
            // handle error
        }
    }

    public Texture2D getScreenshot() {
        // Create a 2D texture that is 1024x700 pixels from which the PNG will be
        // extracted
        Texture2D screenShot = new Texture2D(1024, 700);

        // Takes the screenshot from top left hand corner of screen and maps to top
        // left hand corner of screenShot texture
        screenShot.ReadPixels(
            new Rect(0, 0, Screen.width, (Screen.width/1024)*700), 0, 0);
        return screenShot;
    }

저장된 게임 읽기

저장된 게임 파일이 열리면 파일을 읽어 게임 상태를 로드할 수 있습니다. 이를 위해 ReadBinaryData를 호출하면 됩니다.

    void LoadGameData (ISavedGameMetadata game) {
        ISavedGameClient savedGameClient = PlayGamesPlatform.Instance.SavedGame;
        savedGameClient.ReadBinaryData(game, OnSavedGameDataRead);
    }

    public void OnSavedGameDataRead (SavedGameRequestStatus status, byte[] data) {
        if (status == SavedGameRequestStatus.Success) {
            // handle processing the byte array data
        } else {
            // handle error
        }
    }

저장된 게임 삭제

저장된 게임 파일이 열리면 파일을 삭제할 수 있습니다. 이를 위해 Delete를 호출하면 됩니다.

    void DeleteGameData (string filename) {
        // Open the file to get the metadata.
        ISavedGameClient savedGameClient = PlayGamesPlatform.Instance.SavedGame;
        savedGameClient.OpenWithAutomaticConflictResolution(filename, DataSource.ReadCacheOrNetwork,
            ConflictResolutionStrategy.UseLongestPlaytime, DeleteSavedGame);
    }

    public void DeleteSavedGame(SavedGameRequestStatus status, ISavedGameMetadata game) {
        if (status == SavedGameRequestStatus.Success) {
            ISavedGameClient savedGameClient = PlayGamesPlatform.Instance.SavedGame;
            savedGameClient.Delete(game);
        } else {
            // handle error
        }
    }