Entitätsdateien
Mit Entitätsdateien können Sie Dateien lesen und schreiben, die an eine Entität angefügt sind, in jedem Format. Das folgende Beispiel zeigt eine vollständige Entitätsdateischleife, von der Anmeldung über das Laden einer Datei bis hin zum Hochladen einer neuen Datei.
#if !DISABLE_PLAYFABENTITY_API && !DISABLE_PLAYFABCLIENT_API
using PlayFab;
using PlayFab.Internal;
using System;
using System.Collections.Generic;
using System.Text;
using UnityEngine;
public class EntityFileExample : MonoBehaviour
{
public string entityId; // Id representing the logged in player
public string entityType; // entityType representing the logged in player
private readonly Dictionary<string, string> _entityFileJson = new Dictionary<string, string>();
private readonly Dictionary<string, string> _tempUpdates = new Dictionary<string, string>();
public string ActiveUploadFileName;
public string NewFileName;
public int GlobalFileLock = 0; // Kind of cheap and simple way to handle this kind of lock
void OnSharedFailure(PlayFabError error)
{
Debug.LogError(error.GenerateErrorReport());
GlobalFileLock -= 1;
}
void OnGUI()
{
if (!PlayFabClientAPI.IsClientLoggedIn() && GUI.Button(new Rect(0, 0, 100, 30), "Login"))
Login();
if (PlayFabClientAPI.IsClientLoggedIn() && GUI.Button(new Rect(0, 0, 100, 30), "LogOut"))
PlayFabClientAPI.ForgetAllCredentials();
if (PlayFabClientAPI.IsClientLoggedIn() && GUI.Button(new Rect(100, 0, 100, 30), "(re)Load Files"))
LoadAllFiles();
if (PlayFabClientAPI.IsClientLoggedIn())
{
// Display existing files
_tempUpdates.Clear();
var index = 0;
foreach (var each in _entityFileJson)
{
GUI.Label(new Rect(100 * index, 60, 100, 30), each.Key);
var tempInput = _entityFileJson[each.Key];
var tempOutput = GUI.TextField(new Rect(100 * index, 90, 100, 30), tempInput);
if (tempInput != tempOutput)
_tempUpdates[each.Key] = tempOutput;
if (GUI.Button(new Rect(100 * index, 120, 100, 30), "Save " + each.Key))
UploadFile(each.Key);
index++;
}
// Apply any changes
foreach (var each in _tempUpdates)
_entityFileJson[each.Key] = each.Value;
// Add a new file
NewFileName = GUI.TextField(new Rect(100 * index, 60, 100, 30), NewFileName);
if (GUI.Button(new Rect(100 * index, 90, 100, 60), "Create " + NewFileName))
UploadFile(NewFileName);
}
}
void Login()
{
var request = new PlayFab.ClientModels.LoginWithCustomIDRequest
{
CustomId = SystemInfo.deviceUniqueIdentifier,
CreateAccount = true,
LoginTitlePlayerAccountEntity = true
};
PlayFabClientAPI.LoginWithCustomID(request, OnLogin, OnSharedFailure);
}
void OnLogin(PlayFab.ClientModels.LoginResult result)
{
entityId = result.EntityToken.Entity.Id;
entityType = result.EntityToken.Entity.Type;
}
void LoadAllFiles()
{
if (GlobalFileLock != 0)
throw new Exception("This example overly restricts file operations for safety. Careful consideration must be made when doing multiple file operations in parallel to avoid conflict.");
GlobalFileLock += 1; // Start GetFiles
var request = new PlayFab.DataModels.GetFilesRequest { Entity = new PlayFab.DataModels.EntityKey { Id = entityId, Type = entityType } };
PlayFabDataAPI.GetFiles(request, OnGetFileMeta, OnSharedFailure);
}
void OnGetFileMeta(PlayFab.DataModels.GetFilesResponse result)
{
Debug.Log("Loading " + result.Metadata.Count + " files");
_entityFileJson.Clear();
foreach (var eachFilePair in result.Metadata)
{
_entityFileJson.Add(eachFilePair.Key, null);
GetActualFile(eachFilePair.Value);
}
GlobalFileLock -= 1; // Finish GetFiles
}
void GetActualFile(PlayFab.DataModels.GetFileMetadata fileData)
{
GlobalFileLock += 1; // Start Each SimpleGetCall
PlayFabHttp.SimpleGetCall(fileData.DownloadUrl,
result => { _entityFileJson[fileData.FileName] = Encoding.UTF8.GetString(result); GlobalFileLock -= 1; }, // Finish Each SimpleGetCall
error => { Debug.Log(error); }
);
}
void UploadFile(string fileName)
{
if (GlobalFileLock != 0)
throw new Exception("This example overly restricts file operations for safety. Careful consideration must be made when doing multiple file operations in parallel to avoid conflict.");
ActiveUploadFileName = fileName;
GlobalFileLock += 1; // Start InitiateFileUploads
var request = new PlayFab.DataModels.InitiateFileUploadsRequest
{
Entity = new PlayFab.DataModels.EntityKey { Id = entityId, Type = entityType },
FileNames = new List<string> { ActiveUploadFileName },
};
PlayFabDataAPI.InitiateFileUploads(request, OnInitFileUpload, OnInitFailed);
}
void OnInitFailed(PlayFabError error)
{
if (error.Error == PlayFabErrorCode.EntityFileOperationPending)
{
// This is an error you should handle when calling InitiateFileUploads, but your resolution path may vary
GlobalFileLock += 1; // Start AbortFileUploads
var request = new PlayFab.DataModels.AbortFileUploadsRequest
{
Entity = new PlayFab.DataModels.EntityKey { Id = entityId, Type = entityType },
FileNames = new List<string> { ActiveUploadFileName },
};
PlayFabDataAPI.AbortFileUploads(request, (result) => { GlobalFileLock -= 1; UploadFile(ActiveUploadFileName); }, OnSharedFailure); GlobalFileLock -= 1; // Finish AbortFileUploads
GlobalFileLock -= 1; // Failed InitiateFileUploads
}
else
OnSharedFailure(error);
}
void OnInitFileUpload(PlayFab.DataModels.InitiateFileUploadsResponse response)
{
string payloadStr;
if (!_entityFileJson.TryGetValue(ActiveUploadFileName, out payloadStr))
payloadStr = "{}";
var payload = Encoding.UTF8.GetBytes(payloadStr);
GlobalFileLock += 1; // Start SimplePutCall
PlayFabHttp.SimplePutCall(response.UploadDetails[0].UploadUrl,
payload,
FinalizeUpload,
error => { Debug.Log(error); }
);
GlobalFileLock -= 1; // Finish InitiateFileUploads
}
void FinalizeUpload()
{
GlobalFileLock += 1; // Start FinalizeFileUploads
var request = new PlayFab.DataModels.FinalizeFileUploadsRequest
{
Entity = new PlayFab.DataModels.EntityKey { Id = entityId, Type = entityType },
FileNames = new List<string> { ActiveUploadFileName },
};
PlayFabDataAPI.FinalizeFileUploads(request, OnUploadSuccess, OnSharedFailure);
GlobalFileLock -= 1; // Finish SimplePutCall
}
void OnUploadSuccess(PlayFab.DataModels.FinalizeFileUploadsResponse result)
{
Debug.Log("File upload success: " + ActiveUploadFileName);
GlobalFileLock -= 1; // Finish FinalizeFileUploads
}
}
#endif
Dekonstruieren dieses Beispiels
-
GlobalFileLock
ist eine einfache Methode zur Vermeidung von Dateikonflikten, die speziell für dieses Beispiel entwickelt wurde.- Unabhängige Dateiaktionen verursachen keine Probleme.
- Jede Dateiaktion erfordert viele Schritte und mehrere API-Aufrufe. Versuchen Sie daher nicht, gleichzeitig auf dieselbe Datei zuzugreifen.
- Wenn Sie sehr vorsichtig sind, benötigen Sie keinen Sperrmechanismus.
- Wenn Sie etwas Kompliziertes ausführen möchten, ist Ihr Sperrmechanismus möglicherweise viel komplexer.
-
OnGUI
ist eine sehr alte (aber sehr dichte) Möglichkeit, eine Unity-GUI vollständig innerhalb eines Skripts zu erstellen.- Ihre GRAFISCHE Benutzeroberfläche ist viel besser und spielspezifisch.
- Alle PlayFab-Features erfordern zunächst eine Anmeldung oder Authentifizierung.
-
LoadAllFiles()
wird genau so tun, wie es sagt. Laden Sie für die aktuell angemeldete Entität alle in PlayFab gespeicherten Dateien.- Dies erfordert mehrere Schritte:
- PlayFab fragen, wo sich die Dateien befinden,
- Und laden Sie sie dann separat herunter.
- Dies erfordert mehrere Schritte:
-
UploadFile(string fileName)
speichert die Datei im Dienst für die Entität.- Der Einfachheit halber wird in diesem Beispiel jeweils eine Datei gespeichert, aber Dateien können auch atomar in Sätzen hochgeladen werden.
- Hierfür sind die folgenden Schritte erforderlich:
- Initialisieren eines atomischen Uploadvorgangs,
- Alle Dateien hochladen,
- Schließen Sie einen atomischen Uploadvorgang ab.
- Die Entität betrachtet den Dateiupload nicht als abgeschlossen und spiegelt auch keine Änderungen an anderen Aufrufern wider, bis der atomische Uploadvorgang erfolgreich abgeschlossen wurde.
Game Manager und Entitäten
Mit dem Game Manager können Sie Objekte und Dateien für Spieler bearbeiten. Die Spielerübersicht wurde aktualisiert, um sowohl die Informationen zum Titelspieler als auch master Spielerkonto anzuzeigen.
Darüber hinaus verfügen Dateien und Objekte jetzt über eigene Abschnitte auf der Registerkarte Spieler .