No usa la API de entrada para la nueva interfaz de usuario. Te suscribes a los eventos de IU 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()
{
button1.onClick.AddListener(() => buttonCallBack(button1));
button2.onClick.AddListener(() => buttonCallBack(button2));
button3.onClick.AddListener(() => buttonCallBack(button3));
}
private void buttonCallBack(Button buttonPressed)
{
if (buttonPressed == button1)
{
Debug.Log("Clicked: " + button1.name);
}
if (buttonPressed == button2)
{
Debug.Log("Clicked: " + button2.name);
}
if (buttonPressed == button3)
{
Debug.Log("Clicked: " + button3.name);
}
}
void OnDisable()
{
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 su 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()
{
inputField.onEndEdit.AddListener(delegate { inputEndEdit(); });
inputField.onValueChanged.AddListener(delegate { inputValueChanged(); });
}
private void inputEndEdit()
{
Debug.Log("Input Submitted");
}
private void inputValueChanged()
{
Debug.Log("Input Changed");
}
void OnDisable()
{
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()
{
slider.onValueChanged.AddListener(delegate { sliderCallBack(slider.value); });
}
void sliderCallBack(float value)
{
Debug.Log("Slider Changed: " + value);
}
void OnDisable()
{
slider.onValueChanged.RemoveListener(delegate { sliderCallBack(slider.value); });
}
Para otros eventos, use el Método 1 .
5 . Dropdown
Componente
public Dropdown dropdown;
void OnEnable()
{
dropdown.onValueChanged.AddListener(delegate { callBack(); });
dropdown.onValueChanged.AddListener(callBackWithParameter);
}
void OnDisable()
{
dropdown.onValueChanged.RemoveAllListeners();
}
void callBack()
{
}
void callBackWithParameter(int value)
{
}
OBJETOS QUE NO SON UI:
6 .Para objetos 3D (renderizador de malla / cualquier colisionador 3D)
Agregue PhysicsRaycaster
a la cámara y luego use cualquiera de los eventos del Método 1 .
El siguiente código se agregará automáticamente al archivo PhysicsRaycaster
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);
}
}
7 .Para objetos 2D (Sprite Renderer / cualquier 2D Collider)
Agregue Physics2DRaycaster
a la cámara y luego use cualquiera de los eventos del Método 1 .
El siguiente código se agregará automáticamente al archivo Physics2DRaycaster
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);
}
}
Solución de problemas del EventSystem:
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.
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 bajo unCanvas
. Significa que unCanvas
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. No se aplica a 2D (Sprite Renderer / cualquier 2D Collider) ni a Objetos 3D (Mesh Renderer / cualquier 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. Consulte el n. ° 6 anterior para obtener 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. Consulte el n. ° 7 anterior para obtener más información.
E. Si se trata de un objeto de interfaz de usuario que desea detectar clics con las funciones de la interfaz OnBeginDrag
,OnPointerClick
, OnPointerEnter
y otras funciones previstas en el # 1 a continuación el script con el código de detección debe adjuntar a ese objeto de interfaz de usuario que desea detectar haga clic en.
F .Ademá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 hacer clic funciona.