¿Cuál es la diferencia entre Update y FixedUpdate en Unity, y debería molestarme?


10

Me dijeron que lo usara Update()para gráficos y FixedUpdate()física, pero a veces mis entradas no se registran cuando lo uso FixedUpdate(). Sin Update()embargo, funciona bien si lo uso para todo.

¿Debo molestarme FixedUpdate()o estoy haciendo algo mal?

Respuestas:


10

FixedUpdatepuede correr más rápido o más lento que Updatedependiendo de su configuración. Eso dependerá de la carga (qué tan rápido se Updateestá ejecutando) y la velocidad que haya establecido FixedUpdate(que se encuentra en Edición-> Configuración del proyecto-> Tiempo). Idealmente, dado que Updatese ejecuta una vez por cuadro, aquí es donde desea capturar la entrada. Si necesita actuar sobre la entrada en el FixedUpdatemétodo (como el control de los cuerpos de física), establezca banderas y Updateluego maneje en FixedUpdate:

bool leftMouseDown = false;

void Update()
{
    if(Input.GetMouseButtonDown(0))
        leftMouseDown = true;
}

void FixedUpdate()
{
    if(leftMouseDown )
    {
        //update physics bodies with input
        leftMouseDown = false;
    }
}

Todavía es una buena idea controlar la física desde el FixedUpdatemétodo, ya que es poco probable que la física deba actualizarse con tanta frecuencia, y la física en una actualización fija es mucho más fácil de predecir ( determinismo ) que la física en una actualización variable.


¿Qué pasa si en lugar de una condición bool (es.GetMouseButtonDown) necesitamos leer el valor de un eje (Input.GetAxis ("Horizontal"))? Si la actualización se ejecuta más veces que FixedUpdate, ¿cuál es su consejo en ese caso? ¿Deberíamos considerar calcular el valor medio del eje que se produjo durante varias actualizaciones antes de consumirlo en la actualización? (+1 por cierto)
Heisenbug

¿Cómo puedo saber qué tan rápido es mi FixedUpdate?
Tokamocha

1
@Tokamocha La tasa de actualización fija se establece en Editar-> Configuración del proyecto-> Tiempo.
MichaelHouse

@Heisenbug Personalmente, usaría el último valor y vería qué tan bien funciona. Si obtengo resultados inesperados, podría calcular un promedio de ejecución del valor del eje hasta que sea procesado por FixedUpdate. Esa es una de esas cosas que necesita algunas pruebas de juego para realmente entender qué "se siente" bien.
MichaelHouse

1
En pruebas recientes descubrí que, al contrario de lo que está implícito en los documentos, ya hay disponibles nuevos indicadores de entrada en FixedUpdate (al menos en la PC). Por lo tanto, establecer un indicador en Actualización y luego actuar sobre él en la próxima actualización fija después de eso (es decir, el siguiente fotograma) como se muestra aquí, en realidad puede agregar un marco de latencia al juego, en relación con el manejo de la entrada en FixedUpdate directamente. Sin embargo, esto requiere un poco de cuidado para evitar la entrada de doble manejo en marcos con múltiples FixedUpdates o entradas faltantes en marcos sin FixedUpdate.
DMGregory

7

Necesitas entender lo que hace cada uno. Update()se llama con la mayor frecuencia posible (no estoy seguro, tal vez se puede limitar), de cualquier manera, cada fotograma. FixedUpdate()se llama cada cantidad de tiempo constante (por lo tanto, "fijo").

La entrada entra Update(), tan simple como eso (porque, como notó, FixedUpdate()podría no detectar el evento de entrada). Sin embargo, la lógica del juego podría entrar en cualquiera de los dos. La física debe ser determinista y es por eso que debería estar dentro FixedUpdate(). Otras cosas no tienen que hacerlo. Dependiendo del uso, debe decidir qué función es apropiada.

Aunque vale la pena decir que algunas aplicaciones tienen toda la actualización de la lógica del juego FixedUpdate()(incluso fuera de Unity), se llama "bucle de juego de paso fijo". Tener todo el código de actualización en una función de paso fijo le da determinismo y hace que sea más probable que su aplicación se comporte de la misma manera cada vez (y en cada dispositivo). También permite algunas características sofisticadas, como las repeticiones.


Entonces, si pongo todo en FixedUpdate () mi juego aún registrará todas las entradas, ¿verdad?
Tokamocha

1
No, puedes poner todas las actualizaciones de lógica del juego pero no la comprobación de entrada.
NPS

2
Esta respuesta está llena de información errónea. En primer lugar, FixedUpdate se llama 1 / fixedDeltaTime veces por segundo , no cada n: th fixedDeltaTime. En segundo lugar, la lógica del juego siempre debe ir en FixedUpdate, ya que facilita la razón. La actualización es solo para fines de representación (sé que casi nadie en la comunidad de Unity sigue esto, pero así es como se supone que debe hacerse). Tercero, FixedUpdate y su relación con el motor de física no tienen nada que ver con el determinismo.
Thr
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.