Transfert de données inter-scènes dans Unity - Application de plusieurs valeurs à un développement de jeu simple

Cet article sera utile aux développeurs de jeux débutants. Dans ce document, je parlerai de ma propre expérience dans la mise en œuvre d'une interaction multi-étapes et des problèmes que j'ai rencontrés.

Parlons de classes statiques pour le stockage de données, de différentes façons de charger des scènes avec le moteur Unity, et abordons également le cas de la connexion d'Admob au projet. Informations fournies par la documentation officielle et une sympathique communauté de développeurs.

La situation


Mon jeu se compose de deux scènes - le menu principal, qui est visible immédiatement lors du chargement et, directement, une scène de jeu avec des mécaniques, dans laquelle, selon l'option sélectionnée, le préfabriqué de l'objet est chargé. Il ne m’était pas possible de les combiner en une seule scène, car plusieurs objets assez complexes sont liés au menu, et il est plus pratique de séparer les entités.

Auparavant, j'utilisais simplement un certain objet contrôleur pour stocker les données, mais avec le déchargement de la scène, il cesse d'exister.

Transfert de données (classe statique)


Il s'est avéré que Unity est excellent pour travailler avec du code, même s'il se trouve paisiblement dans un fichier dans le dossier des scripts et n'est pas attaché par un composant à un objet sur la scène (ce n'était pas évident pour un débutant). Par exemple, un tel fichier peut être une classe statique de la forme suivante:

using UnityEngine; public static class DataHolder { private static GameObject prefabName; public static GameObject Prefab { get { return prefabName; } set { prefabName = value; } } } 


Ainsi, j'ai réussi à sauvegarder le choix de l'utilisateur même après avoir déchargé la scène et chargé une nouvelle. Au départ, tout fonctionnait exactement avec des scènes de commutation difficiles.

En utilisant ce mécanisme, vous pouvez également transférer des paramètres vers d'autres scènes à partir du menu, par exemple, la langue de localisation, les paramètres des sons et de la musique, et bien plus encore.

Multi-valeur (SceneManagement)


Tout me convenait et donc, jusqu'à ce que je reçoive la tâche de me connecter au projet Admob (publicité), pour que la vidéo soit montrée au tout début de la scène du jeu. Il s'est avéré qu'il y a des subtilités: demander une vidéo prend beaucoup de temps, et il n'a tout simplement pas le temps d'arriver lors du changement de scène. Je ne voulais pas retarder des retards supplémentaires dans le projet, d'autant plus que nous avons beaucoup de temps jusqu'à ce que le joueur «colle» au menu. Ensuite, j'ai découvert qu'il n'est pas nécessaire de changer de scène «dur», car il existe une merveilleuse option pour le chargement additif (sans décharger la scène précédente).

Je charge la scène du jeu avec le contrôleur de menu (la scène avec le menu et l'objet publicitaire reste également chargée):

 SceneManager.LoadScene(1,LoadSceneMode.Additive); 

À la fin du niveau, je décharge la scène du jeu avec le contrôleur de jeu (pour qu'elle ne se bloque pas dans ma mémoire):

 SceneManager.LoadScene(0,LoadSceneMode.Single); 

En utilisant un tel schéma, la publicité est chargée immédiatement au début de l'application, et vous pouvez invoquer l'affichage de la publicité à tout moment souhaité. Vous pouvez faire de même avec tous les objets dont vous avez besoin.

Les problèmes


Malheureusement, même avec le chargement additif de scènes, vous ne pourrez pas vous plonger dans les objets d'une scène à partir d'une autre. Les liens vers les objets devront être transmis via un certain «médiateur» (dans mon cas, la même classe statique a été utilisée).

Soyez prudent lorsque vous instanciez des préfabriqués, si plusieurs scènes sont actives - pour moi, ils ont tous décidé de tomber sur la mauvaise scène (plus une autre fois).

Liens de documentation

Source: https://habr.com/ru/post/fr440718/


All Articles