Coroutine ne se finit jamais

Questions à propos du scripting. Hors Shader, GUI, Audio et Mobile.
PoYo
Messages : 7
Inscription : 09 Nov 2020 22:52

Coroutine ne se finit jamais

Message par PoYo » 22 Juin 2021 19:39

Bonjours a tous et merci de prendre le temps de m'aider

Alors voila je suis un tuto unity mais j'aime bien ajouter se que je peut de mon coter, la ou j'en suis on apprend à passer d'une scène a l'autre et je voulais utiliser une methode statique que j'utilise régulierement qui me permet de stoper les input et donc le mouvement de mon perso pour pas qu'il cour pendant l'animation de changement de scene et qu'il tombe pendant l'écran noir, mais bizarement après un changement de scène et uniquement dans se cas la , la ligne dans CoroutineStopMovement qui permet de rebouger ne se lit jamais, voici des screen de mon code

(a noter que j'utilise le nonouveau systeme d'input mais concretement c'est juste une methode qui renvoie un Vector2.up dowb right ou left en fonction de la touche)

merci encore à se qui m'aideront et bonne journée ^^(oui je sais pas écrire)
OnMove (se que bloque isStoped).png
OnMove (se que bloque isStoped).png (8.61 Kio) Consulté 584 fois
Coroutine StopMovement.png
Coroutine StopMovement.png (10.93 Kio) Consulté 584 fois
Coroutine NextLevel.png
Coroutine NextLevel.png (85.36 Kio) Consulté 584 fois

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 5605
Inscription : 28 Avr 2014 11:57
Localisation : Toulouse

Re: Coroutine ne se finit jamais

Message par boubouk50 » 22 Juin 2021 21:36

Salut,

je pense que la solution réside dans la destruction du component.
Quand tu charges une nouvelle scène (non-additive comme dans ton code), l'ancienne est détruite. Tout ce que contient l'ancienne scène est déchargé et se termine à ce moment-là.
Je suppose donc que ta coroutine existe dans la scène précédente (son MonoBehaviour ou sa référence) et est détruite donc la fin de celle-ci n'est jamais appelée.
Est-ce le cas ou bien est-elle "DontDestroyOnLoad"?

Donne nous un peu de détail sur les éléments détruits entre les scènes et ceux qui persistent (personnages, components, etc)
"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

PoYo
Messages : 7
Inscription : 09 Nov 2020 22:52

Re: Coroutine ne se finit jamais

Message par PoYo » 22 Juin 2021 22:14

Alors déja merci d'avoir répondu si vite

Voici la liste des éléments qui ne sont pas supprimer et mon personnage en fait partie et donc le script qui contient la méthode StopMovement
code DontDestroy.png
code DontDestroy.png (14.68 Kio) Consulté 571 fois
 ! Message de : Max
Poste tes scripts directement dans le corps de tes messages, encadrés par les balises prévues à cet effet. Pas de screen.
Merci de lire la Charte et sa FAQ, en particulier Comment insérer un script dans un messages ?.
Ecran DontDestroy.png
Ecran DontDestroy.png (179.14 Kio) Consulté 570 fois
Au et tu pourrait m'éxpliquer le concept de "non-additive" car j'avoue ne pas savoir se que c'est, merci et bonne soirée
Pièces jointes
Ecran DontDestroy.png
Ecran DontDestroy.png (169.75 Kio) Consulté 571 fois

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 5605
Inscription : 28 Avr 2014 11:57
Localisation : Toulouse

Re: Coroutine ne se finit jamais

Message par boubouk50 » 23 Juin 2021 08:25

Ce qui me gène, c'est que tu appelles la fonction sans référence, directement depuis la classe. Donc je ne sais pas trop comment cela fonctionne concernant les variables, mais cela ne me semble pas correct.
Pour moi, il te faut une instance de la classe.

Donne nous le tuto que tu suis aussi, que nous puissions voir ce que tu modifies.

Tu peux charger une scène de deux façons: additive ou non. Additive viendra ajouter la nouvelle scène à celles en cours, Non-Additive les remplacera.
"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

PoYo
Messages : 7
Inscription : 09 Nov 2020 22:52

Re: Coroutine ne se finit jamais

Message par PoYo » 24 Juin 2021 14:17

j'ai fait une référence du script j'espere que c'est se que tu entendais par instance de la classe, mais le problème reste inchanger , et voila le lien du tuto que je suit est inutile car le stop movement n'est pas du tous intégrer dans le tuto, il y a juste la notion de changement de scene, enfin que non-aditive ducoup.

Le code pour charger le prochain lvl: ()

Code : Tout sélectionner

public PlayerMovement playerMovement;//je renseigne cette variable depuis unity avec un glisser déposer

private IEnumerator CoroutineNextLevel()
    {
        StartCoroutine(playerMovement.CoroutineStopMovment(5f)); //la fameuse methode qui ne se finira jamai, elle bloque les mouvement voir sur l'autre image

        animator.SetBool("isOpen", true); //lance une animation
        yield return new WaitForSeconds(0.5f); //attand le temps de l'animation

        fadeSystem.SetTrigger("FadeIn"); yield return new WaitForSeconds(1f);//lance le fondu au noir + att que l'écran soit noir
        SceneManager.LoadScene(sceneName);//charge la prochaine scene 
        GameObject.Find("Player").transform.position = GameObject.Find("SpawnPoint").transform.position; //met Player au spawn de la scene

    }
et le code de StopMovement qui ne change pas vraiment si se n'est qu'il n'est plus static :

Code : Tout sélectionner

public IEnumerator CoroutineStopMovment(float time)
    {
        isStopped = true;
        direction = Vector2.zero;//empeche le derniere input de se repeter en boucle

        yield return new WaitForSeconds(time);
        isStopped = false;
    }

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 5605
Inscription : 28 Avr 2014 11:57
Localisation : Toulouse

Re: Coroutine ne se finit jamais

Message par boubouk50 » 24 Juin 2021 16:41

PoYo a écrit :
24 Juin 2021 14:17
le lien du tuto que je suit est inutile
Non, il est utile. Je ne peux pas trouver une solution avec seulement 3 lignes de codes éparpillées.
"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

PoYo
Messages : 7
Inscription : 09 Nov 2020 22:52

Re: Coroutine ne se finit jamais

Message par PoYo » 25 Juin 2021 18:28

d'accord alors voila le lien de la vidéo (elle est plutot longue mais la 2ème partie de consiste cas fair un fondu au noir pendant la transition) : https://youtu.be/ZLkbXv-tTbs
7:48 : code du changement de level
20:05 : code pour ne pas détruire les objets
25:54 : création du spawn point

Merci de prendre du temps pour m'aider

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 5605
Inscription : 28 Avr 2014 11:57
Localisation : Toulouse

Re: Coroutine ne se finit jamais

Message par boubouk50 » 29 Juin 2021 08:42

Si playerMovement est "DontDestroyOnLoad" il n'y a aucune raison pour que sa coroutine ne se termine pas. Je pense donc qu'elle se termine correctement et que isStopped est bien remis à false.
Je n'utilise pas les classes statiques, donc je ne suis pas familier avec leur fonctionnement, je me demande comment est interprété isStopped vu qu'il n'est pas issu d'une instance mais de la classe statique.
Du coup, je t'ai peut être induit en erreur en te disant de passer par une instance pour lancer CoroutineMovment ()

Code : Tout sélectionner

public PlayerMovement playerMovement; //Du coup, ça c'est probablement pas bon.
Peux-tu me donner l'intégralité de la classe PalyerMovment stp?
"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

PoYo
Messages : 7
Inscription : 09 Nov 2020 22:52

Re: Coroutine ne se finit jamais

Message par PoYo » 29 Juin 2021 12:25

Bien sur le voila (désoler du long temps de réponce je n'avais plus accès a mon pc):

Code : Tout sélectionner

using System.Collections;
using System.Collections.Generic;
using UnityEngine;


public class PlayerMovement : MonoBehaviour
{
    public float moveSpeed; //vitesse de déplacement
    public float jumpSpeed; //vitesse de saut
    public float jumpTime; //temps de saut
    
    public bool isGrounded; //est il au sol?
        public Transform grounded;
        public float radiusGrounded;
        public LayerMask collisionLayer;
    
    public /*static*/ bool isStopped = false; // est stopé? 

    private Vector3 velocity = Vector3.zero;
    public static Vector2 direction = Vector2.zero;

    
    public Rigidbody2D rb;
    
    public SpriteRenderer spriteRender;


    

    void FixedUpdate()
    {
        
        isGrounded = Physics2D.OverlapCircle(grounded.position ,radiusGrounded, collisionLayer);
        
        float horizontalMovement = direction.x * moveSpeed;
        MovePlayer(horizontalMovement);
    }


    void MovePlayer(float _horizontalMovement ) // fait le mouvement
    {
        
        Vector3 targetVelocity = new Vector2(_horizontalMovement, rb.velocity.y); //crée un vector2 de ou aller sur x
        rb.velocity = Vector3.SmoothDamp(rb.velocity, targetVelocity, ref velocity, 0.05f); //deplacement sur x

        if (direction.y > 0 && isGrounded)
        {
            Jump();//saute si il peut
        }
        
    }

    void Jump()
    {
        rb.AddForce(new Vector2(0f, jumpSpeed));
        
    }

    


    
    public IEnumerator CoroutineStopMovment(float time)
    {
        isStopped = true;
        direction = Vector2.zero;//empeche le derniere input de se repeter en boucle

        yield return new WaitForSeconds(time);
        isStopped = false;
    }

    private void OnDrawGizmos()
    {
        Gizmos.color = Color.red;
        Gizmos.DrawWireSphere(grounded.position, radiusGrounded);
    }

}

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 5605
Inscription : 28 Avr 2014 11:57
Localisation : Toulouse

Re: Coroutine ne se finit jamais

Message par boubouk50 » 29 Juin 2021 15:23

Ok, donc c'est uniquement un problème d'instance de classe.

Lorsque tu places un script sur un gameObject, tu crées une instance de classe. Les valeurs de ses variables lui sont propres.
Par exemple, imaginons que tu possèdes 3 gameObjects possédant tous un Component PlayerMovement. Chacun sera unique et possédera ses propres valeurs. Donc si tu veux agir sur un gameObjects en particulier il te faudra le référencer, sinon tu pourras pas savoir sur lequel tu agis.
Et c'est ce qui se passe ici, tu passes par la classe sans passer par sa référence. Il faut donc référencer ton objet pour que tu travailles toujours sur le même.
Ici, tu le références (comme demandé)

Code : Tout sélectionner

public PlayerMovement playerMovement;
Ici tu passes par la classe (je suppose que isStopped était static)

Code : Tout sélectionner

if (PlayerMovement.isStopped != true)
{
	PlayerMovement.direction = input.Get<Vector2> ();
}
Il te faut donc référencer le même PlayerMovement dans ce script (et toutes les occurrences).
"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

Répondre

Revenir vers « Scripting »