Cómo detectar eventos de clic / toque en UI y GameObjects

¿Cómo detectar el objeto UI en Canvas on Touch en android?

Por ejemplo, tengo un canvas que tiene 5 objetos como Image , Image RawImage , Buttons , InputField , etc.

Cuando toco el objeto UI del botón, entonces hago algo. Cada botón realiza un proceso diferente cuando se hace clic en él.

El código se verá así:

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

Así que ¿cómo se hace?

Segundo: ¿Cómo detectar Gameobject get touch? ¿Es lo mismo con eso de arriba o no?

No utiliza la API de entrada para la nueva interfaz de usuario. Se suscribe a eventos de interfaz de usuario o implementa interfaz según el evento.

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

1 . Image , RawImage y componentes de Text :

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

 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 . Componente de Button :

Utiliza eventos para registrarse en Clics de 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 diferente a un clic de botón en el botón, entonces use el método 1. Por ejemplo, botón abajo y no clic de botón, use IPointerDownHandler y su función OnPointerDown del método 1.

3 . Componente InputField :

Utiliza eventos para registrarse y 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 . Componente de Slider :

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 el Método 1 .

5 . Componente Dropdown

 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 NO UI:

6. Para objetos 3D (Mesh Renderer / any 3D Collider)

Agregue PhysicsRaycaster a la cámara y luego use cualquiera de los eventos del Método 1 .

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

 public class MeshDetector : MonoBehaviour, IPointerDownHandler { void Start() { addPhysicsRaycaster(); } void addPhysicsRaycaster() { PhysicsRaycaster physicsRaycaster = GameObject.FindObjectOfType(); if (physicsRaycaster == null) { Camera.main.gameObject.AddComponent(); } } public void OnPointerDown(PointerEventData eventData) { Debug.Log("Clicked: " + eventData.pointerCurrentRaycast.gameObject.name); } //Implement Other Events from Method 1 } 

7. Para objetos 2D (Representador de Sprite / cualquier Colisionador 2D)

Agregue Physics2DRaycaster a la Cámara y luego use cualquiera de los eventos del Método 1 .

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

 public class SpriteDetector : MonoBehaviour, IPointerDownHandler { void Start() { addPhysics2DRaycaster(); } void addPhysics2DRaycaster() { Physics2DRaycaster physicsRaycaster = GameObject.FindObjectOfType(); if (physicsRaycaster == null) { Camera.main.gameObject.AddComponent(); } } public void OnPointerDown(PointerEventData eventData) { Debug.Log("Clicked: " + eventData.pointerCurrentRaycast.gameObject.name); } //Implement Other Events from Method 1 } 

Solución de problemas de EventSystem:

No se detectaron clics en UI, objetos 2D (Sprite Renderer / cualquier 2D Collider) y objetos 3D (Mesh Renderer / any 3D Collider):

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


Ir a GameObject —> UI —> 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 debajo de un Canvas . Significa que un Canvas debe ser el padre del componente UI. Sin esto, EventSystem no funcionará y los clics no se detectarán.

Esto solo se aplica a los objetos UI. No se aplica a 2D (Sprite Renderer / cualquier 2D Collider) u Objetos 3D (Mesh Renderer / any 3D Collider).


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


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


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


F. También, si se trata de un objeto UI que desea detectar clics, asegúrese de que ningún otro objeto UI esté delante de él. Si hay otra interfaz de usuario delante de la que desea detectar, haga clic en, se bloqueará ese clic.

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

Puede agregar un EventTrigger Componenet a los elementos de su UI que ya tienen estos Events , solo tiene que pasar el method/Function en un evento específico.

También puedes usar OnMouseDown. Se llama a OnMouseDown cuando el usuario ha presionado el botón del mouse sobre el GUIElement o Collider. Este evento se envía a todos los scripts del Collider o GUIElement.

 using UnityEngine; using System.Collections; public class ExampleClass : MonoBehaviour { void OnMouseDown() { Application.LoadLevel("SomeLevel"); } }