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.
Desafío
FácilSuspende la barcaza sobre la lava y deslízala con las flechas.
- En
Start(), establecerb.isKinematic = true;. - En
FixedUpdate(), leefloat h = Input.GetAxisRaw("Horizontal");y llama arb.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
1Cuerpo rígido
Gravedad y masaEmpujar con AddForceSaltar con un impulsoFixedUpdate para físicaVelocidadCuerpos cinemáticosRepaso: plataforma de lanzamiento4Corrutinas
InvocarInvokeRepeating y CancelInvokeTu primera corrutinaBucles en corrutinasDetener corrutinasRepaso: cuenta regresiva10Proyecto: Escape de la arena
La arenaCazadores2Colisiones
OnCollisionEnter¿Qué golpeé?Romper al impactarDe pie sobre el sueloRebote y fricciónFormas de los collidersRepaso: muro destructible5Proyecto: Carrera de Monedas
La pelota rodanteMonedas para recoger3Disparadores
Colisionadores de tipo triggerOnTriggerEnterObjetos coleccionablesLas cajas guardan el restoZonas letalesEntrada y salidaRepaso: llave y puertaPractica por tu cuenta: Playground de Unity