Saltar al contenido

Cómo detectar eventos de clic / toque en la interfaz de usuario y GameObjects

Solución:

No usa la API de entrada para la nueva interfaz de usuario. Te suscribes a los eventos de la interfaz de usuario o implementas la interfaz según el evento.

Estas son las formas adecuadas de detectar eventos en los nuevos componentes de la interfaz de usuario:

1.Image, RawImage y Text Componentes:

Implemente la interfaz necesaria y anule su función. El siguiente ejemplo implementa los eventos más utilizados.

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 Componente:

Utiliza eventos para registrarse en los clics del botón:

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 está detectando algo que no sea un clic de botón en el botón, utilice el método 1. Por ejemplo, botón hacia abajo y no clic de botón, utilice IPointerDownHandler y es OnPointerDown función del método 1.

3.InputField Componente:

Utiliza eventos para registrarse para registrarse para el envío de InputField:

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 Componente:

Para detectar cuándo cambia el valor del control deslizante durante el arrastre:

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); });
}

Para otros eventos, use Método 1.

5.Dropdown Componente

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)
{

}

OBJETOS QUE NO SON DE IU:

6.Para objetos 3D (renderizador de malla / cualquier colisionador 3D)

Agregar PhysicsRaycaster a la cámara luego utilizar cualquiera de los eventos del Método 1.

El siguiente código agregará automáticamente PhysicsRaycaster a la principal Camera.

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.Para objeto 2D (Sprite Renderer / cualquier 2D Collider)

Agregar Physics2DRaycaster a la cámara luego utilizar cualquiera de los eventos del Método 1.

El siguiente código agregará automáticamente Physics2DRaycaster a la principal Camera.

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
}

Solución de problemas del sistema de eventos:

No se detectaron clics en la interfaz de usuario, objetos 2D (Sprite Renderer / cualquier 2D Collider) y objetos 3D (Mesh Renderer / cualquier 3D Collider):

A.Compruebe que tiene EventSystem. Sin EventSystem no puede detectar clics en absoluto. Si no lo tiene, créelo usted mismo.


Ir a GameObject —> Interfaz de usuario —> Sistema de eventos. Esto creará un EventSystem si aún no existe. Si ya existe, Unity simplemente lo ignorará.


B.El componente UI o GameObject con el componente UI debe estar bajo un Canvas. Significa que un Canvas debe ser el padre del componente de la interfaz de usuario. Sin esto, EventSystem no funcionará y no se detectarán los clics.

Esto solo se aplica a los objetos de la interfaz de usuario. Eso no aplicar a 2D (Sprite Renderer / cualquier 2D Collider) u objetos 3D (Mesh Renderer / cualquier 3D Collider).


C.Si se trata de un objeto 3D, PhysicsRaycaster no está conectado a la cámara. Asegúrate de eso PhysicsRaycaster está conectado a la cámara. Ver # 6 arriba para obtener más información.


D.Si se trata de un objeto 2D, Physics2DRaycaster no está conectado a la cámara. Asegúrate de eso Physics2DRaycaster está conectado a la cámara. Ver # 7 arriba para obtener más información.


mi.Si se trata de un objeto de la interfaz de usuario que desea detectar clics con las funciones de la interfaz como OnBeginDrag, OnPointerClick, OnPointerEnter y otras funciones mencionadas en # 1 luego el script con el código de detección debe adjuntarse a ese objeto de interfaz de usuario desea detectar haga clic en.


FAdemás, si se trata de un objeto de interfaz de usuario en el que desea detectar clics, asegúrese de que no haya ningún otro objeto de interfaz de usuario frente a él. Si hay otra interfaz de usuario frente a la que desea detectar, bloqueará ese clic.

Para verificar que este no es el problema, deshabilite todos los objetos debajo del lienzo, excepto el que desea detectar, haga clic en y luego vea si el clic funciona.

Puede agregar un EventTrigger Componenet a los elementos de su interfaz de usuario que ya tienen estos Events solo tienes que pasar method/Function en un evento específico.

También puede usar OnMouseDown. Se llama a OnMouseDown cuando el usuario ha presionado el botón del mouse mientras estaba sobre GUIElement o Collider. Este evento se envía a todos los scripts de Collider o 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

    }
}
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *