משחקים שמורים במשחקי Unity

בנושא הזה מוסבר איך להשתמש במשחקים שמורים ל-Play Games Services ב-Unity משחקים.

לפני שמתחילים

הצגת ממשק המשתמש של המשחקים השמורים

ממשק המשתמש הרגיל לבחירה או ליצירה של פריט שמור של משחק מוצג על ידי התקשרות:

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

פתיחת משחק שמור

כדי לקרוא או לכתוב נתונים במשחק שמור, המשחק השמור צריך נפתח. מכיוון שמצב המשחק השמור נשמר במטמון באופן מקומי במכשיר ונשמר בענן, יכול להיות שתיתקלו בהתנגשויות במצב של הנתונים השמורים. התנגשות מתרחשת כאשר מכשיר מנסה לשמור את המצב בענן, הנתונים שנמצאים כרגע בענן נכתבו על ידי מכשיר אחר. ההתנגשויות האלה צריך לפתור את הבעיה כשפותחים את נתוני המשחק השמורים.

יש 2 שיטות פתוחות המטפלות ביישוב סכסוכים, הראשונה 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. יש 4 פרמטרים CommitUpdate:

  1. המטא-נתונים של המשחק השמורים שמועברים לקריאה החוזרת שמועברת לאחת מהקריאות הפתוחות.
  2. את העדכונים לבצע במטא-נתונים.
  3. מערך הנתונים בבייטים בפועל
  4. קריאה חוזרת (callback) לקריאה כשההתחייבות תסתיים.
    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
        }
    }

מחיקת משחק שמור

אפשר למחוק את הקובץ של המשחק השמור אחרי שפותחים אותו. כדי לעשות את זה צריך להתקשר מחיקה.

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