FixedUpdate para Física
Parte da seção Física e Jogabilidade do Journey de Unity da Coddy. Lição 4 de 71.
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 acontecer 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 aplica uma força maior: forças que atuam ao longo do tempo devem ser aplicadas em FixedUpdate(). E GetKeyDown fica verdadeiro por apenas um quadro; se esse quadro não tiver uma etapa de física, FixedUpdate() não o detectará e o pressionamento será perdido. Portanto, leia os pressionamentos em Update(), guarde-os em um bool e aja com base neles em FixedUpdate(). Este barco é empurrado por um vento constante e dá um impulso lateral ao clicar:
private bool dashQueued;
void Update()
{
if (Input.GetMouseButtonDown(0))
{
dashQueued = true; // guarda o clique
}
}
void FixedUpdate()
{
rb.AddForce(Vector3.forward * wind); // um empurrão constante a cada passo
if (dashQueued)
{
rb.AddForce(Vector3.right * 4f, ForceMode.Impulse);
dashQueued = false; // um clique, um avanço rápido
}
}É importante limpar o bool depois de usá-lo: se continuasse como true, o barco daria um impulso em cada etapa. Um único impulso também poderia ser adicionado diretamente em Update(), como foi o salto do sapo; o bool mantém todos os impulsos em um só lugar, junto às forças com as quais interage. Teclas mantidas pressionadas (GetKey, GetAxis) descrevem um estado, não um instante, então FixedUpdate() pode lê-las diretamente. Dentro de FixedUpdate(), Time.deltaTime retorna o valor de 0.02 da etapa.
Desafio
FácilColoque as duas tarefas do trenó nos métodos corretos.
- Mova os dois blocos
ifdas setas deUpdate()paraFixedUpdate(). - Adicione
private bool hopPressed;. EmUpdate(), defina-o comotrueao pressionarInput.GetKeyDown(KeyCode.Space). - Em
FixedUpdate(), quandohopPressedestiver definido, adicione o impulso e, em seguida, defina-o comofalse.
Pressione “Jogar”: as setas empurram uniformemente, e cada pressionamento da tecla Espaço faz o trenó pular. Depois, clique em “Verificar”.
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);
}
}
}
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