En la unidad, tengo una raqueta que se supone golpea una pelota, y la raqueta es controlada directamente por el mouse, es decir, el mouse que usa los ejes del mouse y la función transform.translate() para mover la raqueta.Problema con la detección de colisión de una bola que se mueve rápidamente con una raqueta controlada por mouse
Esperaba que la física de Unity3d no tradujera correctamente el movimiento de la raqueta directamente con el mouse e impactara la pelota en consecuencia, y tendría que escribir algo personalizado, y resultó ser cierto.
Pero la colisión de la bola no se detecta correctamente cuando la raqueta se está moviendo. Cuando está quieto, todo está bien, y la pelota se comporta como me gusta.
Ahora llegué a escribir una secuencia de comandos de física personalizada (uso C# para secuencias de comandos) en la que adjunté 4 rayos de longitud 0.6F a la bola, y después de hacer algunos cálculos complejos, calcular la velocidad de la bola después de golpear la raqueta, y aplicarla directamente a la velocidad de la pelota usando rigidbody.velocity = calculateVelocity(). Ahora vuelve a funcionar bien cuando la raqueta no se mueve, pero no cuando muevo la raqueta. El problema exacto (síntomas de) es:
Uso de Física integrada y detección de colisión: cuando la raqueta se mueve, la pelota a veces pasa directamente a través de la raqueta y, a veces, se ralentiza (a niveles increíbles).
Usando mi secuencia de comandos para calcular la velocidad: El problema es el mismo, pero me permite identificar qué está mal cuando imprimo la normalidad del colisionador (la raqueta). A veces da la normalidad correcta, y en algún momento da el negativo del vector normal, lo que significa que va directamente a través de la superficie superior y detecta el golpe con el lado inferior del colisionador (raqueta).
Las cosas que he intentado:
El aumento del tamaño del colisionador (funciona con la mayor colisionador de cuadro en la raqueta, pero entonces, evidentemente, la bola se mueve desde una distancia bastante lejos de la raqueta, y mi propio script funciona aquí, la física predeterminada da resultados extraños cuando se mueve la raqueta), en resumen, no obtengo la realidad que quiero.
Disminuyendo la marca de tiempo fija a 0.001, lo que mejoró significativamente las cosas, pero aún muy lejos del resultado que deseo, y la pelota de nuevo escoge el lado equivocado de la pelota.
Cambiando la detección de colisión a dinámica continua. Lo cual tampoco mejoró las cosas.
Y además del lado equivocado elegidos al choque, otro problema que he observado es que después de rebotar en la raqueta, la pelota está movimientos, pero la raqueta se mueve más rápido, en lugar de moverse en un arco completo o línea, de alguna manera aparece en frente de la pelota, lo que resulta en dos golpes. Es una conjetura basada en lo que es visible.
También está claro que el aspecto de "movimiento" de la raqueta no está siendo leído por la física incorporada de Unity3d, lo que resulta en un comportamiento extraño cuando la raqueta se mueve con el mouse golpea la pelota.
Estoy atascado, no tengo ni idea de dónde moverse desde aquí. Por favor, dime qué es lo que estoy haciendo mal.
He intentado establecer la velocidad máxima tanto para la raqueta como para la pelota, puedo quizás aumentar el tamaño de todo el entorno, quizás esto podría brindar una mejor oportunidad de detectar el lado derecho del colisionador. Implementaré tanto la solución dada por Justin808 como el tamaño de todo. – SpeedBirdNine
Esto funcionó tan brillantemente, dupliqué el tamaño de todo, y ahora no falta una colisión. Todavía tengo el otro problema del que Justin808 habló, que la raqueta en un momento está en frente de la pelota y el siguiente cuadro está detrás de la pelota, pero al menos veo dos colisiones distintas, ¡que pueden manejarse con código! ¡Muchas gracias! Me tomó solo 2 minutos para hacer. Ahora voy a implementar la solución de Justin para resolver dos colisiones. En este momento, si alguien tiene otra explicación, ¡por favor, compartala también! – SpeedBirdNine
Ok problema resuelto, no tuve que colocar un raycast entre la posición anterior y siguiente de la pelota ya que ahora el colisionador de la raqueta no le falta la pelota. Otra cosa es que el movimiento de la raqueta a través del mouse no se traduce en una fuerza adicional aplicada a la pelota. Tuve que escribir esta parte yo mismo, y establecer istrigger como verdadero para el colisionador de raquetas para que la física original no interfiera. Pero ahora había un problema de golpear varias veces, lo resolví usando una bandera, que se vuelve falsa cuando se golpea la primera vez, y es verdadera otra vez después de 1 segundo, o cuando la pelota golpea a otro objeto. ¡Esto funciona! – SpeedBirdNine