Que recherchez-vous ?
Games

Données persistantes : Comment sauvegarder les états et les paramètres de votre jeu

BRONSON ZGEB / UNITY TECHNOLOGIESSenior Content Developer
Feb 23, 2021|10 Min
Données persistantes : Comment sauvegarder les états et les paramètres de votre jeu
Cette page a été traduite automatiquement pour faciliter votre expérience. Nous ne pouvons pas garantir l'exactitude ou la fiabilité du contenu traduit. Si vous avez des doutes quant à la qualité de cette traduction, reportez-vous à la version anglaise de la page web.

La sauvegarde des données est essentielle pour tout jeu. Que vous ayez besoin de sauvegarder des scores élevés, des préférences ou l'état d'un jeu, Unity offre une variété de méthodes - de PlayerPrefs à la sérialisation des données, au cryptage et à l'écriture dans un fichier.

Mise à jour le 23 juin 2021 : Dans le cadre de Unite Now 2020, j'ai créé une session avec des conseils sur la persistance des données dans Unity. Il couvre certaines des méthodes courantes d'enregistrement et de chargement de données dans votre projet Unity, mais il ne s'agit en aucun cas d'une liste exhaustive. En d'autres termes, il existe plus de façons de sérialiser les données que vous n'en aurez jamais besoin, et chaque approche résout un problème particulier et s'accompagne de son propre ensemble de forces et de faiblesses. Ce billet de blog couvrira les mêmes méthodes communes que celles dont j'ai parlé lors de la session Unite Now.

PlayerPrefs

Les PlayerPrefs ne sont pas conçus pour sauvegarder les états du jeu. Cependant, elles sont utiles et nous allons donc en parler. Vous pouvez utiliser PlayerPrefs pour stocker les préférences d'un lecteur entre les sessions, telles que les paramètres de qualité, le volume audio ou d'autres données non essentielles. Les PlayerPrefs sont stockés quelque part sur votre appareil, séparément de votre projet. L'emplacement exact varie en fonction de votre système d'exploitation, mais il s'agit généralement d'un endroit globalement accessible et géré par votre système d'exploitation. Les données stockées sont de simples paires clé-valeur. En raison de leur facilité d'accès, ils ne sont pas à l'abri des utilisateurs qui souhaitent les ouvrir et les modifier, et ils peuvent être supprimés par accident puisqu'ils sont sauvegardés en dehors du projet et gérés par votre système d'exploitation.

Les PlayerPrefs sont relativement faciles à mettre en œuvre et ne nécessitent que quelques lignes de code, mais ils ne prennent en charge que les valeurs de type Float, Int et String, ce qui rend difficile la sérialisation d'objets complexes et de grande taille. Un utilisateur déterminé peut surmonter cette limitation en convertissant ses données sauvegardées dans un format représenté par l'un de ces types de base, mais je ne le recommande pas car il existe de meilleurs outils pour stocker vos données.

public void SavePrefs()
{
    PlayerPrefs.SetInt("Volume", 50);
    PlayerPrefs.Save();
}
 
public void LoadPrefs()
{
    int volume = PlayerPrefs.GetInt("Volume", 0); 
}

Enfin, étant donné que chaque application Unity stocke tous ses PlayerPrefs dans un seul fichier, elle n'est pas bien adaptée à la gestion de plusieurs fichiers d'enregistrement ou d'enregistrements dans le cloud, qui nécessitent tous deux que vous stockiez et receviez des données d'enregistrement à partir d'un emplacement différent.

JSON

JSON est un format de données lisible par l'homme. En d'autres termes, il est facilement compréhensible par les hommes et les machines, ce qui présente à la fois des avantages et des inconvénients. Il est beaucoup plus facile de déboguer vos données sauvegardées ou d'en créer de nouvelles à des fins de test lorsque vous pouvez les lire et les comprendre, mais, d'un autre côté, il est également facile pour les joueurs de lire et de modifier les données. La possibilité de lire et de modifier les données est utile si vous soutenez le modding, mais préjudiciable si vous voulez empêcher la tricherie. En outre, le format JSON étant basé sur du texte, il est plus coûteux à analyser pour les machines. En d'autres termes, il est plus lent à lire et utilise plus de mémoire que les alternatives binaires. Par conséquent, si vous avez beaucoup de données, vous pouvez envisager des options qui ne sont pas basées sur le texte. Chaque cas d'utilisation est différent, et c'est ce type de compromis qui conduit les développeurs à créer de nombreux autres formats de données.

JSON est normalisé et largement utilisé dans de nombreuses applications. Par conséquent, toutes les plateformes le supportent fortement, ce qui est utile lors de la création de jeux multiplateformes. JSON a été développé en tant que protocole de communication pour les navigateurs web, ce qui le rend intrinsèquement adapté à l'envoi de données sur un réseau. C'est pourquoi JSON est excellent pour l'envoi et la réception de données à partir d'un serveur.

JsonUtility

JsonUtility est l'API intégrée à Unity pour la sérialisation et la désérialisation des données JSON. Comme PlayerPrefs, il est relativement facile à mettre en œuvre. Cependant, contrairement à PlayerPrefs, vous devez enregistrer vous-même les données JSON, soit dans un fichier, soit sur un réseau. Le fait de gérer vous-même le stockage des données facilite la gestion de plusieurs fichiers d'enregistrement, car vous pouvez stocker chaque fichier à un endroit différent. Pour faciliter cette tâche, j'ai écrit un gestionnaire de fichiers de base, qui est disponible dans ce dépôt d'exemples.

Il est important de mentionner que JsonUtility n'est pas une implémentation JSON complète. Si vous avez l'habitude de travailler avec des données JSON, vous remarquerez peut-être l'absence de prise en charge de certaines fonctionnalités. Si vous souhaitez comparer les performances de différentes solutions JSON, essayez ce projet d'analyse comparative. Gardez à l'esprit qu'il est préférable de tester sur votre appareil cible si possible.

JsonUtility est soumis aux mêmes limitations que le sérialiseur interne d'Unity, c'est-à-dire que si vous ne pouvez pas sérialiser un champ dans l'inspecteur, vous ne pourrez pas le sérialiser en JSON. Pour contourner ces limitations, vous pouvez créer des types de données anciennes (Plain Old Data types ou PODS) pour contenir toutes vos données d'enregistrement. Lorsque le moment est venu de sauvegarder, transférez vos données de leurs types d'exécution dans un POD et sauvegardez-les sur un disque. Si nécessaire, vous pouvez également créer des rappels de sérialisation personnalisés pour prendre en charge des types que le sérialiseur d'Unity ne prend pas en charge par défaut.

En ce qui concerne JsonUtility, EditorJsonUtility est un autre outil utile. Alors que JsonUtility fonctionne pour tout objet basé sur MonoBehaviour ou ScriptableObject, EditorJsonUtility fonctionnera pour tout type de moteur Unity. Vous pouvez donc créer une représentation JSON de n'importe quel objet dans l'éditeur Unity - ou aller dans l'autre sens et créer un actif à partir d'un fichier JSON.

Autres bibliothèques

Outre les options de sérialisation intégrées, il existe d'autres bibliothèques externes que vous pouvez également utiliser. À moins que vous n'ayez spécifiquement besoin d'utiliser un format texte pour des raisons de lisibilité, il est préférable d'opter pour un sérialiseur binaire :

Outils binaires

  • MessagePack est un sérialiseur binaire efficace. Il est performant et relativement facile à utiliser. Comme JSON, il est disponible sur presque toutes les plateformes. Vous pouvez donc l'utiliser pour envoyer des données sur les réseaux et communiquer avec des serveurs dorsaux. Pour en savoir plus , cliquez ici.
  • ProtoBuf et Protobuf-net sont d'autres sérialiseurs binaires similaires. Il est également rapide et efficace. Google l'a développé comme une alternative performante aux formats existants tels que XML. Comme JSON et MessagePack, il est également bien adapté à la communication sur les réseaux.
  • BinaryFormatter est une bibliothèque DotNet qui permet de stocker directement vos objets dans un format binaire. Cependant, BinaryFormatter présente de dangereuses failles de sécurité et doit être évité. Je le répète, n'utilisez pas BinaryFormatter. Pour en savoir plus sur les risques de sécurité , cliquez ici.

Outils de texte

  • EasySave est un plug-in populaire et bien supporté, disponible sur l'Unity Asset Store. Il vous permet de sauvegarder toutes vos données sans écrire de code, ce qui est excellent pour les débutants. Il dispose également d'une API puissante et flexible qui le rend idéal pour les utilisateurs avancés. Il n'est pas gratuit, mais il vaut le prix si vous recherchez une solution prête à l'emploi avec des fonctionnalités complètes.
  • JSON.Net est une implémentation JSON libre et gratuite pour toutes les plateformes DotNet. Contrairement à l'utilitaire JsonUtility intégré, il est très complet. Cependant, cela a un coût, car il est nettement moins performant que l'utilitaire JsonUtility intégré. La version standard ne prend pas en charge toutes les plateformes d'Unity, mais il existe une version modifiée disponible dans le Unity Asset Store qui ajoute cette prise en charge.
  • XML est un format de données alternatif. Comme JSON, il est relativement lisible par l'homme et possède certaines caractéristiques qui peuvent être utiles pour votre application spécifique, comme les espaces de noms. DotNet dispose d'un support intégré pour XML.
Sécurité des données

Lorsqu'il est question de sécurité, la plupart des gens pensent d'abord au cryptage. Cependant, lorsqu'il s'agit de stocker des données localement sur l'appareil d'un joueur, le chiffrement est relativement facile à surmonter. Même sans casser le cryptage, les utilisateurs peuvent manipuler les données directement dans la mémoire à l'aide d'outils disponibles gratuitement. En d'autres termes, on peut supposer que tout ce qui est stocké localement n'est pas digne de confiance.

Si vous avez besoin d'une véritable sécurité, la meilleure solution consiste à conserver vos données sur un serveur où les utilisateurs ne peuvent pas les modifier. Pour que cela fonctionne, l'application ne doit pas envoyer de données directement au serveur, car les utilisateurs pourraient toujours les manipuler. Au lieu de cela, l'application ne peut qu'envoyer des commandes au serveur, laisser le serveur modifier les données, puis renvoyer les résultats à l'application. Si la sécurité des données est vitale pour vous, il est donc préférable de le savoir le plus tôt possible, car cela aura une incidence sur l'architecture de votre projet.

Pour plus d'informations sur la sérialisation, consultez la page du manuel. Si vous souhaitez voir cela en action, consultez la session d'accompagnement d'Unite Now.