FixedUpdate para Física
Parte da seção Física e jogabilidade do Journey de Unity da Coddy. Lição 4 de 63.
O Unity move os corpos em etapas fixas de física de 0.02 segundos (Time.fixedDeltaTime), 50 vezes por segundo, independentemente da taxa de quadros. FixedUpdate() é executado logo antes de cada etapa. Update() é executado uma vez por quadro desenhado, e isso pode ocorrer 30, 60 ou 144 vezes por segundo: a 144, a maioria dos quadros não tem nenhuma etapa de física, e, em um computador lento, um quadro pode conter duas.
Disso decorrem duas regras. Uma força adicionada em Update() é adicionada uma vez por quadro, então um computador mais rápido empurra com mais força: forças que atuam ao longo do tempo devem ficar em FixedUpdate(). E GetKeyDown é verdadeiro por apenas um quadro; se esse quadro não tiver uma etapa de física, FixedUpdate() nunca o verá, e o pressionamento será perdido. Portanto, leia os pressionamentos em Update(), lembre-se deles em um bool e aja sobre eles em FixedUpdate(). Este barco é empurrado por um vento constante e avança de lado ao clicar:
private bool dashQueued;
void Update()
{
if (Input.GetMouseButtonDown(0))
{
dashQueued = true; // guarda o clique
}
}
void FixedUpdate()
{
rb.AddForce(Vector3.forward * wind); // um impulso constante, a cada passo
if (dashQueued)
{
rb.AddForce(Vector3.right * 4f, ForceMode.Impulse);
dashQueued = false; // um clique, uma arrancada
}
}Limpar o bool depois de usá-lo é importante: se fosse deixado como true, o barco avançaria em cada etapa. Um único impulso também poderia ser adicionado diretamente de Update(), como foi o salto do sapo; o bool mantém todos os empurrões em um só lugar, junto das forças com as quais interage. Teclas mantidas pressionadas (GetKey, GetAxis) descrevem um estado, não um momento, então FixedUpdate() pode lê-las diretamente. Dentro de FixedUpdate(), Time.deltaTime retorna o valor 0.02 da etapa.
Desafio
FácilO trenó no lago congelado está com as duas tarefas no método errado. As setas o empurram em Update(), então ele é empurrado com mais força em computadores mais rápidos. A tecla Espaço faz o trenó saltar com um impulso em FixedUpdate(), então alguns pressionamentos não fazem nada.
- Mova o impulso das setas para
FixedUpdate(). - Leia a tecla Espaço em
Update()em umaboolchamadahopPressed; emFixedUpdate(), faça o trenó saltar quando ela estiver definida e, em seguida, limpe-a.
Pressione Play e experimente os dois, depois Check.
Experimente você mesmo
using UnityEngine;
public class Sled : MonoBehaviour
{
public float push = 6f;
public float hop = 5f;
private Rigidbody rb;
void Start()
{
rb = GetComponent<Rigidbody>();
}
void Update()
{
if (Input.GetKey(KeyCode.RightArrow))
{
rb.AddForce(Vector3.right * push);
}
if (Input.GetKey(KeyCode.LeftArrow))
{
rb.AddForce(Vector3.left * push);
}
}
void FixedUpdate()
{
if (Input.GetKeyDown(KeyCode.Space))
{
rb.AddForce(Vector3.up * hop, ForceMode.Impulse);
}
}
}
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