[RESOLU] Problème de script de ralentissement de temps avec menu pause.

Questions à propos du scripting. Hors Shader, GUI, Audio et Mobile.
miwaky
Messages : 2
Inscription : 15 Mars 2024 01:00

[RESOLU] Problème de script de ralentissement de temps avec menu pause.

Message par miwaky » 15 Mars 2024 15:44

Bonjour,

Je viens de commencer à toucher à unity (depuis 2 mois) et j'ai décidé de faire un subway surfer pour m'entrainer. J'ai décidé d'ajouter un système de ralenti grâce à un bonus en utilisant la ligne :
Time.timeScale = 0.5f
Cependant comme le menu pause utilise aussi le timeScale lorsque j'utilise le bonus (et donc mon temps va à 0.5f) puis pause il va à 0. Puis en rappuyant sur le jeu, il repasse à 1f.

Pour résoudre se problème j'ai utilisé un

Code : Tout sélectionner

 TempsRalenti tempsRalenti;


 void Start()
 {
     obstacles = Object.FindFirstObjectByType<Obstacles>();
     tempsRalenti = Object.FindFirstObjectByType<TempsRalenti>();
 }

 void Update()
 {
        Debug.Log("Avant le if : " + tempsRalenti.isXPressed);
     if (Input.GetKeyDown(KeyCode.Escape) && !obstacles.Death && [highlight=yellow]tempsRalenti.isXPressed[/highlight])
     {
         Debug.Log("isXpressed is true = " + tempsRalenti.isXPressed);
         if (!inPause)
         {

             panelPause.SetActive(true);
             Time.timeScale = 0f; // Mettre le temps à l'arrêt
             inPause = true;
         }
         else
         {
             panelPause.SetActive(false);
             Time.timeScale = 0.5f;
             inPause = false;
         }
     }
     else if(Input.GetKeyDown(KeyCode.Escape) && !obstacles.Death)
     {
         Debug.Log("isXpressed is true = " + tempsRalenti.isXPressed);
         if (!inPause)
         {
             panelPause.SetActive(true);
             Time.timeScale = 0f; // Mettre le temps à l'arrêt
             inPause = true;
         }
         else
         {
             panelPause.SetActive(false);
             Time.timeScale = 1f;
             
             inPause = false;
         }
     }
Le debug : Debug.Log("Avant le if : " + tempsRalenti.isXPressed); me donne d'ailleurs quelque chose de bizarre, le debug m'annonce false puis true en boucle.

Sachant que la variable est bien défini dans tempsRalenti :

Code : Tout sélectionner

   public bool isXPressed = false;
    private void Start()
    {
        imageTemps.SetActive(true);
    }
    public void Update()
    {
            imageTemps.SetActive(true);
        if (Input.GetKeyDown(KeyCode.X) && !isXPressed)
        {
[highlight=yellow]             isXPressed = true;[/highlight]            
Debug.Log("Temps ralenti" + isXPressed);
            StartCoroutine(ResetSpeed());
            Time.timeScale = 0.5f;
            CubeControl.speed *= 2;
          }

    }
    public IEnumerator ResetSpeed()
    {
        yield return new WaitForSeconds(3f);
        CubeControl.speed /= 2;
        Time.timeScale = 1f;
        Debug.Log("Temps ralenti");
        isXPressed = false;
        imageTemps.SetActive(false);
        Temps.SetActive(false);

    }
}
Quelqu'un pourrait m'expliquer où je me suis trompé ?

Merci.
Pièces jointes
image_2024-03-15_144226865.png
Debug
image_2024-03-15_144226865.png (63.59 Kio) Consulté 386 fois
Dernière édition par miwaky le 15 Mars 2024 17:02, édité 1 fois.

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

Re: Problème de script de ralentissement de temps avec menu pause.

Message par boubouk50 » 15 Mars 2024 16:01

Le code que tu nous donnes ne peut pas rendre cela.
La coroutine n'est lancée uniquement lorsqu'un appui sur X est fait (donc pas possible que ce soit pile 1 fois par frame). Or, on ne voit aucun log d'appui sur X ou ESC. Donc tu n'entres pas dans les conditions. Ton code se réduit donc à:

Code : Tout sélectionner

void Update()
{
     Debug.Log("Avant le if : " + tempsRalenti.isXPressed);
}
 public void Update()
{
     imageTemps.SetActive(true);
}
Soit tu affectes cette variable ailleurs (dans du code que tu ne nous as pas donné), soit ton code est doublé, c'es-à-dire que tu as plusieurs fois ces Components dans ta scène (et encore, avec un TempsRalenti désactivé) ou alors, tu as un autre Debug.Log qui affiche la même chose et ça te fait dire que c'est le même.

Code : Tout sélectionner

tempsRalenti = Object.FindFirstObjectByType<TempsRalenti>();
Ça, c'est propice à pas faire ce que tu veux. Tu ne sais pas quel Component TempsRalenti, tu vas récupérer, tu as intérêt à être sûr qu'il n'y en ait qu'un seul dans ta scène et qu'il soit actif.
"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

miwaky
Messages : 2
Inscription : 15 Mars 2024 01:00

Re: Problème de script de ralentissement de temps avec menu pause.

Message par miwaky » 15 Mars 2024 17:01

boubouk50 a écrit :
15 Mars 2024 16:01
Le code que tu nous donnes ne peut pas rendre cela.
La coroutine n'est lancée uniquement lorsqu'un appui sur X est fait (donc pas possible que ce soit pile 1 fois par frame). Or, on ne voit aucun log d'appui sur X ou ESC. Donc tu n'entres pas dans les conditions. Ton code se réduit donc à:

Code : Tout sélectionner

void Update()
{
     Debug.Log("Avant le if : " + tempsRalenti.isXPressed);
}
 public void Update()
{
     imageTemps.SetActive(true);
}
Soit tu affectes cette variable ailleurs (dans du code que tu ne nous as pas donné), soit ton code est doublé, c'es-à-dire que tu as plusieurs fois ces Components dans ta scène (et encore, avec un TempsRalenti désactivé) ou alors, tu as un autre Debug.Log qui affiche la même chose et ça te fait dire que c'est le même.

Code : Tout sélectionner

tempsRalenti = Object.FindFirstObjectByType<TempsRalenti>();
Ça, c'est propice à pas faire ce que tu veux. Tu ne sais pas quel Component TempsRalenti, tu vas récupérer, tu as intérêt à être sûr qu'il n'y en ait qu'un seul dans ta scène et qu'il soit actif.
Un grand merci ! Le script TempsRalenti était appelé 2 fois sur 2 Game Object différente.

Répondre

Revenir vers « Scripting »