Menu
CoddyTech

Cuerpos cinemáticos

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

Las plataformas móviles, los ascensores y las puertas necesitan chocar como objetos sólidos, pero no deben caer ni ser empujados por lo que aterrice sobre ellos. Eso es un cuerpo cinemático: establece 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 mantiene 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 tener después de este paso, así que el código suma el movimiento correspondiente a 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 establecer 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 vez de desplazarse con ella. MovePosition le indica a la física que el cuerpo se desplazó hasta la nueva posición 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 chocan con colisionadores estáticos ni entre sí: solo los cuerpos dinámicos chocan contra ellos.

challenge icon

Desafío

Fácil

Suspende la barcaza sobre la lava y deslízala con las flechas.

  1. En Start(), establece rb.isKinematic = true;.
  2. En FixedUpdate(), lee float h = Input.GetAxisRaw("Horizontal"); y llama a rb.MovePosition(rb.position + Vector3.right * h * speed * Time.fixedDeltaTime);.

Pulsa «Jugar» y deslízala: la barcaza queda suspendida en el aire y el dron rebota. Después, pulsa «Comprobar».

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 de x con las flechas
    }
}

Todas las lecciones de Física y jugabilidad

Practica por tu cuenta: Playground de Unity