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.
Update
é chamado cada vez menos e sua simulação sofrerá muito com isso. Você pode não perceber enquanto a simulação é simples, mas pode facilmente quebrar horrivelmente quando não é.De: http://unity3d.com/learn/tutorials/modules/beginner/scripting/update-and-fixedupdate
O tempo usado no FixedUpdate não é variável.
Se o seu jogo começar a ficar lento, quando ele chegar, você não quer> 10segundos de física em uma atualização; portanto, isso geralmente é feito no FixedUpdate, que é chamado em um intervalo fixo.
Por exemplo:
Onde:
fonte
FixedUpdate
na verdade não é chamado em um intervalo fixo. A natureza realFixedUpdate
é apertar vários ciclos de física em um quadro se o jogo começar a atrasar e pular os ciclos se estiver indo rápido demais, para que a média funcione no Timestep de atualização fixa. O Unity não é multiencadeado, portanto, não há como garantir chamadas FixedUpdate em um intervalo fixo (o que acontece quando um FixedUpdate leva muito tempo). Mesmo que fosse, provavelmente ainda seria quase impossível.Update
é chamado o mais rápido possível. A variável 'Time.deltaTime' é definida como a quantidade real de tempo que passou desde a última chamada. Se o atraso ou algo semelhante atrasar o jogo,Update
ainda será chamado apenas uma vez depois que o atraso terminar, com um valor alto dedeltaTime
.FixedUpdate
é chamado em intervalos regulares. Ele nunca será chamado com mais frequência do que a proporção especificada em 'Time.fixedDeltaTime'. Se o atraso ou algo semelhante atrasar o jogo,FixedUpdate
ele será chamado várias vezes em rápida sucessão para permitir que o jogo o recupere.Time.deltaTime
é definido como igual aTime.fixedDeltaTime
antes daFixedUpdate
execução, mas isso é apenas uma farsa para facilitar a migração do código entre os dois.Geralmente,
Update
deve ser usado para comportamentos interpoláveis eFixedUpdate
para comportamentos que devem ser calculados passo a passo ou que dependam daqueles que o fazem, como o movimento baseado na física. Se você estiver escrevendo algum tipo de loop aoUpdate
longo das linhasfor(time=0;time<=deltaTime;time+=someStep)...
, provavelmente deverá fazê-lo no FixedUpdate.fonte