Usando interpolación fisica

¿Cómo incorporamos la interpolación de física en un juego de Godot? ¿Existen algunas precauciones o advertencias a tener en cuenta?

Hemos intentado hacer que el sistema sea lo más fácil de usar posible, y muchos juegos existentes funcionarán con pocos cambios. Dicho esto, hay algunas situaciones que requieren un tratamiento especial, y estas serán descritas.

Activa la configuración de interpolación de física

El primer paso es activar la interpolación de física en ProjectSettings.physics/common/physics_interpolation. Ahora puedes ejecutar tu juego.

Es probable que no se vea una gran diferencia a simple vista, especialmente si estás ejecutando la física a 60 ciclos por segundo (TPS) o un múltiplo de este valor. Sin embargo, detrás de escena, está ocurriendo mucho más.

Truco

Para convertir un juego existente para usar interpolación, es altamente recomendable que temporariamente establezcas ProjectSettings.physics/common/physics_fps en un valor bajo, como 10, lo que hará que los problemas de interpolación sean más evidentes.

Mueve (casi) toda la lógica del juego de _process a _physics_process

El requisito más fundamental para la interpolación de física (que es posible que ya estés haciendo) es que debes mover y realizar la lógica del juego en tus objetos dentro de _physics_process (que se ejecuta en un ciclo de física) en lugar de _process (que se ejecuta en un fotograma renderizado). Esto significa que tus scripts deben hacer la mayor parte de su procesamiento dentro de _physics_process, incluyendo responder a la entrada del usuario y la inteligencia artificial (AI).

Establecer la transformación de objetos solo dentro de los ciclos de física permite que la interpolación automática se encargue de las transformaciones entre los ciclos de física y asegura que el juego se ejecute de la misma manera en cualquier máquina en la que se ejecute. Como beneficio adicional, esto también reduce el uso de la CPU si el juego se está renderizando a una alta tasa de cuadros por segundo (FPS), ya que la lógica de la IA (por ejemplo) ya no se ejecutará en cada fotograma renderizado.

Nota

Si intentas establecer la transformación de objetos interpolados fuera del ciclo de física, los cálculos para la posición interpolada serán incorrectos y experimentarás sacudidas (jitter). Es posible que estas sacudidas no sean visibles en tu máquina, pero ocurrirán para algunos jugadores. Por esta razón, se debe evitar establecer la transformación de objetos interpolados fuera del ciclo de física. Godot intentará generar advertencias en el editor si se detecta este caso.

Truco

Esto es solo una regla flexible. Hay algunas ocasiones en las que es posible que desees teleportar objetos fuera del ciclo de física (por ejemplo, al comenzar un nivel o al reaparecer objetos). Sin embargo, en general, deberías aplicar transformaciones desde el ciclo de física.

Asegúrate de que todos los movimientos indirectos ocurran durante los ciclos de física

En Godot, los nodos pueden moverse no solo directamente en tus propios scripts, sino también mediante métodos automáticos como el tweening (interpolación), la animación y la navegación. Todos estos métodos también deben tener su temporización configurada para funcionar en el tick de físicas en lugar de en cada fotograma ("idle"), si los estás utilizando para mover objetos (estos métodos también pueden utilizarse para controlar propiedades que no están interpoladas).

Nota

Además, debes tener en cuenta que los nodos pueden moverse no solo moviéndose a sí mismos, sino también moviendo los nodos padres en el SceneTree. Por lo tanto, el movimiento de los nodos padres también debe ocurrir solo durante los ticks de físicas.

Escoja una tasa de tic de física

Cuando se utiliza la interpolación de físicas, el renderizado se desacopla de la física, y puedes elegir cualquier valor que tenga sentido para tu juego. Ya no estás limitado a valores que sean múltiplos de la frecuencia de actualización del monitor del usuario (para un juego sin tartamudeo si se alcanza el FPS objetivo).

Como guía aproximada:

Tasas bajas de tics (10-30)

Tasas medias de tics (30-60)

Altas tasas de tics (60+)

Mejor rendimiento de CPU

Buen comportamiento de fisicas en escenas complejas

Bueno con físicas rapidas

Agregar algo de retraso a la entrada de teclado

Bueno para juegos en primera persona

Bueno para juegos de carrera

Comportamiento de fisica simple

Nota

Siempre puedes cambiar la frecuencia de tics mientras desarrollas, es tan sencillo como modificar la configuración del proyecto.

Llama a reset_physics_interpolation() al teletransportar objetos

La mayor parte del tiempo, la interpolación es lo que deseas entre dos tics de físicas. Sin embargo, hay una situación en la que no es lo que deseas. Esa situación es cuando estás colocando inicialmente objetos o moviéndolos a una nueva ubicación. Aquí, no deseas un movimiento suave entre los dos puntos, sino un movimiento instantáneo.

La solución a esto es llamar a la función Node.reset_physics_interpolation. Debes llamar a esta función en un Nodo después de establecer la posición/transformación. El resto se hará automáticamente por ti.

Incluso si olvidas llamar a esto, generalmente no es un problema en la mayoría de las situaciones (especialmente a altas frecuencias de tic). Esto es algo que puedes dejar fácilmente para la fase de pulido de tu juego. Lo peor que puede pasar es ver un movimiento con estelas durante un fotograma más o menos cuando los muevas, ¡sabrás cuándo lo necesitas!

Importante

Debes llamar a reset_physics_interpolation() después de establecer la nueva posición, en lugar de antes. De lo contrario, aún verás el movimiento no deseado con estelas.

Trucos de testeo y depuración

Aunque tengas la intención de ejecutar la física a 60 TPS (tics por segundo), para probar exhaustivamente la interpolación y obtener un juego más suave, se recomienda encarecidamente configurar temporalmente la frecuencia de tics de física a un valor bajo, como 10 TPS.

El juego puede no funcionar perfectamente, pero te permitirá ver más fácilmente los casos en los que debes llamar a Node.reset_physics_interpolation, o donde debes utilizar tu propia interpolación personalizada, por ejemplo, en una Camera. Una vez que hayas corregido estos casos, puedes volver a configurar la frecuencia de ticks de física a la configuración deseada.

Otra gran ventaja de probar con una frecuencia de tics baja es que a menudo puedes notar otros sistemas del juego que están sincronizados con el tic de físicas y que pueden estar creando problemas que deseas solucionar. Ejemplos típicos incluyen la configuración de valores de mezcla de animaciones, que podrías decidir configurar en _process() e interpolar manualmente.