Trò chơi đã lưu trong trò chơi Unity

Stay organized with collections Save and categorize content based on your preferences.

Chủ đề này mô tả cách sử dụng trò chơi đã lưu trong Dịch vụ trò chơi của Play thuộc trò chơi Unity.

Trước khi bắt đầu

Hiển thị giao diện người dùng cho trò chơi đã lưu

Giao diện người dùng chuẩn để chọn hoặc tạo một mục trò chơi đã lưu sẽ hiển thị bằng cách gọi:

    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
        }
    }

Mở mục trò chơi đã lưu

Để đọc hoặc ghi dữ liệu vào một trò chơi đã lưu, bạn cần mở trò chơi đã lưu đó. Vì trạng thái trò chơi đã lưu được ghi vào bộ nhớ đệm trên thiết bị và lưu vào đám mây, nên bạn có thể gặp phải xung đột về trạng thái dữ liệu đã lưu. Xung đột xảy ra khi một thiết bị cố gắng lưu trạng thái vào đám mây nhưng dữ liệu hiện có trên đó lại do một thiết bị khác ghi lại. Những xung đột này cần được giải quyết khi mở dữ liệu trò chơi đã lưu.

Có 2 phương thức mở để giải quyết các xung đột, đầu tiên là OpenWithAutomaticConflictResolution, phương thức này chấp nhận loại chiến lược giải quyết tiêu chuẩn và tự động giải quyết các xung đột. Phương thức thứ hai là OpenWithManualConflictResolution, chấp nhận phương thức gọi lại để cho phép giải quyết xung đột theo cách thủ công.

Vui lòng xem GooglePlayGames/BasicApi/SavedGame/ISavedGameClient.cs để biết thêm thông tin chi tiết về các phương thức này.

    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
        }
    }

Viết một trò chơi đã lưu

Sau khi mở tệp trò chơi đã lưu, bạn có thể ghi tệp đó để lưu trạng thái trò chơi. Việc này được thực hiện bằng cách gọi phương thức CommitUpdate. Có bốn tham số cho phương thức CommitUpdate:

  1. siêu dữ liệu trò chơi đã lưu đã truyền đến lệnh gọi lại được chuyển đến một trong các lệnh gọi Mở.
  2. các cập nhật cần thực hiện đối với siêu dữ liệu.
  3. mảng dữ liệu số byte thực tế
  4. một lệnh gọi lại khi cam kết hoàn tất.
    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;
    }

Đọc một trò chơi đã lưu

Sau khi mở tệp trò chơi đã lưu, bạn có thể đọc tệp để tải trạng thái cho trò chơi. Bạn có thể thực hiện việc này bằng cách gọi 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
        }
    }

Xóa trò chơi đã lưu

Sau khi mở tệp trò chơi đã lưu, bạn có thể xóa tệp. Bạn có thể thực hiện việc này bằng cách gọi 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
        }
    }