כאן נסביר איך להשתמש במשחקים שמורים ל-Play Games Services במשחקים של Unity.
לפני שמתחילים
מגדירים את הפרויקט ואת הפלאגין של Google Play Games ל-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. יש ארבעה פרמטרים ל-CommitUpdate:
- המטא-נתונים של המשחק השמור מועברים ל-callback שמועברים לאחת מהקריאות ל-Open.
- העדכונים שרוצים לבצע במטא-נתונים.
- מערך הבייטים בפועל של הנתונים
- פונקציית קריאה חוזרת (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
}
}
מחיקת משחק ששמור
אחרי שפותחים את קובץ המשחק השמור, אפשר למחוק אותו. כדי לעשות זאת, קוראים ל-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
}
}