Conozco algunas diferencias entre Update()
y FixedUpdate()
y recientemente he usado ambas funciones en un solo script. El código funciona, pero tengo una pregunta:
¿El uso de estas dos funciones causa algún problema? ¿Es seguro utilizar ambos?
Respuesta
Orden de actualización
Cuando haces un seguimiento de la lógica y las interacciones del juego, animaciones, posiciones de la cámara, etc., hay algunos eventos diferentes que puedes usar. El patrón común es realizar la mayoría de las tareas dentro de la función Actualizar, pero también hay otras funciones que puede usar.
FixedUpdate:
FixedUpdate se suele llamar con más frecuencia que Update.
Se puede llamar varias veces por fotograma si la frecuencia de fotogramas es baja y es posible que no se le llame entre fotogramas si la frecuencia de fotogramas es alta. Todos los cálculos y actualizaciones de física ocurren inmediatamente después de FixedUpdate. Al aplicar cálculos de movimiento dentro de FixedUpdate, no es necesario que multiplique sus valores por Time.deltaTime.
FixedUpdate se llama en un temporizador confiable, independiente del velocidad de fotogramas
.
Actualización:
La actualización se llama una vez por fotograma. Es la principal función de caballo de batalla para las actualizaciones de marcos.
LateUpdate:
Se llama a LateUpdate una vez por cuadro una vez finalizada la actualización.
Todos los cálculos que se realicen en Update se habrán completado cuando comience LateUpdate. Un uso común de LateUpdate sería una siguiente cámara en tercera persona. Si haces que tu personaje se mueva y gire dentro de Update, puedes realizar todos los cálculos de movimiento y rotación de la cámara en LateUpdate. Esto asegurará que el personaje se haya movido por completo antes de que la cámara rastree su posición.
Es seguro usar Actualización fija, Actualización y Actualización tardía simultáneamente.
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); } }
Comentarios
- ¡Excelente respuesta! Puede valer la pena incluir que puede crear una corrutina que espera FixedUpdate antes de ejecutarse; iniciar esta corrutina desde un método de inicio efectivamente le da un LateFixedUpdate (que, aunque no es tan útil, tiene sus usos).
- Multiplicar por Time.deltaTime sigue siendo una buena idea en FixedUpdate. Te permite expresar cosas como velocidades en " unidades por segundo " en lugar de " unidades por tick " y si cambia su intervalo de tiempo fijo, no ' tendrá que volver atrás y volver a ajustar todos sus parámetros para obtener el mismas velocidades. La ventaja de FixedUpdate es que Time.deltaTime siempre devuelve el FixedDeltaTime estable cuando se accede desde FixedUpdate, en lugar de obtener un resultado variable en cada fotograma basado en la velocidad de fotogramas y la escala de tiempo, como lo hace en Update.
Respuesta
En realidad, todos se están ejecutando al mismo tiempo, sus scripts solo hacen cosas en esas funciones. Update se llama una vez por fotograma y FixedUpdate se llama una vez cada «actualización de física» (que es una vez cada período de tiempo fijo que puede ajustar).
También hay LateUpdate , si desea que ciertas funciones se ejecuten después la función Actualizar de ese marco de referencia. Para obtener una lista completa de mensajes, consulte la referencia de MonoBehaviour .
Aquí «un enlace al Tutorial de Unity que cubre esto .
Comentarios
- ¿La Actualización de Física es controlable? Quiero decir, si configuro Fixed TimeStep en algún valor, ¿la actualización fija se ejecutará después de ese tiempo? ¿y la física del juego también funcionará después de esa cantidad de tiempo?
- @MuhammadFaizanKhan Así debería funcionar. Sin embargo, ' no estoy seguro de la versión actual de Unity, así era cuando escribí la respuesta. Básicamente, la actualización se actualiza en cada fotograma y la física tiene su propia velocidad de fotogramas y función de actualización separada de la otra función de actualización.
Respuesta
Es seguro utilizar Update (), FixedUpdate () y LateUpdate () todo en un solo script. Al menos yo sí y nunca he tenido problemas.Generalmente usaré Update () para mis bucles principales, FixedUpdate () para cosas como la física y LateUpdate () para los bucles que quiero ejecutar después de todo lo demás.