Unity 3D et Steam : synchronisation des sauvegardes dans le Cloud

Lors de la publication d’un jeu sur Steam, la synchronisation avec le cloud fait partie des fonctions hautement recommandées par la plate-forme.

En tant que développeur de jeu, on aurait tort de s’en passer : non seulement ça apporte une expérience utilisateur agréable, mais en plus l’intégration est plutôt simple à mettre en place, notamment en utilisant la fonction Auto-Cloud proposée par Steamworks.

Pour faire cette intégration, il y a les pré-requis suivants :

Comme les sujets ont déjà été couverts, nous allons nous concentrer dans cet article sur la fonctionnalité Cloud uniquement.

Ici, nous allons utiliser la fonctionnalité Auto-Cloud. Il est également possible de gérer « manuellement » les sauvegardes, au choix, en utilisant l’interface ISteamRemoteStorage, dont l’API est détaillée dans la documentation Steam :

Le fonctionnement du Cloud, que stocker en ligne ?

Avant et après chaque session de jeu, Steam synchronise les fichiers entre la version locale et la version distante, et garde le plus récent.

Comme c’est une opération systématique, il faut s’assurer de limiter ce qu’on place sur le cloud, afin d’éviter que les échanges de données soient trop gros avant et après. Donc c’est un argument de plus pour la bonne pratique de faire des fichiers de sauvegarde légères et contenant le strict nécessaire.

Vous pouvez aussi partir de la philosophie que certains éléments de configuration n’ont pas besoin d’être synchronisés (comme le paramétrage matériel, qui sera lié à la machine et qui est facile à recréer par l’utilisateur), et d’autres peuvent l’être (un profil utilisateur).

Placer les sauvegardes dans un répertoire spécifique

Du côté de la configuration du Steam Cloud, nous allons pouvoir sélectionner un répertoire pour les sauvegardes qui dépend de l’utilisateur connecté à Steam.

Ça se traduit d’abord par la création d’une méthode, intégrée à notre système de sauvegarde, qui va permet d’obtenir le chemin en question.

La méthode suivante prend un nom de sauvegarde en entrée, et dans le cas où Steamworks est actif, nous utilisons cette méthode, qui nous permet d’avoir l’ID de compte utilisateur Steam : SteamUser.GetSteamID().GetAccountID().

Nous utilisons la classe Directory pour vérifier si le répertoire existe, et le cas échéant, créer ce répertoire (cette classe a besoin du namespace IO, appelé avec using System.IO;).

public static string GetSaveFilePath(string saveFileName)
{
	string directory = string.Empty;
#if !DISABLESTEAMWORKS
	if (SteamManager.Initialized)
	{
		string steamId = SteamUser.GetSteamID().GetAccountID().ToString();
		directory = "/" + steamId;
	}
#endif
	if (!Directory.Exists(Application.persistentDataPath + directory))
	{
		Directory.CreateDirectory(Application.persistentDataPath + directory);
	}
	return Application.persistentDataPath + directory + "/" + saveFileName +".sav";
}

Avec cette méthode, les sauvegardes seront stockées sous le chemin suivant, où 000000 est l’ID Steam de l’utilisateur :

C:\Users[nom d'utilisateur]\AppData\LocalLow[nom de compagnie]\[nom de l'application\000000\saveFile.sav

Notez que la méthode peut être complétée en spécifiant un ou plusieurs comportements hors Steamworks. Par exemple, en remplaçant le dernier endif par les 3 lignes suivantes, les sauvegardes seront dans un répertoire /beta.

#else
    directory = "/beta";
#endif

Maintenant, les sauvegardes sont au bon endroit, nous n’avons plus qu’à configurer l’appli dans les écrans d’admin Steamworks.

Configurer l’Auto-Cloud côté Steamworks

Rendez-vous sur la page Steamworks votre application, dans la section « Présence sur la communauté » cliquez sur « Configurer les sauvegardes sur le Cloud ».

Si vous êtes déjà dans la section Steamworks de votre application, cette même section est accessible dans le menu « Application > Steam Cloud ».

  1. Dans la première section, vous allez pouvoir définir le nombre d’octets nécessaire et le nombre de sauve
  2. La section Bêta-test vous permet d’activer la fonction pour les équipes de développement uniquement, si vous voulez la tester avant la mise en production.
  3. L’Espace Cloud partagé permet le partage entre plusieurs applications, c’est typiquement pour synchroniser la sauvegarde de la démo avec l’application finale.

Ce qui est important à configurer par rapport à notre mise en place de l’Auto-Cloud, ce sont les « Chemin racine ». C’est là que Steam va chercher les fichiers à synchroniser.

Nous pouvons configurer plusieurs chemin racine, avec une Racine qui contient un chemin que Steam déterminera automatiquement, et une arborescence de sous-répertoire et un motif de fichiers, qui peuvent utiliser différentes variables entre crochets.

Par exemple, pour configurer une application sous Windows, nous allons sélectionner « WinAppDataLocalLow« , ce qui va automatiquement ajouter la partie « %USERPROFILE%/AppData » au chemin pour la synchronisation.

En terme de sous-répertoire, nous allons saisir le chemin suivant, en indiquant les noms idoines pour « Ma Compagnie » et « Mon Application » (ceux configurés dans Unity, dans Project Settings > Player). Puis nous rajoutons {Steam3AccountID} qui correspond au numéro obtenu avec GetAccountID() dans notre système de sauvegarde.

Ma Compagnie/Mon Application/{Steam3AccountID}/

Comme schéma de fichiers, nous spécifions le motif *.sav pour que tous les fichiers de type *.sav soient synchronisés. À adapter selon les schémas de nos fichiers de sauvegarde (par exemple, si les fichiers sont au format savefile*.sav, on peut spécifier ce format pour ne pas synchroniser config.sav).

Modifier un chemin racine de l’Auto-Cloud

Nous pouvons spécifier dans la dernière colonne sur quel système d’exploitation ce chemin est utilisé, en l’occurrence, Windows.

Voici les identifiants à utiliser pour chacune des plate-formes :

Système d’exploitationChemin de Application.persistentDataPath dans Unity 3DRacine à utiliser pour l’Auto-cloudSous-répertoire pour l’Auto-Cloud
Windows%userprofile%\AppData\LocalLow\[company name]\[product name]WinAppDataLocalLow[company name]/[product name]/{Steam3AccountID}/
Mac~/Library/Application Support/company name/product nameMacAppSupport [company name]/[product name]/{Steam3AccountID}/
Linux et SteamOS$XDG_CONFIG_HOME/unity3dLinuxXdgConfigHomeunity3d/{Steam3AccountID}/

Typiquement, une configuration finale qui prend en compte tous les systèmes d’exploitation devrait ressembler à cela :

Attention : pour Linux, le répertoire par défaut est /unity3D/, sans le nom du produit ni de la compagnie : donc la meilleure pratique est de modifier votre système de sauvegarde d’ajouter un répertoire propre à votre jeu afin d’éviter que tous les fichiers des apps Unity3D situées dans le répertoire soient synchronisés ! Pensez à l’ajouter ensuite au chemin dans l’Auto-Cloud.

Une dernière chose à faire, pour que la fonction soit bien présentée sur la page de l’appli : sur sa page d’administration du magasin, il faut cocher « Steam Cloud » dans les fonctionnalités prises en charge.

Activer Steam Cloud sur la page du magasin

Tester la fonction Auto-Cloud dans votre application

Une fois la fonction ajoutée dans l’application et les modifications sauvegardées, vous pouvez aller dans les propriétés de votre application et vous assurer que cette fonction est bien cochée.

Pour vous assurer qu’elle fonctionne à 100%, le mieux est de tester le jeux sur deux machines différentes avec le même compte Steam. Sur la première machine, vous faites une sauvegarde, puis sur le second, vous synchronisez le cloud, le fichier de sauvegarde devrait alors être identique que sur la première machine.