Saltar al contenido

Horrores de OnPointerDown versus OnBeginDrag en Unity3D

Es fundamental comprender el código correctamente antes de adaptarlo a tu trabajo y si tquieres aportar algo puedes compartirlo con nosotros.

Solución:

Quiero empezar diciendo que Input y Touches no son basura. Siguen siendo útiles y fueron la mejor manera de comprobar si touch en dispositivos móviles antes OnPointerDown y OnBeginDrag vino a lo largo. OnMouseDown() puedes llamar basura porque no estaba optimizado para dispositivos móviles. Para principiante quien solo empezado para aprender Unity, Input y Touches son sus opciones.

En cuanto a tu pregunta, OnPointerDown y OnBeginDrag están NO lo mismo. Aunque casi hacen lo mismo, se implementaron para funcionar de diferentes maneras. A continuación, describiré la mayoría de estos:

OnPointerDown: Se llama cuando se presiona / toca en la pantalla (cuando se hace un clic o se presiona el dedo en la pantalla táctil)

OnPointerUp: Se llama cuando se suelta la presión / toque (cuando se suelta el clic o se quita el dedo de la pantalla táctil)

OnBeginDrag: Llamado una vez antes de que se inicie un arrastre (cuando el dedo / mouse se mueve primero tiempo mientras está abajo)

OnDrag : Se llama repetidamente cuando el usuario arrastra en la pantalla (cuando el dedo / mouse se mueve en la pantalla táctil)

OnEndDrag: Se llama cuando se detiene el arrastre (cuando el dedo / mouse no está más extenso moviéndose en la pantalla táctil).

OnPointerDown versus OnBeginDrag y OnEndDrag

OnPointerUp voluntad NO ser llamado si OnPointerDownno ha sido llamado. OnEndDrag voluntad NO ser llamado si OnBeginDragno ha sido llamado. Es como las llaves en C ++, C #, usted abierto eso ‘‘ y tu cerrar eso ‘‘.

LA DIFERENCIA: Se llamará a OnPointerDown una vez y inmediatamente cuando el dedo / mouse está en la pantalla táctil. No ocurrirá nada más hasta que haya un movimiento del mouse o el dedo se mueva en la pantalla y luego OnBeginDrag sera llamado una vez seguido de OnDrag.

Estos están hechos para hacer un uso avanzado como personalizado Interfaz de usuario con controles que no está incluido en Unity.

CUÁNDO USAR CADA UNO:

1. Cuando tienes que implementar un botón de clic simple, por ejemplo, Arriba, Abajo, Botón de disparo en la pantalla, solamente necesitar OnPointerDown para detectar el toque. Esto debería funcionar para Sprite Images.

2. Cuando tienes que implementar un personalizado interruptor de palanca y quieres que sea realista para que el reproductor pueda arrastrar hacia la izquierda / derecha o hacia arriba / abajo para palanca entonces lo necesitas OnPointerDown , OnBeginDrag , OnDrag , OnEndDrag , OnPointerUp. Necesita escribir su código en este orden para tener un liso Transición de Sprite / Textura en la pantalla. Algunos interruptores de palanca están hechos para clickeado y lo hará palanca. Algunas personas prefieren que parezca realista haciéndolo de modo que tenga que arrastrar con el fin de palanca eso.

3. También cuando quieras implementar un genérico reutilizable ventana emergente que se puede arrastrar, también necesita usar esas 5 funciones (OnPointerDown , OnBeginDrag , OnDrag , OnEndDrag , OnPointerUp). Primero detecta cuando hay un clic (OnPointerDown), verifique que el Sprite en el que se hizo clic sea el correcto que desea mover. Espere a que el jugador se mueva (OnBeginDrag) su dedo / ratón. Una vez que comiencen a arrastrar, tal vez pueda llamar a una función de rutina con whilecírculo que comenzará a mover el Sprite y dentro de esa corrutina, puede liso el movimiento del Sprite con Time.deltaTime o cualquier otro método preferido.

Ya que OnBeginDrag se llama una vez, es un buen lugar para comienzo los corrutina. Mientras el jugador continúa arrastrando el Sprite, OnDrag sera llamado repetidamente. Utilizar el OnDrag función para obtener la ubicación actual del buscador y actualizarla a una Vector3 que la corrutina que es ya correr usará para actualizar los posición del Sprite. Cuando el jugador se detiene moviendo su dedo / mouse en la pantalla, OnEndDrag se llama y tu puedes boolean variable y decirle a la corrutina que se detenga actualizacion la posición del Sprite. Entonces, cuando el jugador lanzamientos su dedoOnPointerUp) puede detener la corrutina con la función StopCoroutine.

Porque OnBeginDrag podemos iniciar una co-rutina una vez que se inició el arrastre mientras esperamos que finalice el arrastre. Eso no lo haría hacer sentido para comienzo esa corrutina en OnPointerDown porque eso significa que cada jugador toca la pantalla, una corrutina sería empezado.

Sin OnBeginDrag, tenemos que usar boolean variable para hacer que la corrutina se inicie solo una vez en la OnDrag función que se llama cada vez o, de lo contrario, se ejecutará una rutina en todas partes y se producirá un movimiento inesperado del Sprite.

4. Cuando desee determinar cuánto tiempo movió el dedo el jugador. Ejemplo de esto es ese famoso juego llamado Fruta Ninja. Digamos que desea determinar hasta dónde pasó el jugador en la pantalla.

Primero, Espere Hasta que OnPointerDown se llama, Espere otra vez hasta OnBeginDrag se llama, entonces puede obtener el Actual posición del dedo en el interior OnBeginDrag función porque OnBeginDrag se llama antes de que el dedo comience a moverse. Después de soltar el dedo, OnEndDrag se llama. Entonces puede volver a obtener la posición actual del dedo. Puedes usar estos dosposiciones para comprobar qué tan lejos se movió el dedo restando ellos.

Si en cambio decides usar OnPointerDown como el lugar para conseguir el primeroposición del dedo, obtendrás un incorrecto resultado porque si el jugador desliza el dedo hacia la derecha, luego murga y desliza hacia la izquierda luego murga de nuevo y muévase hacia arribasin soltar el dedo después cada deslizar, el único bien El resultado que tienes es el primer golpe(deslizar hacia la derecha). los izquierda y el hasta deslizar tendrá inválido valores porque ese primer valor que obtuviste cuando OnPointerDown era llamado es el valor que eres todavía utilizando. Esto se debe a que el jugador nunca quitó el dedo de la pantalla, por lo que por lo tanto, OnPointerDown es Nunca llamado de nuevo y el primer viejo valor antiguo todavía está ahí.

Pero cuando usas OnBeginDrag en lugar de OnPointerDown, este problema será desaparecido porque cuando el dedo deja de moverse, OnEndDrag se llama y cuando comienza a moverse de nuevo OnBeginDrag se llama una vez más provocando la primera posición ser sobrescrito con el uno nuevo.

La diferencia es que OnBeginDrag no se llama hasta que el toque / mouse se ha movido una cierta distancia mínima, el umbral de arrastre. Puede establecer el umbral de arrastre en el componente Sistema de eventos.

Esto es necesario cuando tiene una jerarquía de objetos con diferentes formas de manejar la entrada, especialmente las vistas de desplazamiento. Imagine que tiene una vista de desplazamiento con una pila vertical de celdas, cada una con un botón. Cuando el toque comienza por primera vez en uno de los botones, no sabemos si el usuario está tocando un botón o arrastrando la vista de desplazamiento. No es hasta que el toque se arrastra por el umbral de arrastre que sabemos que es un arrastre y no un toque.

Calificaciones y comentarios

Ten en cuenta difundir esta crónica si te fue útil.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *