[Débutant] Problème avec OnSelect

Questions à propos du GUI, y compris la partie script.
Jayme65
Messages : 47
Inscription : 31 Jan 2017 00:43

[Débutant] Problème avec OnSelect

Message par Jayme65 » 21 Déc 2017 19:06

Bonjour,

Je voudrais pouvoir récupérer tous les boutons présents dans les enfants d'un gameobject...et pouvoir ensuite, par le code, leur ajouter un handler pour 'OnSelect'

Comment dois-je m'y prendre svp? Pour un événement 'onClick' je peux avoir un:
btn.onClick.AddListener(updateScrollView);
...mais manifestement ce n'est pas la même chose pour un 'OnSelect' ! ;)

Merci pour votre aide!

Code : Tout sélectionner

void Start () {
        Button[] buttons = this.GetComponentsInChildren<Button>();
        foreach (Button btn in buttons)
        {
            btn.onClick.AddListener(updateScrollView);
            // ...mais quoi faire pour un OnSelect?
        }
}

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

Re: [Débutant] Problème avec OnSelect

Message par boubouk50 » 22 Déc 2017 10:51

OnClick () est une propriété de type UnityEvent alors que OnSelect () est une méthode qui hérite de l'EventSystem (iHandler). Le AddListener ne fonctionnera donc pas sur cette méthode. Ce l'EventSystem qui le gère.
Tu es sensé utiliser la fonction telle quelle dans un script sur le bouton:

Code : Tout sélectionner

 public class YourClassName : MonoBehaviour, ISelectHandler
 {
 …
	public void OnSelect(BaseEventData eventData)
	{
		Debug.Log("test");
	}
}
Aussi, tu peux récupérer le gameObject sélectionné à partir de EventSystem.currentSelectedGameObject.

Peut-être la solution existe mais je ne la connais/vois pas.

Par curiosité,que veux-tu faire avec ce Handler?
"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

Jayme65
Messages : 47
Inscription : 31 Jan 2017 00:43

Re: [Débutant] Problème avec OnSelect

Message par Jayme65 » 22 Déc 2017 14:57

Merci pour ta réponse Boubouk!
Par curiosité,que veux-tu faire avec ce Handler?
En fait, vois tu, j'ai des panels pour les settings.
Ces panels comportent beaucoup de boutons et sont donc inscrits dans un scrollview.
Image
On doit pouvoir naviguer au clavier (curseurs) dans les panels et je veux donc qu'il y ait un scroll automatique quand on se déplace dans la liste des boutons.
J'aurais voulu que cela se fasse au niveau du ScrollView lui-même de façon à ce que je puisse insérer des boutons (il y en a vraiment beaucoup..et différents) à volonté sans me soucier de rien et que leur OnSelect() soit fixé au démarrage!

J'ai trouvé comment assigner l'EventTrigger par script et cela donne jusqu'à présent (et qui fonctionne):

Code : Tout sélectionner

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
using DG.Tweening;

public class Panel_ScrollView : MonoBehaviour
{
    private ScrollRect m_scrollRect;

    void Start () {
        Button[] buttons = this.GetComponentsInChildren<Button>();
        m_scrollRect = GetComponent<ScrollRect>();

        foreach (Button btn in buttons)
        {
            EventTrigger.Entry onEntry = new EventTrigger.Entry();
            onEntry.eventID = EventTriggerType.UpdateSelected;
            onEntry.callback.RemoveAllListeners();
            onEntry.callback.AddListener((eventData) => { updateScrollView(btn); });
            btn.gameObject.AddComponent<EventTrigger>().triggers.Add(onEntry);
        }
    }

    private void updateScrollView(Button btn)
    {
        // A terminer, ici les valeurs max et min sont codées en dur
        m_scrollRect.verticalNormalizedPosition =  Remap((btn.transform.parent.localPosition.y + btn.transform.localPosition.y) * -1, 46, 1134, 1, 0);
    }
    private float Remap(float value, float from1, float to1, float from2, float to2)
    {
        return (value - from1) / (to1 - from1) * (to2 - from2) + from2;
    }
}
A attacher donc à un ScrollView (qui dans mon cas - pour comprendre le code - contient un panel, lui-même contenant des boutons regroupés..en groupe ;) )

Toute réflexion/idée/critique est la bienvenue! ;)

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

Re: [Débutant] Problème avec OnSelect

Message par boubouk50 » 22 Déc 2017 15:46

Pour le coup, si tu dois ajouter un Listener à tous tes boutons sur le OnSelect tu peux tout aussi bien leur ajouter un Component qui utilise OnSelect (), plutôt non?
"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 « L'interface GUI »