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.
Desafio
FácilDeixe a barcaça suspensa sobre a lava e deslize-a com as setas.
- Em
Start(), definarb.isKinematic = true;. - Em
FixedUpdate(), leiafloat h = Input.GetAxisRaw("Horizontal");e chamerb.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
1Rigidbody
Gravidade e MassaEmpurrar com AddForcePular com um ImpulsoFixedUpdate para FísicaVelocidadeCorpos CinemáticosRevisão: Plataforma de Lançamento4Corrotinas
InvocarInvocar repetidamente, Cancelar invocaçãoSua primeira corrotinaLoops em corrotinasInterrompendo corrotinasRevisão: contagem regressiva10Projeto: Fuga da Arena
A ArenaCaçadores2Colisõ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 ColetarPratique por conta própria: Playground de Unity