Menu
CoddyTech

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í.

challenge icon

Desafío

Fácil

El 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 grounded sea 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;
        }
    }
}
quiz iconPonte a prueba

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