Utiliser SceneManagement de Unity pour gérer vos scènes

Utiliser SceneManagement de Unity pour gérer vos scènes

Depuis quelques versions déjà , on doit utiliser le namespace SceneManagement de Unity pour changer de scène dans notre jeu vidéo. Mais les possibilité de chargement de Scène sont multiples et grâce au loading en mode additive, on peut imiter le comportement par défaut de Godot Engine.

 

Une scène par définition est composée de GameObjects, qui sont eux composés de composants de type MonoBehavior. On peut voir la liste des GameObjects de la scène grâce à la fenêtre “hierarchy“, et en cliquant sur un GameObject, on accède à sa liste de composants, visibles dans la fenêtre “inspector“.

Tous ceux et celles qui ont déjà pratiqué Unity savent cela. Mais comment gérez vous vos scènes ?

 

Gestion standard de scènes: mode single

Pour une première architecture de jeu vidéo, on peut penser à utiliser une scène pour chaque situation du jeu. Par exemple on pourrait avoir :

  • Scène du menu : UI, scripts de gestion de ce menu (comme par exemple la connexion Facebook) …
  • Scène du jeu : le player (rendering, logique…), toute la logique du jeu, UI du jeu …

Cette première architecture simplissime regroupe ainsi tous les éléments autour d’une même situation d’utilisation de l’application (InGame, InMenu) dans une même scène.

Ainsi nous passerons d’une situation à une autre en changeant de scène.

Avec l’API de Unity, on utilisera donc le chargement de scène en mode Single, avec la méthode LoadScene :

using UnityEngine.SceneManagement;

//reste du code

//changement de scène
SceneManager.LoadScene("nomDeLaProchaineSceneACharger");

Remarquez que la méthode ne prend ici, qu’un seul paramètre : le nom de la scène (paramètre de type string). Mais par défaut selon l’API, on charge en réalité en mode LoadSceneMode.Single.

Ainsi c’est comme si on faisait :

using UnityEngine.SceneManagement;

//reste du code

//changement de scène
SceneManager.LoadScene("nomDeLaProchaineSceneACharger",LoadSceneMode.Single);

 

Ce faisant, l’ancienne scène sera “déchargée” et la nouvelle chargée et sera rendu active et principale. Ce sera donc elle qui sera rendu par le jeu vidéo, et si votre scène dispose d’une caméra, nous pourrons alors voir cette scène sur notre écran.

 

Cette architecture a l’avantage d’être simple à mettre en place, mais elle souffre de quelques inconvénients:

  • Si plusieurs personnes travaillent dans la même scène, on risque d’avoir des conflits lors du push/pull avec le système de versionning (Git par exemple).
  • Pas de modularité, tout le jeu est dans une même scène
  • Pas du tout adapté à un jeu de type OpenWorld

 

Attention! Ce type de chargement en synchrone bloque l’exécution tant que la scène n’est pas complètement chargée. Si vous voulez attendre le chargement complet sans bloquer le reste, utilisez plutôt le mode asynchrone avec : LoadSceneAsync.

 

Gestion modulaire de scènes: mode additive

Si on se concentre que sur notre scène de jeu qui comporte actuellement tout à l’intérieur, on peut penser une première décomposition en sous-scènes. C’est un peu le fonctionnement de base de  Godot Engine.

Ainsi notre scène de jeu pourrait elle même charger d’autres sous-scènes.

Voici un exemple non exhaustif :

  • Sous-scène UI : toute l’interface et sa logique
  • Sous-scène Moteur de jeu : la logique principale du jeu
  • Sous-scène Player : les datas, les input
  • Sous-scène Secteur 1 : gestion logique du secteur 1
  • Sous-scène Secteur 2 : …

Cependant pour charger une scène dans une autre scène, nous devons cette fois-ci changer de mode et passer en mode additive.

using UnityEngine.SceneManagement;

//reste du code

//changement de scène
SceneManager.LoadScene("nomDeLaProchaineSceneACharger",LoadSceneMode.Additive);

 

 

Comment implémenter le mode additive ?

Retrouvez dans la vidéo, un tutoriel exemple de mise en application directe du concept de chargement en mode additive.

 

Codez en C# votre premier jeu vidéo avec Unity 2108.
Admin bar avatar
Spécialisé depuis maintenant 6 ans sur Unity, je développe des jeux vidéos pour moi même, notre équipe, ou pour des clients. Formateur sur Make Your Game. Formateur chez OpenClassRooms sur les parcours Web,Java et Android, mais aussi développeur de sites internet et d'applications, j'exerce en tout point ma passion de l'informatique. Certifié Développeur Unity, C#, PHP, HTML, CSS, MYSQL, JS, JAVA, ANDROID, Wordpress

Laisser une réponse