0
votes

Comment savoir quel bouton a été cliqué? (Unity / Hololens2 / MRTK)

J'ai environ 10 boutons avec chaque bouton une valeur unique ajoutée via Script. Je veux savoir quel bouton a été cliqué lorsque vous interagissez avec les boutons à l'aide des mains de MRTK.

J'ai essayé d'ajouter une méthode Updatefield sur le bouton qui obtient l'objet actuellement sélectionné à l'aide du système d'événements par défaut. Cependant, lorsque je débogé, la valeur est NULL. P>

public void UpdateField()
{
      int dayNumb = EventSystem.current.currentSelectedGameObject.GetComponent<DayButton>().CurrentNumber();
}


1 commentaires

Basé sur Documentation Vous pouvez vous abonner aux événements de bouton tels que dans le bouton UGUI par défaut. Ou utilisez des événements de fonctionnalité interactive .


3 Réponses :


2
votes

Concernant l'exception

public class SomeListener : MonoBehaviour
{
    privtae void Awake()
    {
        // Add a listener to the global event
        DayButton.OnButtonClicked += HandleOnButtonClicked;
    }

    private void OnDestroy()
    {
        // Make sure to always remove listeners once not needed anymore
        // otherwise you get NullReferenceExceptions!
        DayButton.OnButtonClicked -= HandleOnButtonClicked;
    }

    // By passing the according DayButton reference in you have access
    // to all its public fields and methods
    private void HandleOnButtonClicked(DayButton button)
    {
        Debug.Log("The Button with the name {button.name} and number {button.CurrentNumber} was clicked!", this);
    }
}


0 commentaires

2
votes

Le code suivant imprimera le nom de chaque bouton cliqué sur la scène. Notez que au lieu d'ajouter les auditeurs d'événements au démarrage, vous pouvez simplement ajouter ces auditeurs lorsque vous créez vos boutons à partir du code.

using Microsoft.MixedReality.Toolkit.UI;
using UnityEngine;

/// <summary>
/// On startup, adds event handlers for every Interactable aka button
/// in the scene that logs the name of the button pressed.
/// You can similarly add such a listener when adding the buttons dynamically
/// </summary>
public class PrintWhichButtonPressed : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        var allInteractables = GameObject.FindObjectsOfType<Interactable>();
        foreach (var i in allInteractables)
        {
            i.OnClick.AddListener(() => Debug.Log(Time.time + ": " + i.gameObject.name + " was clicked"));
        }
    }
}


2 commentaires

Merci @julia Schwarz Vos solutions fonctionnent bien.


Une idée de la manière que je puisse stocker la chaîne de sortie comme "Button1 a été cliquée" dans une variable? Ce que j'essaie de faire, c'est essayer d'obtenir les composants du bouton qui a été cliqué. Comme si c'est une touche1, alors (gameObject.find ("Button1"). GetComponent (). Curren Thumber (););



1
votes

résolu !! J'ai ajouté un auditeur sur chaque bouton de la méthode de début. Puis appelé la fonction pour obtenir les composants de ces objets.

Voici comment je l'ai fait ............ p>

using UnityEngine.UI;
using UnityEngine.EventSystems;
using UnityEditor;
using Microsoft.MixedReality.Toolkit.UI;

public class UpdateInputField : MonoBehaviour {
    public InputField mainInputField;
    private Calendar calendar;
    private GameObject dateCanvas;
    public int dayNumb;

    void Start(){
        var allInteractables = GameObject.FindObjectsOfType<Interactable>();
        foreach (var i in allInteractables)
        {
            i.OnClick.AddListener(() => UpdateField(i));
        }
    }

    public void UpdateField(Microsoft.MixedReality.Toolkit.UI.Interactable index)
    {
        dayNumb = GameObject.Find(index.gameObject.name).GetComponent<DayButton>().CurrentNumber();
        calendar = GameObject.FindObjectOfType<Calendar>();
        mainInputField.text = calendar.ReturnDate(dayNumb);     
    }
}


0 commentaires