Page 1 sur 1

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

Publié : 15 Mars 2024 15:44
par miwaky
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.

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

Publié : 15 Mars 2024 16:01
par boubouk50
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.

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

Publié : 15 Mars 2024 17:01
par miwaky
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.