Utilizo los siguientes códigos para detectar qué elemento de la interfaz de usuario está señalando el jugador. Funciona bien en Unity Editor, en uno de mis teléfonos Android, pero falló en un segundo teléfono Android.
public static T RaycastOnFirstPointed<T>(EventSystem eventSystem, GraphicRaycaster raycaster) { if (Application.platform == RuntimePlatform.Android || Application.platform == RuntimePlatform.IPhonePlayer) { if (Input.touches == null || Input.touches.Length == 0) return default; } var m_PointerEventData = new PointerEventData(eventSystem); m_PointerEventData.position = Input.mousePosition; var results = new List<RaycastResult>(); raycaster.Raycast(m_PointerEventData, results); // On the 2nd phone the results.length is 0 foreach (RaycastResult result in results) { var component = result.gameObject.GetComponent<T>(); if (component != null) { return component; } } return default; } Este método se llama dentro de un método IEndDragHandler.OnEndDrag . Traté de depurarlo en el segundo teléfono Android y vi los results.length La longitud es 0 después de que se ejecutó Raycast (debería ser> 0 ya que terminé de arrastrar varios elementos de la interfaz de usuario superpuestos, y es> 0 en el primer teléfono) , no estoy seguro de por qué el segundo teléfono es diferente)
No tengo ni idea de a dónde debo ir desde aquí para encontrar el problema. Por favor, muéstrame algunas direcciones, ¡gracias!
Más información: Teléfono 1: MI 8 Lite, SO: MIUI 10.3 Teléfono 2: MI 9, SO: MIUI 10.2.35
============Actualización===========
Razón encontrada: cuando se activa IEndDragHandler.OnEndDrag , Input.mousePosition tiene un valor diferente en los dos dispositivos. El primer teléfono tiene la posición táctil del último cuadro, mientras que el segundo teléfono parece borrar ese valor y tiene un valor incorrecto muy grande. Estoy trabajando en cómo resolver esto de una manera adecuada. Cualquier sugerencia es bienvenida.
Problema resuelto. Como actualicé en la pregunta, este problema se debe a un valor incorrecto de Input.mousePosition en diferentes dispositivos. Así que actualicé el método RaycastOnFirstPointed de la siguiente manera:
public static T RaycastOnFirstPointed<T>(EventSystem eventSystem, GraphicRaycaster raycaster, PointerEventData eventData = null) { if (Application.platform == RuntimePlatform.Android || Application.platform == RuntimePlatform.IPhonePlayer) { if (Input.touches == null || Input.touches.Length == 0) return default; } var m_PointerEventData = new PointerEventData(eventSystem); if (eventData == null) { m_PointerEventData.position = Input.mousePosition; } else { m_PointerEventData.position = eventData.position; } var results = new List<RaycastResult>(); raycaster.Raycast(m_PointerEventData, results); foreach (RaycastResult result in results) { var component = result.gameObject.GetComponent<T>(); if (component != null) { return component; } } return default; } Cuando llame a este método dentro de OnEndDrag , pase el PointerEventData que proporciona la unidad y use su posición.