Corpos Cinemáticos
Parte da seção Física e jogabilidade do Journey de Unity da Coddy. Lição 6 de 63.
Plataformas móveis, elevadores e portas precisam colidir como objetos sólidos, mas não podem cair nem ser empurrados pelo que quer que pouse sobre eles. Isso é um corpo cinemático: defina rb.isKinematic = true, e a gravidade, as forças e os impactos deixam de movê-lo. Seu colisor ainda conta, então um corpo dinâmico (movido pela física) esbarra nele como em uma parede e fica sobre ele como no chão. Você move um corpo cinemático por conta própria, com rb.MovePosition.
Este elevador sobe a lift m/s até chegar a top. MovePosition recebe a posição que o objeto deverá ocupar após esta etapa, então o código adiciona o movimento correspondente a uma etapa, 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 que não definir transform.position? Isso teletransporta o objeto, e a física nunca fica sabendo que ele se moveu: uma caixa sobre uma plataforma deslizante ficaria para trás em vez de acompanhá-la. MovePosition informa à física que o corpo se deslocou até o novo local durante a etapa, então o que ele toca é transportado e empurrado corretamente. AddForce não faz nada em um corpo cinemático, e corpos cinemáticos nunca colidem com colisores estáticos nem entre si: somente corpos dinâmicos esbarram neles.
Desafio
FácilA barca fica suspensa sobre a lava, e as setas devem movê-la para a esquerda e para a direita ao longo do eixo x a speed m/s (2 no Inspector). No momento, o Rigidbody dela é comum, então ela cai na lava.
- Quando o jogo começar, torne a barca cinemática, para que ela fique suspensa no ar e nada que a atinja possa empurrá-la.
- Mova-a com
MovePositionemFixedUpdate(), usando o eixo Horizontal bruto.
Pressione Play e mova a barca; depois, pressione Check.
Experimente você mesmo
using UnityEngine;
public class Barge : MonoBehaviour
{
public float speed = 2f;
private Rigidbody rb;
void Start()
{
rb = GetComponent<Rigidbody>();
// Torne a barcaça cinemática
}
void FixedUpdate()
{
// Deslize-a ao longo do eixo x com as setas
}
}
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Física e jogabilidade
1Rigidbody
Gravidade e MassaEmpurrar com AddForcePular com um ImpulsoFixedUpdate para FísicaVelocidadeCorpos CinemáticosRevisão: Plataforma de Lançamento2Colisões
OnCollisionEnterO que eu acertei?Quebre no impactoNo chãoQuique e atritoFormas dos collidersRevisão: Parede destrutível5Projeto: Corrida das Moedas
A Bola RolanteMoedas para Coletar