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 OnPointerDown
no ha sido llamado. OnEndDrag
voluntad NO ser llamado si OnBeginDrag
no 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 while
cí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.