unity tutoriales tutorial scripts para español descargar c# unity3d

tutoriales - unity c# tutorial español



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

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

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

Cuando toco el objeto de la IU del botón, entonces hago algo. Cada botón hace un proceso diferente cuando se hace clic dependiendo.

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 lo anterior o no?


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

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

1) Componentes de Image , Image RawImage y Text :

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) Componente del 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 que no sea Botón, haga clic en el Botón y luego use el método 1. Por ejemplo, Botón abajo y no Botón, use IPointerDownHandler y su función OnPointerDown del método 1.

3) Componente InputField :

Utiliza eventos para registrarse para registrarse en 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) Componente 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<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 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<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 IU, objetos 2D (Sprite Renderer / any 2D Collider) y 3D Objects (Mesh Renderer / any 3D Collider):

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

Vaya a GameObject ---> UI ---> Event System . 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 no se detectarán los clics.

Esto solo se aplica a los objetos de la interfaz de usuario. No se aplica a objetos 2D (Sprite Renderer / any 2D Collider) u 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 en el que desea detectar clics con las funciones de interfaz como OnBeginDrag , OnPointerClick , OnPointerEnter y otras funciones mencionadas en el n . ° 1, entonces el script con el código de detección debe adjuntarse al objeto de interfaz de usuario que desea detectar haga clic en.

F. Además, si este es un Objeto UI en el que desea detectar clics, asegúrese de que no haya otro Objeto UI frente a él. Si hay otra interfaz de usuario frente a la que desea detectar, haga clic en, 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 y luego vea si funciona.


Puede agregar un componente EventTrigger a sus elementos de la interfaz de usuario 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 mientras está sobre GUIElement o Collider. Este evento se envía a todos los scripts del 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 } }