Eu sei algumas diferenças entre Update()
e FixedUpdate()
e recentemente usei ambas as funções em um script. O código está funcionando, mas eu tenho uma pergunta:
O uso de ambas as funções causa problemas? É seguro usar os dois?
Resposta
Atualizar pedido
Quando você acompanha a lógica e as interações do jogo, animações, posições da câmera, etc., existem alguns eventos diferentes que você pode usar. O padrão comum é realizar a maioria das tarefas dentro da função Atualizar, mas também existem outras funções que você pode usar.
FixedUpdate:
FixedUpdate é frequentemente chamado com mais frequência do que Atualizar.
Pode ser chamado várias vezes por quadro se a taxa de quadros for baixa e pode não ser chamado entre os quadros se a taxa de quadros for alta. Todos os cálculos e atualizações de física ocorrem imediatamente após FixedUpdate. Ao aplicar cálculos de movimento dentro de FixedUpdate, você não precisa multiplicar seus valores por Time.deltaTime.
FixedUpdate é chamado em um cronômetro confiável, independente do taxa de quadros
.
Atualização:
A atualização é chamada uma vez por quadro. É a principal função de burro de carga para atualizações de frame.
LateUpdate:
LateUpdate é chamado uma vez por quadro após o término da atualização.
Todos os cálculos executados em Atualizar serão concluídos quando LateUpdate começar. Um uso comum para LateUpdate seria uma câmera de terceira pessoa a seguir. Se você fizer seu personagem se mover e girar dentro do Update, você pode realizar todos os movimentos da câmera e cálculos de rotação no LateUpdate. Isso garantirá que o personagem se moveu completamente antes que a câmera rastreie sua posição.
É seguro usar a atualização fixa, a atualização e a atualização tardia simultaneamente.
using UnityEngine; using System.Collections; public class CheckFunctionExecutionOrder : MonoBehaviour { void FixedUpdate () { Debug.Log("FixedUpdate time :" + Time.deltaTime); } void Update () { Debug.Log("Update time :" + Time.deltaTime); } void LateUpdate() { Debug.Log("late Update time :" + Time.deltaTime); } }
Comentários
- Resposta excelente! Pode valer a pena incluir que você pode criar uma co-rotina que aguarda FixedUpdate antes de executar; iniciar esta corrotina a partir de um método de início efetivley dá a você um LateFixedUpdate (que, embora não seja tão útil, tem seus usos).
- Multiplicar por Time.deltaTime ainda é uma boa ideia em FixedUpdate. Ele permite que você expresse coisas como velocidades em " unidades por segundo " em vez de " unidades por tick " e se você alterar o seu intervalo de tempo fixo, você ' não terá que voltar e reajustar todos os seus parâmetros para obter o mesmas velocidades. A vantagem de FixedUpdate é que Time.deltaTime sempre retorna o fixedDeltaTime estável quando acessado de FixedUpdate, em vez de obter um resultado variável a cada quadro com base na taxa de quadros e escala de tempo, como acontece em Atualizar.
Resposta
Na verdade, eles estão todos executando ao mesmo tempo, seus scripts apenas fazem coisas nessas funções. Atualização é chamada uma vez por quadro e FixedUpdate é chamado uma vez a cada “atualização física” (que é uma vez a cada período fixo de tempo que você pode ajustar).
Também há LateUpdate , se você quiser que certas funções sejam executadas depois a função Atualizar desse quadro de referência. Para obter uma lista completa de mensagens, consulte a referência do MonoBehaviour .
Aqui está um link para Tutorial do Unity que cobre isso .
Comentários
- A atualização de física é controlável? Quer dizer, se eu definir Fixed TimeStep para algum valor, a atualização fixa será executada após esse tempo? e a física do jogo também funcionará depois desse período de tempo?
- @MuhammadFaizanKhan Deve ser assim que funciona. Eu ' não tenho certeza sobre a versão atual do Unity, no entanto, era como estava quando escrevi a resposta. Basicamente, a atualização é atualizada a cada quadro e a física tem sua própria taxa de quadros e função de atualização separada da outra função de atualização.
Resposta
É seguro usar Update (), FixedUpdate () e LateUpdate () em um único script. Pelo menos eu tenho e nunca tive problemas.Eu geralmente usarei Update () para meus loops principais, FixedUpdate () para coisas como física e LateUpdate () para loops que desejo executar depois de todo o resto.