Eu ia escrever isso como um comentário, mas acabou sendo bastante longo, então eu o transformei em uma resposta.
As respostas atuais são na maioria corretas, mas algumas coisas mencionadas são enganosas / erradas.
Em geral, a maioria das tarefas relacionadas ao jogo é executada Update
.
Por exemplo, você não deseja pesquisar informações FixedUpdate
(não por causa do desempenho, mas porque as chamadas simplesmente não funcionam corretamente). AI cai no mesmo barco.
Física atualizada continuamente é a única tarefa relacionada à jogabilidade que FixedUpdate
deve ser usada. Chamadas não contínuas / de vez em quando para coisas como Physics.Raycast
, ou mesmo Rigidbody.AddForce
pertencem Update
. Minha menção Rigidbody.AddForce
é aparentemente contrária ao que pode estar implícito na documentação, mas a chave é Contínua vs Não Contínua.
Uma enorme razão pela qual apenas a física contínua pertence FixedUpdate
é a natureza real de FixedUpdate
. Outras respostas mencionaram como FixedUpdate é chamado em um interval, but that's slightly misleading. In reality, a script is passed a time in Time.deltaTime
/ fixo Time.fixedDeltaTime
que não corresponde diretamente ao tempo real entre as chamadas, mas ao tempo simulado entre as chamadas.
(* Time.deltaTime
e Time.fixedDeltaTime
tem o mesmo valor quando chamado em FixedUpdate
[Unity é capaz de saber se a chamada atual se Time.deltaTime
originou durante FixedUpdate
e retorna Time.fixedDeltaTime
])
Naturalmente, o mesmo caminho Update
não pode ser chamado de maneira constante por causa de desempenho variável, nem pode FixedUpdate
. A principal diferença é que, cada quadro, se FixedUpdate
não tiver sido chamado com frequência suficiente para atingir o intervalo correto entre as chamadas, ele será chamado várias vezes (ou não será chamado a média é muito alta). É a isso que os documentos da Ordem de Execução se referem ao dizer que FixedUpdate pode ser chamado várias vezes por quadro:
... FixedUpdate: FixedUpdate é chamado frequentemente com mais freqüência que Update. Pode ser chamado várias vezes por quadro, se a taxa de quadros for baixa e não puder ser chamado entre quadros, se a taxa de quadros for alta ...
Isso não afeta a Física devido à natureza do restante da ordem de execução e do mecanismo, mas praticamente qualquer outra coisa que você colocar FixedUpdate
será afetada e causará problemas.
Por exemplo, se você colocar o processamento de AI dentro, FixedUpdate
não há razão para supor que o AI não pulará atualizações para vários quadros seguidos. Além disso, cada vez que o FixedUpdate fica para trás, sua IA é atualizada várias vezes em um único quadro antes que coisas como física e entrada / movimento do jogador sejam processadas, o que é, no mínimo, um desperdício de processamento, mas também é extremamente provável que cause para rastrear bugs e comportamento irregular.
Se você precisar fazer algo em um intervalo fixo, use outros métodos fornecidos pelo Unity, como Coroutines
e InvokeRepeating
.
E uma pequena nota sobre Time.deltaTime
e quando usá-lo:
A maneira mais fácil de descrever o efeito de Time.deltaTime é alterar um número de unidade por quadro para unidade por segundo . Por exemplo, se você tiver um script com algo parecido transform.Translate(Vector3.up * 5)
com o Update, estará movendo a transformação essencialmente a uma taxa de 5 metros por quadro . Isso significa que, se a taxa de quadros for baixa, o movimento será mais lento e se a taxa de quadros for alta, o movimento será mais rápido.
Se você pegar o mesmo código e alterá-lo para transform.Translate(Vector3.up * 5 * Time.deltaTime)
, o objeto está sendo movido a uma taxa de 5 metros por segundo . Isso significa que, independentemente da taxa de quadros, o objeto se moverá 5 metros a cada segundo (mas quanto mais lenta a taxa de quadros, mais saltado o movimento do objeto aparecerá, pois ele ainda move a mesma quantidade a cada X segundos)
Em geral, você deseja que seu movimento seja por segundo. Dessa maneira, independentemente da velocidade do computador, sua física / movimento se comportará da mesma maneira e você não terá bugs estranhos aparecendo em dispositivos mais lentos.
E não faz sentido usá-lo FixedUpdate
. Por causa do que mencionei acima, você obterá o mesmo valor a cada chamada (o valor Timestep de atualização fixa) e isso não fará nada com seus valores. O movimento / física definido em FixedUpdate
já estará em unidades por segundo, para que você não precise dele.