[RESOLU] Perte d'instance d'un tableau suite à Yield return

Questions à propos du scripting. Hors Shader, GUI, Audio et Mobile.
Red
Messages : 5
Inscription : 01 Août 2020 22:30

[RESOLU] Perte d'instance d'un tableau suite à Yield return

Message par Red » 02 Août 2020 15:58

Bonjour,

Un peu de contexte:

Mon projet unity se découpe en une scène générale où je place tout ce qui est commun (notamment le player y est présent) plus les scènes plus classique que je charge en additive par dessus (on y trouve les maps, les pnj etc).

Pour me permettre les interactions entre le player et les autres objets, j'ai placé une méthode Comportement_pnj_obj() dans le script des objets qui doivent intéragir et un raycast coté player qui va appeler cette méthode quand le player interagit avec l'objet:

Code : Tout sélectionner

 
               if (declencher_hit == true)
                {
                    RaycastHit2D hit = Physics2D.Raycast(transform.position, direction_ray, distance_ray, layerMask);

                    if (hit.collider != null)
                    {
                        // déclencher comportement objet

                        hit.collider.SendMessage("Comportement_pnj_obj");
                    }
                }
(j'ai testé SendMessage et SendMessageUpwards, pas vu de différence)

Jusqu'ici tout allait bien, cela fonctionne dans la plupart des cas (en tout cas je n'avais pas de bug visible).

Seulement désormais j'ai besoin de traiter dans la méthode de comportement un tableau via une coroutine un peu complexe. Pour l'exemple j'ai créé une coroutine toute bête pour vous montrer:

Code : Tout sélectionner

    public void Comportement_pnj_obj()
    {
        if (etat_interaction == 1)
        {
            // preparation appel dialogue

            //alim_key_phrase = new string[] {"com 5", nom_item_1 + " x" + nombre_item_1, nom_item_2 + " x" + nombre_item_2,
            //        nom_item_3 + " x" + nombre_item_3, nom_item_4 + " x" + nombre_item_4, nom_item_5 + " x" + nombre_item_5 };

            alim_key_phrase = new string[] { "com 5", "com 5", "com 5", "com 5", "com 5", "com 5" };

            alim_question_key = new bool[] { true, false, false, false, false, false };

            // appel dialogue

            dialogue1 = texts.renvoie_tableau_bulle(alim_key_phrase, alim_question_key, 6);

            StartCoroutine(coroutine_test(dialogue1));

Code : Tout sélectionner

    private IEnumerator coroutine_test(Bulle[] test)
    {
        Debug.Log("là" + test[0].ligne_1);

        yield return null;

        Debug.Log("ici" + test[0].ligne_1);
    }
lorsque que l'on fait tourner cela en faisant interagir le player avec l'objet, je perd l'instance du tableau suite au Yield return:

làVous venez de trouver :
NullReferenceException: Object reference not set to an instance of an object

(je précise que d'après mes tests, dans les mêmes conditions, un appel à la coroutine depuis une méthode Update fonctionne)

je n'ai plus vraiment d'idée pour faire en sorte de ne pas perdre la tableau.

Merci d'avance pour votre aide.
Dernière édition par Red le 04 Août 2020 23:30, édité 1 fois.

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

Re: Perte d'instance d'un tableau suite à Yield return

Message par jmhoubre » 02 Août 2020 16:23

J'ai l'impression que c'est normal : un yield return, c'est un return non ? Quand il est exécuté, le contexte local de la fonction est perdu.
Esssaie en déclarant la tableau avant l'appel de la coroutine.

Red
Messages : 5
Inscription : 01 Août 2020 22:30

Re: Perte d'instance d'un tableau suite à Yield return

Message par Red » 02 Août 2020 16:32

Peux-tu me donner un exemple car pour moi le tableau avant l'accès à la coroutine est existant.

D'ailleurs comme je le disais, avec le même code, si celui-ci est appelé par une fonction update sans passer par le raycast + SendMessage ça fonctionne, l'instance ne se perd pas suite au yield return.

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

Re: Perte d'instance d'un tableau suite à Yield return

Message par jmhoubre » 02 Août 2020 19:51

Visiblement tu n'as pas publié tout le script, difficile de dire quelque chose de pertinent, à part poser des questions, ni de le tester chez soi.
Ta coroutine passe un tableau dialogue1, ce que je n'avais pas vu à la 1ère lecture, donc ce n'est pas du tout ce que je supposais plus haut.

Red
Messages : 5
Inscription : 01 Août 2020 22:30

Re: Perte d'instance d'un tableau suite à Yield return

Message par Red » 02 Août 2020 20:15

J'ai publié la partie qui me semblait pertinente pour pas noyer le sujet sous 5 pages de script :)

Pour moi mon problème c'est que l'appel via raycast + SendMessage fais que le tableau perd son instance dans la coroutine des le premier yield return alors que ce n'est pas un problème que je rencontre dans les autres cas où j'appel la coroutine (depuis par exemple une fonction update). Et je ne sais pas comment faire pour éviter cette perte dans ce cas @_@

je n'ai rien trouvé à ce propos après des heures de recherches sur google my friend. Du coup ce forum est un peu mon dernier espoir.

Après si vraiment besoin, je peux publier d'autres partie des scripts, c'est juste éviter de se noyer dans des parties qui n'ont pas d'impacts par rapport au problème que je rencontre.

Red
Messages : 5
Inscription : 01 Août 2020 22:30

Re: Perte d'instance d'un tableau suite à Yield return

Message par Red » 04 Août 2020 23:25

Je viens de trouver ce qui n'allait pas (après de multiple test), une suppression du tableau traînait dans l'un des scripts... Merci pour avoir jeter un œil sur mon problème.

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

Re: [RESOLU] Perte d'instance d'un tableau suite à Yield return

Message par jmhoubre » 05 Août 2020 22:25

Je ne trouve pas ce problème dans tes scripts : c'est où ?

Répondre

Revenir vers « Scripting »