Menu
CoddyTech

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.

challenge icon

Desafio

Fácil

A 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 MovePosition em FixedUpdate(), 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
    }
}
quiz iconTeste seus conhecimentos

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