Menu
CoddyTech

Corpos Cinemáticos

Parte da seção Física e Jogabilidade do Journey de Unity da Coddy. Lição 6 de 71.

Plataformas móveis, elevadores e portas precisam colidir como objetos sólidos, mas não podem cair nem ser empurrados por qualquer coisa que pouse sobre eles. Esse é um corpo cinemático: defina rb.isKinematic = true, e a gravidade, as forças e os impactos deixarão de movê-lo. Seu colisor ainda conta, então um corpo dinâmico (que a física move) esbarra nele como em uma parede e fica sobre ele como no chão. Você mesmo move um corpo cinemático com rb.MovePosition.

Este elevador sobe a lift m/s até chegar a top. MovePosition recebe a posição que o objeto deve 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 acompanhar o movimento. MovePosition informa à física que o corpo se deslocou até o novo local durante a etapa, então o que ele toca é carregado 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: apenas corpos dinâmicos esbarram neles.

challenge icon

Desafio

Fácil

Deixe a barcaça suspensa sobre a lava e deslize-a com as setas.

  1. Em Start(), defina rb.isKinematic = true;.
  2. Em FixedUpdate(), leia float h = Input.GetAxisRaw("Horizontal"); e chame rb.MovePosition(rb.position + Vector3.right * h * speed * Time.fixedDeltaTime);.

Pressione “Jogar” e deslize-a: a barcaça fica suspensa no ar, e o drone ricocheteia nela. Depois, pressione “Verificar”.

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 de x usando as setas
    }
}

Todas as lições de Física e Jogabilidade

Pratique por conta própria: Playground de Unity