De pie sobre el suelo
Parte de la sección Física y jugabilidad del Journey de Unity de Coddy. Lección 11 de 63.
Cada contacto tiene una normal: una dirección de longitud 1, perpendicular a la superficie que tocaste y que apunta desde ella hacia tu objeto. collision.GetContact(0) es el primer punto de contacto, y su normal te indica qué lado tocaste. Al estar de pie en terreno llano, es (0, 1, 0); contra una pared a tu derecha, es (-1, 0, 0); al golpearte la cabeza con un techo, es (0, -1, 0).
Esta caja distingue los aterrizajes de los golpes laterales:
void OnCollisionEnter(Collision collision)
{
Vector3 normal = collision.GetContact(0).normal;
if (normal.y > 0.5f)
{
Debug.Log("Landed on " + collision.gameObject.name);
}
else
{
Debug.Log("Bumped the side of " + collision.gameObject.name);
}
}La comprobación es normal.y > 0.5f en vez de exactamente 1 para que las pendientes también cuenten como suelo: y es 0.5 en una pendiente de 60 grados, más empinada de lo que cualquiera subiría caminando. Dos mensajes más ayudan con cualquier contacto que dure: OnCollisionStay se ejecuta en cada paso de física mientras dure el contacto, y OnCollisionExit una vez cuando termina. Una salida no tiene puntos de contacto, ya que nada está tocando nada, así que no llames a GetContact ahí.
Desafío
FácilEl jugador puede caminar y saltar, pero la tecla Space también funciona en el aire, así que puede subir al cielo de un salto a la vez y saltar desde el lateral de la pared. (Su colisionador tiene un material sin fricción, así que se desliza por las paredes en lugar de quedarse pegado a ellas). Haz que solo salte cuando esté sobre algo.
- Mantén un
bool grounded: true mientras el jugador toque algo cuyo vector normal de contacto apunte hacia arriba (y por encima de 0.5), false cuando deje de tocarlo. - Haz que salte solo cuando se haya presionado Space y
groundedsea true. Si se presiona en el aire, se ignora; no se guarda para el aterrizaje.
Presiona Jugar, intenta saltar dos veces y subir por la pared, y luego Comprobar.
Pruébalo tú mismo
using UnityEngine;
public class Hopper : MonoBehaviour
{
public float speed = 4f;
public float jump = 6f;
private Rigidbody rb;
private bool jumpPressed;
void Start()
{
rb = GetComponent<Rigidbody>();
}
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
jumpPressed = true;
}
}
void FixedUpdate()
{
float h = Input.GetAxisRaw("Horizontal");
rb.linearVelocity = new Vector3(h * speed, rb.linearVelocity.y, 0);
if (jumpPressed)
{
rb.AddForce(Vector3.up * jump, ForceMode.Impulse);
jumpPressed = false;
}
}
}
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