Noté un problema en la verificación de terreno del controlador en tercera persona de Unity.
La verificación en el suelo debe detectar si el jugador está parado o no en el suelo. Lo hace enviando un rayo debajo del jugador.
Sin embargo, si el jugador se para arriba y en el medio de dos cajas y hay un espacio entre estas cajas, entonces el rayo dispara hacia el hueco y el jugador piensa que no está en contacto con el suelo, que se ve así:
No puedo moverme. Puede ver claramente que el rayo está en la brecha y, por lo tanto, el árbol de mezcla en el aire del animador del jugador está activo.
¿Cuál es la mejor manera de resolver este problema?
Estaba pensando en disparar múltiples rayos, del mismo origen pero con diferentes ángulos. Y OnGround
solo debería ser cierto si el X% de estos rayos tocan el "suelo". ¿O hay un mejor camino?
fuente
Debug.DrawLine
? Es difícil de visualizar, no puedo escribir el guión.Sinceramente, creo que el enfoque de "rayos múltiples" es una buena idea. Sin embargo, no los dispararía en ángulo, sino que compensaría los rayos, algo como esto:
El jugador es el stickman azul; Las flechas verdes representan los rayos adicionales, y los puntos naranjas (RaycastHits) son los puntos donde los dos rayos golpean las cajas.
Idealmente, los dos rayos verdes deben colocarse justo debajo de los pies del jugador, para obtener la mayor precisión para verificar si el jugador está conectado a tierra o no;)
fuente
Creo que lo resolví cambiando
Physics.Raycast
aPhysics.SphereCast
en el guiónThirdPersonCharacter.cs
. Pero aún necesita pruebas.También tuve que comentar esta línea que estaba cambiando el
m_GroundCheckDistance
valor, de lo contrario, hubo algunos deslizamientos extraños en algunos modelos:Y cambié
m_GroundCheckDistance = 0.1f;
am_GroundCheckDistance = m_OrigGroundCheckDistance;
:Guión completo:
fuente
¿Por qué no usar la función OnCollisionStay de Unity ?
Pros:
No tienes que crear raycast.
Es más preciso que Raycast: Raycast es un método de disparar para verificar, si su disparo de Raycast no es suficiente cobertura, entonces genera un error, razón por la cual hizo esta pregunta.
OnCollisionStay
El método literalmente verifica si algo se está tocando: encaja perfectamente con el propósito de verificar si el jugador está tocando el suelo (o cualquier cosa en la que el jugador pueda aterrizar).Para ver el código y la demostración, consulte esta respuesta: http://answers.unity.com/answers/1547919/view.html
fuente