Menu
CoddyTech

Cuerpos cinemáticos

Parte de la sección Física y jugabilidad del Journey de Unity de Coddy. Lección 6 de 63.

Las plataformas móviles, los ascensores y las puertas deben colisionar como objetos sólidos, pero no deben caerse ni ser empujados por lo que sea que caiga sobre ellos. Eso es un cuerpo cinemático: configura rb.isKinematic = true, y la gravedad, las fuerzas y los impactos ya no lo moverán. Su colisionador sigue contando, así que un cuerpo dinámico (uno que mueve la física) choca contra él como contra una pared y se queda sobre él como sobre el suelo. Tú mismo mueves un cuerpo cinemático con rb.MovePosition.

Este ascensor sube a lift m/s hasta llegar a top. MovePosition recibe la posición que debe alcanzar después de este paso, así que el código suma la distancia recorrida en un paso, usando Time.fixedDeltaTime:

void Start()
{
    rb = GetComponent<Rigidbody>();
    rb.isKinematic = true;
}

void FixedUpdate()
{
    if (rb.position.y < top)
    {
        rb.MovePosition(rb.position + Vector3.up * lift * Time.fixedDeltaTime);
    }
}

¿Por qué no asignar transform.position? Eso teletransporta el objeto, y la física nunca se entera de que se ha movido: una caja sobre una plataforma deslizante se quedaría atrás en lugar de desplazarse con ella. MovePosition le indica a la física que el cuerpo se desplazó hasta el nuevo lugar durante el paso, así que lo que toca se transporta y se empuja correctamente. AddForce no hace nada en un cuerpo cinemático, y los cuerpos cinemáticos nunca colisionan con colisionadores estáticos ni entre sí: solo los cuerpos dinámicos chocan contra ellos.

challenge icon

Desafío

Fácil

La barcaza cuelga sobre la lava, y las flechas deberían deslizarla a izquierda y derecha a lo largo del eje x a speed m/s (2 en el Inspector). Ahora mismo su Rigidbody es normal, así que cae en la lava.

  • Cuando empiece el juego, haz que la barcaza sea cinemática para que se quede suspendida en el aire y nada que la golpee pueda empujarla.
  • Muévela con MovePosition en FixedUpdate(), usando el eje Horizontal sin procesar.

Pulsa Play y desliza la barcaza; después, pulsa Check.

Pruébalo tú mismo

using UnityEngine;

public class Barge : MonoBehaviour
{
    public float speed = 2f;
    private Rigidbody rb;

    void Start()
    {
        rb = GetComponent<Rigidbody>();
        // Haz que la barcaza sea cinemática
    }

    void FixedUpdate()
    {
        // Deslízala a lo largo del eje x con las flechas
    }
}
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