Multi scène

Questions techniques liées à l’utilisation d'Unity (et n'entrant pas dans le cadre d'une des sections suivantes)
EmileF
Messages : 681
Inscription : 18 Mars 2017 19:39

Multi scène

Message par EmileF » 26 Oct 2023 13:33

Bonjour à tous,

Après plusieurs mois d'absence me revoilà avec un grand besoin d'aide.

J'ai l'intention de créer un jeu d'énigmes et réflexions dans un domaine fermé genre château ou tour.

J'ai imaginé un lieu composé d'une trentaine de salles. Chaque salle comprend un sas dans lequel une petite énigme permet de débloquer la porte pour accéder à la pièce principale qui contient une énigme pour récupérer un objet qui permettra de reconstituer, dans l'entrée un arbre que j'appelle "L'arbre de la liberté" dont le but du jeu est de le compléter.
J'ai commencé à créer mon jeu dans une scène unique, mais je réalise que très vite la scène va devenir énorme et risque de compromettre le bon fonctionnement du jeu.

Je pense qu'il sera plus astucieux de créer une scène par salle à visiter.

Mon soucis est, malgré les recherches que j'ai pu faire sur internet de pouvoir naviguer d'une scène à l'autre avec fluidité en ouvrant une porte pour entrer dans une nouvelle scène, une fois à l'intérieur la scène précédente est 'unloadée', et vice-versa, pour ressortir de la pièce avec l'objet récupéré.

Est-ce que quelqu'un peut me guider vers une piste à suivre pour régler ces difficultés

A savoir que j'ai commencé mon projet en utilisant une seule scène et en désactivant toutes les salles hors de celle que le player occupe. Peut-être que cette solution n'est pas si mauvaise que ça. En tout cas cette méthode est plus facile à gérer pour moi.

merci de votre aide
La différence entre l'intelligence et la stupidité est que l'intelligence est limitée.

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6225
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: Multi scène

Message par boubouk50 » 26 Oct 2023 14:09

Le chargement et déchargement asynchrone de scène.
L'idée serait de charger la scène de façon asynchrone dès que tu arrives dans une zone Trigger avant la porte pour que tu sois sûr qu'elle soit chargée au moment d'ouvrir la porte.
Pareil pour le déchargement, à l'inverse.

https://docs.unity3d.com/ScriptReferenc ... Async.html
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

EmileF
Messages : 681
Inscription : 18 Mars 2017 19:39

Re: Multi scène

Message par EmileF » 26 Oct 2023 14:23

Merci Boubouk,

En effet je peux utiliser cette méthode mais en utilisant un clic sur la porte et attendre que la scène soit chargée avant de l'ouvrir.
Mais voilà, j'ouvre la porte, le Player entre dans la salle la porte se referme et je décharge la scène précédente. Du coup la porte disparait.
Je crée donc une porte dans ma salle pour cacher le trou. Mais au retour, je clique sur ma porte, la scène précédente se recharge la porte de la pièce que j'occupe s'ouvre, mais la porte de la scène précédente est fermée.

c'est un cercle vicieux que je n'arrive pas à régler. Avec une double porte il y a toujours une porte fermée, une porte simple disparait....

Ca m'ennuie un peut de rentre les porte DontDestroyOnLoad, mais si c'est la seule solution !!!

J'ai essayé de mettre mes portes en double pour les manipuler en même temps dans un manager 'Persistant' mais je n'arrive pas à lister les portes des autres scènes...
La différence entre l'intelligence et la stupidité est que l'intelligence est limitée.

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6225
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: Multi scène

Message par boubouk50 » 26 Oct 2023 15:31

Tu n'es pas obligé de décharger la scène précédente.
Tu peux aussi faire des scènes intermédiaires qui ne contiennent que les assets qui doivent être partagés entre plusieurs scènes.
Souvent, dans les jeux, tu as une zone tampon entre 2 grandes pièces (couloir, sas, petite pièce fermée, etc). Ce n'est pas anodin. Quand tu es dans une pièce, tu as ses zones tampons adjacentes chargées. Tu es donc obligé de passer par cette zone pour aller dans une autre pièce. Quand tu passes dans une nouvelle pièce, l'ancienne pièce est déchargée, mais la zone tampon, elle, reste (puisque adjacente aussi et donc partagée entre deux ou plusieurs pièces). Cette zone tampon contient la ou les portes.

Dans ton cas, ça peut être un escalier, un couloir, un détour, un petit passage caché, une petite pièce intermédiaire.
Tout ceci fait partie du Level Design.
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Avatar de l’utilisateur
jmhoubre
Messages : 859
Inscription : 05 Oct 2019 22:05

Re: Multi scène

Message par jmhoubre » 26 Oct 2023 15:33

Bonjour,

as-tu essayé avec une scène principale (disons le couloir d'accès aux différentes salles) et avec une scène par salle chargée avec LoadSceneMode.Additive et déchargée avec UnloadScene ?

EmileF
Messages : 681
Inscription : 18 Mars 2017 19:39

Re: Multi scène

Message par EmileF » 26 Oct 2023 15:55

Voilà ce que j'ai imaginé :

Une scène manager dans lequel j'ai le script manager du jeu et le player. Dans cette scène il y aura aussi les autres objets persistants.

Au démarrage il y aura la scène manager qui chargera la scène 0 qui est en fait la première pièce du jeu et qui contiendra 'L'arbre de la liberté' à reconstituer. Cette pièce donnera accès à une scène Elévateur. Quand le joueur cliquera sur la porte
ça activera l'Elevateur et une fois dans l'élévateur la scène 0 se déchargera

Il y aura donc, la scène Elévateur qui donnera accès à toutes les pièces.

Normalement il n'y aura que la scène Manager en permanence et une autre scène en cours qui seront visibles.

Je pensais possible pour les portes de créer une liste de valeurs représentant la position des portes de l'Elévateur pour les enregistrer avant de désactiver ls scène Elévateur et repositionner les portes à la réactivation de l'Elévateur.

Est-ce possible ?
La différence entre l'intelligence et la stupidité est que l'intelligence est limitée.

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6225
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: Multi scène

Message par boubouk50 » 26 Oct 2023 16:44

Tout est possible, d'une certaine manière.
Tu es dans un environnement virtuel, facile de tricher.
Si ton élévateur est complètement fermé, alors le déplacement peut simplement être simulé et TOUTES tes pièces sont au même endroit. Il suffirait donc de charger la bonne scène et d'ouvrir les portes une fois celle-ci chargée, par exemple.
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

EmileF
Messages : 681
Inscription : 18 Mars 2017 19:39

Re: Multi scène

Message par EmileF » 26 Oct 2023 17:06

Ha oui, je ne l'avais pas pensé comme ça.
En fait, mon élévateur reste en place et je déplace la colonne élévateur pour donner l'illusion de déplacement. A la fin du déplacement et je réinitialise les positions et je recommence si nécessaire.
Très bien.
Donc là une seule porte est nécessaire.
Le joueur clique sur la porte, je charge la scène, et dès qu'elle est chargée j'ouvre la porte.
Le joueur entre dans la pièce et dès qu'il s'éloigne de la porte, je décharge l'ascenseur.
La porte de l'ascenseur est un objet persistant, plus de problème de porte ouverte ou fermée.
Nickel pour cette étape.

Au démarrage, je voudrais que seules soient chargées la scène Manager et la Scene_0 ou la scène spécifiée.
Mon soucis est que soit j'ai des scènes en double soit j'ai un démarrage infini et je suis obliger d'arrêter Unity, selon la scène que j'édite. Pourrais avoir quelques conseils pour gérer ceci ?
La différence entre l'intelligence et la stupidité est que l'intelligence est limitée.

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6225
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: Multi scène

Message par boubouk50 » 26 Oct 2023 17:47

Il nous faut savoir comment tu charges les scènes. Tu dois avoir une boucle ou un script qui est appelé à chaque chargement qui charge une nouvelle scène, et c'est la boucle infinie.
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

EmileF
Messages : 681
Inscription : 18 Mars 2017 19:39

Re: Multi scène

Message par EmileF » 26 Oct 2023 18:28

Alors voilà :
J'avais mis ce script dans toute les scènes de façon à ce qu'il démarre la scène Manager à chaque démarrage.
J'ai compris que si au démarrage de Manager j'avais la scene_start déjà activée j'avais une boucle infinie.
Je pensais que le SceneManager.LoadScene éliminait toutes les scènes présentes.
J'ai donc supprimé ce script.

Code : Tout sélectionner


public class StartScene : MonoBehaviour
{
    private void Awake()
    {
        SceneManager.LoadScene("Manager");
    }
}

Avec ce script je voulais supprimer toutes les scènes au chargement de la scène Manager et demarrer la scene_start.
Là, ça ne supprime rien et si la scene start est déjà active elle est doublée.

Code : Tout sélectionner

    public string scene_start;

    private void Awake()
    {
        for (int i = 0; i < SceneManager.sceneCount; i++)
        {
            Scene scene = SceneManager.GetSceneAt(i);
            if (scene.name != "Manager")
                SceneManager.UnloadSceneAsync(scene);

        }
        if (!string.IsNullOrEmpty(scene_start))
            SceneManager.LoadScene(scene_start, LoadSceneMode.Additive);
    }

La différence entre l'intelligence et la stupidité est que l'intelligence est limitée.

Répondre

Revenir vers « Unity le logiciel »