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
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.