web-dev-qa-db-fra.com

Comment détecter les événements de clic / toucher sur les interfaces utilisateur et GameObjects

Comment détecter un objet d'interface utilisateur sur Canvas on Touch sous Android?

Par exemple, j'ai un canevas avec 5 objets tels que Image, RawImage, Buttons, InputField et ainsi de suite.

Lorsque je touche l'objet Bouton d'interface utilisateur, puis fait quelque chose. Chaque bouton effectue un processus différent lorsque vous cliquez dessus en fonction.

Le code ressemblera à ceci:

private void Update()
{
    if (Input.touches.Length <= 0) return;

    for (int i = 0; i < Input.touchCount; i++)
    {
        if (Button1.touch)
            if (Input.GetTouch(i).phase == TouchPhase.Began)
                login();
        else if (Button2.touch && Input.GetTouch(i).phase == TouchPhase.Began)
            LogOut();
    }
}

Alors comment le faire?

Deuxièmement: Comment détecter Gameobject get touch? Est-ce la même chose que ci-dessus ou non?

52
Dennis Liu

Vous n'utilisez pas l'API d'entrée pour la nouvelle interface utilisateur. Vous vous abonnez à des événements d'interface utilisateur ou implémentez une interface en fonction de l'événement.

Voici les moyens appropriés pour détecter les événements sur les nouveaux composants de l'interface utilisateur:

1 . Image , RawImage et Text Composants:

Implémentez l'interface requise et annulez sa fonction. L'exemple ci-dessous implémente les événements les plus utilisés.

using UnityEngine.EventSystems;

public class ClickDetector : MonoBehaviour, IPointerDownHandler, IPointerClickHandler,
    IPointerUpHandler, IPointerExitHandler, IPointerEnterHandler,
    IBeginDragHandler, IDragHandler, IEndDragHandler
{
    public void OnBeginDrag(PointerEventData eventData)
    {
        Debug.Log("Drag Begin");
    }

    public void OnDrag(PointerEventData eventData)
    {
        Debug.Log("Dragging");
    }

    public void OnEndDrag(PointerEventData eventData)
    {
        Debug.Log("Drag Ended");
    }

    public void OnPointerClick(PointerEventData eventData)
    {
        Debug.Log("Clicked: " + eventData.pointerCurrentRaycast.gameObject.name);
    }

    public void OnPointerDown(PointerEventData eventData)
    {
        Debug.Log("Mouse Down: " + eventData.pointerCurrentRaycast.gameObject.name);
    }

    public void OnPointerEnter(PointerEventData eventData)
    {
        Debug.Log("Mouse Enter");
    }

    public void OnPointerExit(PointerEventData eventData)
    {
        Debug.Log("Mouse Exit");
    }

    public void OnPointerUp(PointerEventData eventData)
    {
        Debug.Log("Mouse Up");
    }
}

2 . Button Composant:

Vous utilisez des événements pour vous inscrire à des clics de bouton:

public class ButtonClickDetector : MonoBehaviour
{
    public Button button1;
    public Button button2;
    public Button button3;

    void OnEnable()
    {
        //Register Button Events
        button1.onClick.AddListener(() => buttonCallBack(button1));
        button2.onClick.AddListener(() => buttonCallBack(button2));
        button3.onClick.AddListener(() => buttonCallBack(button3));

    }

    private void buttonCallBack(Button buttonPressed)
    {
        if (buttonPressed == button1)
        {
            //Your code for button 1
            Debug.Log("Clicked: " + button1.name);
        }

        if (buttonPressed == button2)
        {
            //Your code for button 2
            Debug.Log("Clicked: " + button2.name);
        }

        if (buttonPressed == button3)
        {
            //Your code for button 3
            Debug.Log("Clicked: " + button3.name);
        }
    }

    void OnDisable()
    {
        //Un-Register Button Events
        button1.onClick.RemoveAllListeners();
        button2.onClick.RemoveAllListeners();
        button3.onClick.RemoveAllListeners();
    }
}

Si vous détectez autre chose que Button Click sur le bouton puis utilisez la méthode 1. Par exemple, Button bas et non Button Click, utilisez IPointerDownHandler et sa fonction OnPointerDown de la méthode 1.

3 . InputField Composant:

Vous utilisez des événements pour vous inscrire afin de vous inscrire à InputField submit:

public InputField inputField;

void OnEnable()
{
    //Register InputField Events
    inputField.onEndEdit.AddListener(delegate { inputEndEdit(); });
    inputField.onValueChanged.AddListener(delegate { inputValueChanged(); });
}

//Called when Input is submitted
private void inputEndEdit()
{
    Debug.Log("Input Submitted");
}

//Called when Input changes
private void inputValueChanged()
{
    Debug.Log("Input Changed");
}

void OnDisable()
{
    //Un-Register InputField Events
    inputField.onEndEdit.RemoveAllListeners();
    inputField.onValueChanged.RemoveAllListeners();
}

4 . Slider Composant:

Pour détecter quand la valeur du curseur change pendant le glissement:

public Slider slider;

void OnEnable()
{
    //Subscribe to the Slider Click event
    slider.onValueChanged.AddListener(delegate { sliderCallBack(slider.value); });
}

//Will be called when Slider changes
void sliderCallBack(float value)
{
    Debug.Log("Slider Changed: " + value);
}

void OnDisable()
{
    //Un-Subscribe To Slider Event
    slider.onValueChanged.RemoveListener(delegate { sliderCallBack(slider.value); });
}

Pour les autres événements, utilisez Méthode 1 .

5 . Dropdown Composant

public Dropdown dropdown;
void OnEnable()
{
    //Register to onValueChanged Events

    //Callback with parameter
    dropdown.onValueChanged.AddListener(delegate { callBack(); });

    //Callback without parameter
    dropdown.onValueChanged.AddListener(callBackWithParameter);
}

void OnDisable()
{
    //Un-Register from onValueChanged Events
    dropdown.onValueChanged.RemoveAllListeners();
}

void callBack()
{

}

void callBackWithParameter(int value)
{

}

OBJETS NON-UI:

6 . Pour un objet 3D (rendu de maillage/tout collisionneur 3D)

Ajoutez PhysicsRaycaster à la caméra, puis utilisez l’un des événements de la méthode 1 .

Le code ci-dessous ajoutera automatiquement PhysicsRaycaster au Camera principal.

public class MeshDetector : MonoBehaviour, IPointerDownHandler
{
    void Start()
    {
        addPhysicsRaycaster();
    }

    void addPhysicsRaycaster()
    {
        PhysicsRaycaster physicsRaycaster = GameObject.FindObjectOfType<PhysicsRaycaster>();
        if (physicsRaycaster == null)
        {
            Camera.main.gameObject.AddComponent<PhysicsRaycaster>();
        }
    }

    public void OnPointerDown(PointerEventData eventData)
    {
        Debug.Log("Clicked: " + eventData.pointerCurrentRaycast.gameObject.name);
    }

    //Implement Other Events from Method 1
}

7 . Pour un objet 2D (Sprite Renderer/Collider 2D).

Ajoutez Physics2DRaycaster à la caméra, puis utilisez l’un des événements de la méthode 1 .

Le code ci-dessous ajoutera automatiquement Physics2DRaycaster au Camera principal.

public class SpriteDetector : MonoBehaviour, IPointerDownHandler
{
    void Start()
    {
        addPhysics2DRaycaster();
    }

    void addPhysics2DRaycaster()
    {
        Physics2DRaycaster physicsRaycaster = GameObject.FindObjectOfType<Physics2DRaycaster>();
        if (physicsRaycaster == null)
        {
            Camera.main.gameObject.AddComponent<Physics2DRaycaster>();
        }
    }

    public void OnPointerDown(PointerEventData eventData)
    {
        Debug.Log("Clicked: " + eventData.pointerCurrentRaycast.gameObject.name);
    }

    //Implement Other Events from Method 1
}

Dépannage du système d'événements:

Aucun clic n'a été détecté sur l'interface utilisateur, les objets 2D (Sprite Renderer/Collider 2D) et les objets 3D (Maillage Renderer/Any Collider 3D):

A. Vérifiez que vous avez EventSystem. Sans EventSystem, il ne peut pas détecter les clics du tout. Si vous ne l'avez pas, créez-le vous-même.


Aller à GameObject ---> UI ---> Système d'événements . Cela créera un EventSystem s'il n'existe pas encore. S'il existe déjà, Unity l'ignorera.


B. Le composant d'interface utilisateur ou le GameObject avec le composant d'interface utilisateur doit être placé sous un Canvas. Cela signifie qu'un Canvas doit être le parent du composant d'interface utilisateur. Sans cela, EventSystem ne fonctionnera pas et les clics ne seront pas détectés.

Ceci ne s'applique qu'aux objets d'interface utilisateur. ( ne s'applique pas aux objets 2D (Sprite Renderer/Collider 2D) ou 3D (Mesh Renderer/Any Collider 3D).


C. S'il s'agit d'un objet 3D, PhysicsRaycaster n'est pas attaché à la caméra. Assurez-vous que PhysicsRaycaster est attaché à la caméra. Voir # 6 ci-dessus pour plus d'informations.


D. S'il s'agit d'un objet 2D, Physics2DRaycaster n'est pas attaché à la caméra. Assurez-vous que Physics2DRaycaster est connecté à l'appareil photo. Voir # 7 ci-dessus pour plus d'informations.


E. S'il s'agit d'un objet de l'interface utilisateur sur lequel vous souhaitez détecter les clics avec les fonctions d'interface telles que OnBeginDrag, OnPointerClick, OnPointerEnter et les autres fonctions mentionnées dans # 1 puis le script avec le code de détection doit être associé à l'objet UI que vous souhaitez détecter. cliquer sur.


F. En outre, s'il s'agit d'un objet d'interface utilisateur sur lequel vous souhaitez détecter les clics, assurez-vous qu'aucun autre objet d'interface utilisateur ne se trouve devant lui. S'il y a une autre interface utilisateur en face de celle sur laquelle vous voulez détecter un clic, celui-ci sera bloqué.

Pour vérifier que ce n'est pas le problème, désactivez tous les objets du canevas, à l'exception de celui que vous souhaitez détecter, puis cliquez pour vérifier si le fait de cliquer dessus fonctionne.

107
Programmer

Vous pouvez également utiliser OnMouseDown. OnMouseDown est appelé lorsque l'utilisateur a appuyé sur le bouton de la souris alors qu'il survolait GUIElement ou Collider. Cet événement est envoyé à tous les scripts du collisionneur ou GUIElement.

using UnityEngine;
using System.Collections;
using UnityEngine.SceneManagement; // The new load level needs this

public class ExampleClass : MonoBehaviour
{
    void OnMouseDown()
    {
        // Edit:
        // Application.LoadLevel("SomeLevel");
        // Application.LoadLevel() is depreciating but still works

         SceneManager.LoadScene("SomeLevel"); // The new way to load levels

    }
}
5
Jeffrey Lanters

Vous pouvez ajouter un composant EventTrigger à vos éléments d'interface utilisateur qui possèdent déjà ces éléments Events il vous suffit de passer method/Function sur un événement spécifique.

4
waqas ali