[MY] Comment utiliser RemoveListener depuis un gameObject?

Questions à propos du scripting. Hors Shader, GUI, Audio et Mobile.
megablast2
Messages : 116
Inscription : 15 Août 2013 16:47

[MY] Comment utiliser RemoveListener depuis un gameObject?

Message par megablast2 » 16 Oct 2021 09:55

Bonjour,
Je suis tombé sur ce sujet concernant le removeListener mais j'ai encore du mal a le comprendre.
RemoveListener au destroy d'un bouton

En suivant la doc d'unity,
Dans mon GameManager, j'ai cette fonction :

Code : Tout sélectionner

   public void RemoveGameOverTest(UnityAction unityAct)
    {
        UnityEvt.gameOver.RemoveListener(unityAct);
    }
Dans le script de mon GameObject (un personne nommé kaya qui arrete de bouger si la partie est perdu) :

Code : Tout sélectionner

   public void KayaStop()
    {     
        GetComponent<KayaIAScript>().enabled = false;
        kayaAnimator.SetBool("attack", false);
        kayaAnimator.SetBool("walk", false);

        UnityAction myEvent = () => { KayaStop(); };
        GameManager.Instance.RemoveGameOverTest(myEvent);
     }
Je ne suis pas sur que ce soit judicieux d'utiliser un RemoveListener ici, mais c'était plus pour essayer de comprendre comment l'utiliser. Unity ne m'indique pas d'erreur, mais dans l'inspector du Gamemanager au moment du gameover, je ne vois pas l'objet kaya disparaitre de la liste de l'UnityEvent gameOver. Du coup, je me demande si ça marche bien.

UnityAction, ca ressemble furieusement a un delegate non? Le code me rappel ça même si pour le coup, je ne le comprends pas.

Code : Tout sélectionner

UnityAction myEvent = () => { KayaStop(); };
Bonne journée,

Avatar de l’utilisateur
Max
Messages : 8433
Inscription : 30 Juil 2011 13:57
Contact :

Re: [MY] Comment utiliser RemoveListener depuis un gameObject?

Message par Max » 16 Oct 2021 13:44

Bonjour,
megablast2 a écrit :
16 Oct 2021 09:55
mais c'était plus pour essayer de comprendre comment l'utiliser. Unity ne m'indique pas d'erreur, mais dans l'inspector du Gamemanager au moment du gameover, je ne vois pas l'objet kaya disparaitre de la liste de l'UnityEvent gameOver. Du coup, je me demande si ça marche bien.
Ben je penses que la réponse est donnée dans le lien que tu fournis plus haut:
evereal a écrit :Une expression lambda est une fonction anonyme.
Si tu vx retirer un événement de OnClick, tu dois garder une référence a cette fonction au moment ou tu la crée, ...
Image
Pas d'aide par MP, le forum est là pour ça.
En cas de doute sur les bonnes pratiques à adopter sur le forum, consulter la Charte et sa FAQ

megablast2
Messages : 116
Inscription : 15 Août 2013 16:47

Re: [MY] Comment utiliser RemoveListener depuis un gameObject?

Message par megablast2 » 16 Oct 2021 18:15

Max a écrit :
16 Oct 2021 13:44
Ben je penses que la réponse est donnée dans le lien que tu fournis plus haut:
evereal a écrit :Une expression lambda est une fonction anonyme.
Si tu vx retirer un événement de OnClick, tu dois garder une référence a cette fonction au moment ou tu la crée, ...
Oui mais justement, c'est ce que je comprend pas. Comment je peux garder une réference a cette fonction alors que je l'ajoute depuis l'inspector justement?

Image

Ou alors c'est que je peux créer "UnityAction myEvent = () => { MaFonction(); };" au start et passer myEvent comme une fonction dans l'inspector?(je ne peux pas tester dans l'immédiat).

EDIT : J'ai essayé cette façon de faire mais dans l'inspector, je ne vois pas de changement. C'est normal?

megablast2
Messages : 116
Inscription : 15 Août 2013 16:47

Re: [MY] Comment utiliser RemoveListener depuis un gameObject?

Message par megablast2 » 17 Oct 2021 11:53

Tiens si ça peut servir a quelqu'un :

As far as I know, listeners added from the inspector (called persistent listeners) can't be removed by code except editor code, making builds impossible.
If you want to remove callbacks at runtime, you need to add them by code.
However, you can disable persistent listeners by calling yourEvent.SetPersistentListenerState(persistentListenerIndex, UnityEventCallState.Off). Then, enable the listener again by calling yourEvent.SetPersistentListenerState(persistentListenerIndex, UnityEventCallState.EditorAndRuntime)

Avatar de l’utilisateur
Max
Messages : 8433
Inscription : 30 Juil 2011 13:57
Contact :

Re: [MY] Comment utiliser RemoveListener depuis un gameObject?

Message par Max » 17 Oct 2021 16:05

megablast2 a écrit :
16 Oct 2021 18:15
EDIT : J'ai essayé cette façon de faire mais dans l'inspector, je ne vois pas de changement. C'est normal?
Au niveau de l'inspector, j'ai déjà rencontré ce genre de soucis, où certaines données (comme les events) ne sont pas mises à jour en mode Play, mais cela ne veut pas dire que ce n'est pas fonctionnel ou que les changements ne sont pas effectifs.
Image
Pas d'aide par MP, le forum est là pour ça.
En cas de doute sur les bonnes pratiques à adopter sur le forum, consulter la Charte et sa FAQ

megablast2
Messages : 116
Inscription : 15 Août 2013 16:47

Re: [MY] Comment utiliser RemoveListener depuis un gameObject?

Message par megablast2 » 22 Oct 2021 16:09

Merci de l'info, c'est bon a savoir.

Répondre

Revenir vers « Scripting »