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