Comprobación del suelo con un rayo
Parte de la sección Física y jugabilidad del Journey de Unity de Coddy. Lección 35 de 63.
Un salto solo debería comenzar desde el suelo. Standing on the Ground lo determinaba a partir de las normales de contacto, que se mantenían actualizadas mediante mensajes de colisión. Un rayo responde «¿estoy parado sobre algo?» en el momento, en cualquier instante: lánzalo en línea recta hacia abajo desde el centro, un poco más largo que la distancia desde el centro hasta la parte inferior. Este jugador es una cápsula de 2 unidades de altura, así que su parte inferior está 1 unidad por debajo de su centro, y el rayo mide 1.1:
public float jumpForce = 5f;
private Rigidbody rb;
void Start()
{
rb = GetComponent<Rigidbody>();
}
void Update()
{
if (Input.GetKeyDown(KeyCode.Space) && IsGrounded())
{
rb.AddForce(Vector3.up * jumpForce, ForceMode.Impulse);
}
}
bool IsGrounded()
{
return Physics.Raycast(transform.position, Vector3.down, 1.1f);
}El 0.1 adicional es un margen. Un cuerpo apoyado en el suelo puede quedar un poquito por encima o hundirse un poquito en él, así que un rayo de exactamente 1 de largo no lo detecta en algunos fotogramas. Mucho más largo es incorrecto por el otro motivo: con 3, el jugador podría volver a saltar cuando está 2 unidades en el aire, y si no tuviera longitud, el rayo siempre encontraría el suelo, así que cada pulsación sería un salto.
El rayo empieza dentro del propio colisionador del jugador, que los rayos omiten, así que nunca detecta al jugador. La tecla se lee en Update(), porque GetKeyDown es true durante un solo fotograma, y se puede añadir ahí mismo un impulso puntual, como en Jump with an Impulse.
Desafío
IntermedioLa rana salta cada vez que se pulsa la barra espaciadora, incluso en el aire, así que puede subir hasta el cielo. Corrige Hopper para que solo salte desde el suelo:
- Añade un método
bool IsGrounded()que lance un rayo vertical hacia abajo desde el centro de la rana. La rana es una esfera escalada a 1.5, así que su radio es 0.75: haz que el rayo llegue 0.1 más allá de su parte inferior. - Haz que salte solo cuando se pulse la barra espaciadora y
IsGrounded()sea verdadero.
Pulsa Jugar e intenta saltar dos veces; después, pulsa Comprobar.
Pruébalo tú mismo
using UnityEngine;
public class Hopper : MonoBehaviour
{
public float jumpForce = 6f;
private Rigidbody rb;
void Start()
{
rb = GetComponent<Rigidbody>();
}
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
rb.AddForce(Vector3.up * jumpForce, ForceMode.Impulse);
}
}
}
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Física y jugabilidad
1Cuerpo rígido
Gravedad y masaEmpujar con AddForceSaltar con un impulsoFixedUpdate para físicaVelocidadCuerpos cinemáticosRepaso: plataforma de lanzamiento2Colisiones
OnCollisionEnter¿Qué golpeé?Romper al impactarDe pie sobre el sueloRebote y fricciónFormas de los collidersRepaso: muro destructible5Proyecto: Carrera de monedas
La bola rodanteMonedas para recoger