Je développe mon premier jeu en 2D sous Unity et je suis tombé sur une question qui me semble importante.
Comment gérer les données entre les scènes?
Il semble y avoir différentes réponses à cela:
Quelqu'un a mentionné l'utilisation de PlayerPrefs , alors que d'autres personnes m'ont dit que cela devrait être utilisé pour stocker d'autres éléments tels que la luminosité de l'écran, etc.
Quelqu'un m'a dit que le meilleur moyen était de s'assurer de tout écrire dans une sauvegarde chaque fois que je changeais de scène, et de s'assurer que lors du chargement de la nouvelle scène, récupérait les informations à partir de la sauvegarde. Cela m'a semblé un gaspillage de performance. Étais-je trompé?
L’autre solution, celle que j’ai mise en œuvre jusqu’à présent, consiste à créer un objet de jeu global qui ne soit pas détruit entre les scènes et qui gère toutes les données entre les scènes. Ainsi, lorsque le jeu commence, je charge une scène de départ dans laquelle cet objet est chargé. Une fois cette opération terminée, la première scène de jeu réelle est chargée, généralement un menu principal.
Ceci est ma mise en œuvre:
using UnityEngine;
using UnityEngine.UI;
using System.Collections;
public class GameController : MonoBehaviour {
// Make global
public static GameController Instance {
get;
set;
}
void Awake () {
DontDestroyOnLoad (transform.gameObject);
Instance = this;
}
void Start() {
//Load first game scene (probably main menu)
Application.LoadLevel(2);
}
// Data persisted between scenes
public int exp = 0;
public int armor = 0;
public int weapon = 0;
//...
}
Cet objet peut être manipulé sur mes autres classes comme ceci:
private GameController gameController = GameController.Instance;
Bien que cela ait fonctionné jusqu'à présent, cela me pose un gros problème: si je veux charger directement une scène, disons par exemple le niveau final du jeu, je ne peux pas le charger directement, car cette scène ne contient pas cette objet de jeu global .
Est-ce que je traite ce problème de la mauvaise façon? Existe-t-il de meilleures pratiques pour ce type de défi? J'aimerais entendre vos opinions, vos pensées et vos suggestions sur cette question.
Merci
Un moyen idéal de stocker des variables entre les scènes consiste à utiliser une classe de gestionnaire singleton. En créant une classe pour stocker des données persistantes et en lui affectant une valeur
DoNotDestroyOnLoad()
, vous pouvez vous assurer qu'elle est immédiatement accessible et persiste entre les scènes.Une autre option consiste à utiliser la
PlayerPrefs
classe.PlayerPrefs
est conçu pour vous permettre de sauvegarder des données entre les sessions de lecture , mais il servira toujours de moyen de sauvegarder des données entre des scènes .Utiliser une classe singleton et
DoNotDestroyOnLoad()
Le script suivant crée une classe singleton persistante. Une classe singleton est une classe conçue pour n'exécuter qu'une seule instance à la fois. En fournissant une telle fonctionnalité, nous pouvons créer en toute sécurité une référence de soi statique, pour accéder à la classe de n'importe où. Cela signifie que vous pouvez accéder directement à la classe avec
DataManager.instance
, y compris toutes les variables publiques de la classe.Vous pouvez voir le singleton en action, ci-dessous. Notez que dès que j'exécute la scène initiale, l'objet DataManager passe de l'en-tête spécifique à la scène à l'en-tête "DontDestroyOnLoad", dans la vue hiérarchique.
Utiliser la
PlayerPrefs
classeUnity a une classe intégrée pour gérer les données persistantes de base appelées
PlayerPrefs
. Toutes les données validées dans lePlayerPrefs
fichier persisteront au cours des sessions de jeu . Il est donc naturellement capable de conserver des données dans des scènes.Le
PlayerPrefs
fichier peut stocker des variables de typesstring
,int
etfloat
. Lorsque nous insérons des valeurs dans lePlayerPrefs
fichier, nous fournissons unestring
clé supplémentaire . Nous utilisons la même clé pour extraire ultérieurement nos valeurs duPlayerPref
fichier.Notez que je prends des précautions supplémentaires lors de la manipulation du
PlayerPrefs
fichier:private static string
. Cela me permet de garantir que j'utilise toujours la bonne clé. Cela signifie que si je dois changer la clé pour une raison quelconque, je n'ai pas besoin de changer toutes les références à la clé.PlayerPrefs
fichier sur le disque après y avoir écrit. Cela ne fera probablement pas de différence si vous n'implémentez pas la persistance des données dans les sessions de lecture.PlayerPrefs
sera sauvegardé sur le disque lors d’une fermeture d’application normale, mais il se peut qu’il n’appelle pas naturellement si votre jeu plante.PlayerPrefs
, avant d'essayer de récupérer une valeur qui lui est associée. Cela peut sembler une double vérification inutile, mais c'est une bonne pratique.Delete
méthode qui efface immédiatement lePlayerPrefs
fichier. Si vous n'avez pas l'intention d'inclure la persistance des données entre les sessions de lecture, vous pouvez envisager d'appeler cette méthode surAwake
. En effaçant lePlayerPrefs
fichier au début de chaque jeu, assurez - vous que toutes les données qui ne persistent de la session précédente ne sont pas traitées à tort que les données de la actuelle session.Vous pouvez voir
PlayerPrefs
en action, ci-dessous. Notez que lorsque je clique sur "Enregistrer les données", j'appelle directement laSave
méthode et lorsque je clique sur "Charger les données", j'appelle directement laLoad
méthode. Votre propre implémentation variera probablement, mais elle démontrera les bases.Pour terminer, je dois souligner que vous pouvez développer la base
PlayerPrefs
pour stocker des types plus utiles. JPTheK9 fournit une bonne réponse à une question similaire , dans laquelle ils fournissent un script pour la sérialisation de tableaux sous forme de chaîne, à stocker dans unPlayerPrefs
fichier. Ils nous indiquent également le wiki de la communauté Unify , où un utilisateur a téléchargé unPlayerPrefsX
script plus volumineux pour permettre la prise en charge d'une plus grande variété de types, tels que les vecteurs et les tableaux.la source