Leaderboard et la sauvegarde des données - UnityGems
Certaines des informations sur cet article sont également expliqué dans le tutoriel sur la façon dont l'unité la persistance des données.
Ceci est la première partie d'une série. Afin de démontrer plus loin, nous développerons d'un simple leaderboard local.
L'utilisation statique ...
Je vais commencer par une manière que je considère être mal, mais juste pour le plaisir d'apprendre et d'en finir avec, je vais le démontrer.
Vous devez savoir que la définition d'une classe statique signifie que vous n'avez pas besoin instance de cette classe pour pouvoir l'utiliser. En fait, vous ne pouvez pas instancier une classe statique. Il est stocké dans une autre partie de la mémoire de l'application et est jamais propre par le garbage collector.
Donc, si elle ne se nettoie, cela signifie qu'il est toujours là. Oui, à partir du moment où vous faites le premier appel, jusqu'à la fermeture de l'application. Si nous avons besoin de stocker des informations, qui pourrait être un bon endroit. Cela nous permet de garder nos données au fil du temps et sur scène. Mais attention, comme je l'ai dit, il est conservé en mémoire jusqu'à ce que l'application est fermée, donc il ne sera pas là la prochaine fois que vous lancez l'application.
Juste quelques données pour le moment, rien d'extraordinaire, nous voulons juste voir comment cela fonctionne.
Étant donné que la classe est définie comme statique, aucun cas nécessaire, mais aussi, tous les membres doivent être statiques. Il est tout simplement logique puisque le compilateur ne serait pas en mesure de savoir ce que par exemple vous faites affaire avec, puisque vous ne pouvez pas créer. Notez que le score est privé et ne peut être définie à partir de la classe. Réglage de la valeur du lecteur définira automatiquement le score élevé si nécessaire.
Dans notre GameManager, nous voulons mettre quelques informations:
Donc, c'est un moyen facile de garder notre valeur sur la durée de vie du jeu.
Le stockage sur un objet vivant
L'autre moyen rapide est d'utiliser un gameobject que nous fixons comme DontDestroyOnLoad. Ceci est une étape supplémentaire puisque nous sommes en mesure de contrôler la durée de vie de l'objet. Si nous ne avons pas besoin, nous le détruisons. Cela n'a pas été possible avec classe statique.
Ces méthodes sont tout simplement démonstratif du fait que vous pouvez contrôler l'objet. Encore une fois, cela ne stocke les données aussi longtemps que l'application est en cours d'exécution, tuez-le et vous perdez tout.
L'utilisation PlayerPrefs
Nous pouvons garder nos données, mais nous voulons maintenant le sauver. PlayerPrefs est décrit sur la documentation et peut-être la meilleure façon de sauvegarder vos réalisations. Considérons un système point de contrôle qui permet d'économiser vos progrès:
Les PlayerPrefs stocke les données en tant que système de paires clé-valeur (kvp). Pour une clé donnée, vous obtenez une valeur si elle a déjà été enregistrée. Pour cette raison, il est nécessaire de faire en sorte que le kvp existe.
Nous allons vous envisager de commencer le jeu et que vous voulez récupérer quelques informations:
L'exemple peut sembler bizarre, mais le membre score élevé a un setter privé. Nous avons donc le score de joueur pour régler le score élevé et réinitialiser le lecteur. Je comprends que le score du joueur et score élevé sont susceptibles d'être les mêmes, nous sommes juste ici pour voir et apprendre.
Avec ce code, vous pouvez désactiver l'application, je veux dire tuer totalement et remettiez vos données sont enregistrées.
Donc, nous allons essayer notre leaderboard, nous devons d'abord définir ce qu'il doit faire. Nous considérons une course et à la fin, chaque coureur reçoit des points. Celles-ci devraient mettre à jour le classement actuel, puis enregistrez-le à nouveau.
Nous pouvons maintenant utiliser toute classe qui implémente l'interface IRankable. Voyons voir une implémentation leaderboard de base:
Nous obtenons un constructeur par défaut et une méthode SetRacers. Cette dernière prend un tableau de IRankable et le point étant ici que nous pouvons passer tout type tant qu'il implémente l'interface. La chaîne de données sera utilisée pour sauvegarder et récupérer dans PlayerPrefs.
Donc, nous allons enregistrer et récupérer
SaveData est générique parce que nous voulons être en mesure d'économiser plus que le contenu de l'interface. Les contraintes assurez-vous que le type donné est conforme à nos exigences de cadre (IRankable) et l'exigence de la méthode (MemoryStream).
Ils créent un BinaryFormatter et un MemoryStream. La première est utilisée pour sérialiser / désérialiser tandis que la seconde est utilisée comme une mémoire tampon. On peut alors sérialiser le tampon comme le type qui a été donné. Enfin on passe le tampon converti en une chaîne 64 qui est requird pour la méthode PlayerPrefs.
La méthode GetDataArray fait le travail est revenu.
Cela exige que la classe doit être passé sérialisé.
Une question d'être averti, il n'y a aucun moyen approprié pour vérifier si une classe est entièrement sérialisé. En outre, il n'y a pas de contrainte générique pour la sérialisation. Pour la sérialisation de travailler l'attribut est nécessaire et au programmeur pour l'assurer. Il est possible de vérifier sérialisation:
Nous pouvons maintenant terminer avec notre LeaderBoard:
Ces deux derniers sont utilisés pour récupérer racer du tableau. Vous pouvez ajouter un peu plus pour récupérer les coureurs par des points, l'indice ou même en voiture fournissant quelques informations supplémentaires.
A noter qu'aucun de ces classes sont MonoBehaviour. Ils ne nécessitent pas l'Lifecyle MonoBehaviour et n'utilisent pas vraiment l'inspecteur. Ce sont deux raisons pour lesquelles je considère pour les candidats non MB
Passons maintenant à notre LeaderBoardManager, allons-nous? Ceci est le consommateur de notre classe leaderboard. Vous pourriez envisager un gestionnaire de jeu de course, il va créer coureur, attribuer des points et voiture, et enfin, nous allons changer les points de trois coureurs au hasard.
Dans le menu Démarrer, si nous ne disposons pas de données enregistrées, nous créons un nouveau conseil d'administration et l'enregistrer.
Dans la mise à jour, nous recherchons coureur correspondant au nom et ajouter quelques points. Ensuite, nous imprimons le nouveau classement et de l'enregistrer.
Conclusion
Cela arrête ici pour l'instant, la prochaine étape nous permettra d'économiser regarder Xml et JSON. Pour l'instant, ce qu'il est et je voudrais mettre l'accent sur la section d'interface de l'article qui montre clairement comment la classe est flexible. Il est facile de réutiliser en toutes circonstances et que seul est possible en utilisant générique et interfaces.
En ce qui concerne nos données, ils sont en sécurité dans une certaine mesure. Ceux-ci sont enregistrées sous forme binaire dans une section profonde de l'appareil. Ainsi, non seulement, il faut deux ou trois coups secs à l'accès, mais il faut un peu de code pour revenir. Mais comme nous l'avons fait, il est impossible de pirater, loin de là, juste un peu plus dur que le texte brut sur le bureau.