La méthode simple pour enregistrer des données avec les PlayerPrefs

  •  
  • 2
  •  
  •  
  •  
  •  
  •  
  •  
    2
    Partages

Prenons le cas de a sauvegarde : c’est quelque chose de tellement commun que l’on n’y pense même plus. Et pourtant c’est une action au coeur de pratiquement toutes les activités numériques, y compris les jeux vidéo. Si on ne sauvegarde pas sa partie, toute la progression sera perdue. A moins de vouloir créer un jeu « hardcore » (il fut un temps où tous les jeux étaient tous comme ça…), la gestion d’une sauvegarde est indispensable à votre projet ! Heureusement, nous avons PlayerPrefs sous la main.

Utilisation des PlayerPrefs

Comme son nom l’indique, cette classe a pour but de vous permettre de stocker les « préférences » ou plutôt le « paramétrage » qu’a fait le joueur dans votre jeu. C’est en tout cas comme ça qu’il est présenté sur la documentation officielle.

Si on fait abstraction de cette description, c’est un outil permettant d’enregistrer des données. Techniquement, vous pouvez y mettre tout ce que vous voulez. Un peu comme un coffre fort : on ouvre le bon tiroir, on y met ce qu’on veut dedans, et c’est stocké pour plus tard !

Il est intéressant de noter que les données stockées de cette façon sont cloisonnées entre les potentiels autres jeux Unity3D installés sur la machine : il n’y a aucun risque de conflit.

Trêve de théorie, passons à la pratique. Comment qu’on fait hein ?  Cette classe mets à disposition des méthodes d’enregistrement et de chargement sur le principe du clé => valeur . Vous pouvez stocker une valeur à un endroit défini par sa clé, et en récupérer la valeur via la même clé. Trois types de données sont supportées :

  • Entier (int)
  • Nombre à virgule (float)
  • Chaine de caractères (string)

Voilà son utilisation :

PlayerPrefs.SetInt("maCleInt", 15);
PlayerPrefs.SetFloat("maCleFloat", 75.12f);
PlayerPrefs.SetString("maCleString", "mon joueur s'appelle John");

Pour les récupérer, au lieu d’utiliser Setxxxx, on utilise Getxxxx :

int monEntier = PlayerPrefs.GetInt("maCleInt");
float monFlottant = PlayerPrefs.GetFloat("maCleFloat");
string maChaine = PlayerPrefs.GetString("maCleString");

Simple, rapide, clair. Mais si on pousse un peu plus loin dans la quantité de données à enregistrer, ces trois méthodes vont vous sembler bien insuffisantes. Vous allez devoir vous créer des mécaniques diverses et variées pour arriver à vos fins. J’ai essayé, je ne vous le conseille pas…

Sérialisation + PlayerPrefs = <3

Mais alors comment faire pour stocker des données plus complexes ? La sérialisation vient alors à la rescousse. La sérialisation, c’est le fait de transformer un objet et de le représenter par une chaîne de caractères (ou de bits) qui pourra être réinterprétée plus tard pour récupérer le même état de l’objet sérialisé :

Schéma de sérialisation d'un objet

Ici, « Mon objet désérialisé » aura les mêmes propriété que « Mon objet source ». C’est intéressant parce qu’avec ce principe, il est possible de transformer n’importe quel objet complexe… en une chaîne. Vous voyez où je veux en venir ?

Schéma de sérialisation couplé au PlayerPrefs

Voyons maintenant comment sérialiser des objets. Tout d’abord, il vous faut un conteneur global dans lequel vous allez stocker vos données :

public class MyData
{
    public Vector3 playerPosition;
    public int playerLevel;
    public int playerHealth;
}

Via un script, vous allez renseigner les valeurs d’une instance de MyData puis la sérialiser de cette manière :

public void SaveGame()
{
    MyData data = new MyData();
    data.playerHealth = 100;
    data.playerLevel = 15;
    data.playerPosition = Vector3.zero;

    string serializedObject = JsonUtility.ToJson(data);

    PlayerPrefs.SetString("playerProgress", serializedObject);
}

public MyData LoadGame()
{
    string serializedObject = PlayerPrefs.GetString("playerProgress");
    MyData data = JsonUtility.FromJson<MyData>(serializedObject);
    return data;
}

JSonUtility permet de convertir un objet en JSON et de reconvertir une chaine JSON en un objet. C’est simple, pratique, et dans 95% des cas, vous n’aurez pas besoin de plus.

Avec cette simple méthode, vous pouvez sérialiser toutes les données que vous voulez et les stocker dans les PlayerPrefs en un clin d’œil.

Liens vers la documentation officielle :

Prenez garde cependant avec les PlayerPrefs : sur Windows, les informations sont enregistrés dans la base de registre, ce qui n’est pas l’endroit le plus approprié pour stocker de grandes quantités de données. Dans ce cas, vous pouvez enregistrer vos données dans un fichier sur le disque plutôt que via les PlayerPrefs.

Si cet article vous a appris quelque chose, partagez-le à vos amis !


  •  
  • 2
  •  
  •  
  •  
  •  
  •  
  •  
    2
    Partages

2 commentaires

  1. Il y a aussi la limitation du poids des données sur WebPlayer (bien que WebGL je ne sache pas si cela est équivalent, mais je suppose que oui).

    Par contre, le coup de la sérialisation au sein de PlayerPrefs je trouve cela un peu lourd. Pour moi PlayerPrefs est juste parfait pour enregistrer de simples valeurs comme par exemple les options d’un jeu (langage et les volumes pour rester simple). Ou à la limite si tu n’as que deux ou trois valeurs à enregistrer pour les données du joueur/niveau. Après, autant passer par des fichiers externes.

    Tiens quelques liens en plus si par hasard, tu ne les avais pas vus.

    PlayerPrefsX : http://wiki.unity3d.com/index.php/ArrayPrefs2#C.23_-_PlayerPrefsX.cs

    Persistence Data : https://unity3d.com/fr/learn/tutorials/topics/scripting/persistence-saving-and-loading-data

    1. Oui, il y a des limitations au niveau de la taille de données des PlayerPrefs. Dans l’absolu, il est effectivement mieux de gérer son propre système de sauvegarde. Mais souvent, pour simplifier les choses, c’est plus pratique de faire comme ça. Tout particulièrement sur des petits projets cross-platform dont la gestion du système de fichiers peut grandement varier.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *