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.
Desafío
FácilLa 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
MovePositionenFixedUpdate(), 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
}
}
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