Estoy un poco en desacuerdo con la respuesta de Philipp ; o al menos con cómo lo presentó. Da la impresión de que mover el mundo alrededor del jugador podría ser una mejor idea; cuando es exactamente lo contrario. Así que aquí está mi propia respuesta ...
Ambas opciones pueden funcionar, pero generalmente es una mala idea "invertir la física" moviendo el mundo alrededor del jugador en lugar del jugador alrededor del mundo.
Pérdida / desperdicio de rendimiento:
El mundo generalmente tendrá muchos objetos; muchos, si no la mayoría, estáticos o durmiendo. El jugador tendrá uno, o relativamente pocos, objetos. Mover a todo el mundo alrededor del jugador, significa mover todo en la escena excepto el jugador. Objetos estáticos, objetos dinámicos durmientes, objetos dinámicos activos, fuentes de luz, fuentes de sonido, etc. Todos tienen que ser trasladados.
Eso (obviamente) es considerablemente más caro que mover solo lo que realmente se está moviendo (el jugador, y tal vez algunas cosas más).
Mantenibilidad y extensibilidad:
Mover el mundo alrededor del jugador hace que el mundo (y todo lo que contiene) sea el punto donde las cosas están sucediendo más activamente. Cualquier error o cambio en el sistema significa que, potencialmente, todo cambia. Esta no es una buena manera de hacer las cosas; desea que los errores / cambios estén tan aislados como sea posible, para que no obtenga comportamientos inesperados en algún lugar donde no haya realizado cambios.
También hay muchos otros problemas con este enfoque. Por ejemplo, rompe muchas suposiciones de cómo se supone que las cosas funcionan en el motor. No podrá utilizar la dinámica RigidBody
para otra cosa que no sea el reproductor, por ejemplo; como un objeto con un adjunto RigidBody
no establecido en cinemática se comportará inesperadamente al establecer la posición / rotación / escala (que estaría haciendo cada cuadro, para cada objeto en la escena, excepto el jugador 😨)
¡Entonces la respuesta es solo mover al jugador!
Bueno ... si y no . Como se menciona en la respuesta de Philipp, en un tipo de juego de corredor infinito (o cualquier juego con una gran área explorable sin fisuras), ir demasiado lejos del origen eventualmente introduciría FPPE ( errores de precisión de punto flotante) notables , y aún más, eventualmente, desbordar el tipo numérico, ya sea haciendo que tu juego se bloquee o, básicamente, haciendo que el mundo del juego se agriete ... ¡con esteroides! 😵 (porque en este punto, los FPPE harían que el juego ya esté en crack "normal")
La solución real :
¡No hagas nada y haz las dos cosas! Debes mantener el mundo estático y mover al jugador a su alrededor. Pero "vuelva a enraizar" tanto al jugador como al mundo, cuando el jugador comience a alejarse demasiado de la raíz (posición [0, 0, 0]
) de la escena.
Si mantienes la posición relativa de las cosas (jugador en el mundo que lo rodea) y haces este proceso en una sola actualización de cuadro, ¡el jugador (real) ni siquiera se dará cuenta!
Para hacerlo, tienes dos opciones principales:
- Mueva al jugador a la raíz de la escena y mueva la porción del mundo a su nueva posición con respecto al jugador.
- Piensa en el mundo como una cuadrícula; mueve la parte de la cuadrícula en la que se encuentra el jugador a la raíz, y mueve el jugador a su nueva posición en relación con esa parte de la cuadrícula.
Aquí hay un ejemplo de este proceso en acción.
¿Pero que lejos es muy lejos?
Si observa el código fuente de Unity, usan 1e-5
( 0.00001
) como base para considerar dos valores de punto flotante "iguales", dentro de Vector2
y Vector3
(los tipos de datos responsables de las posiciones de los objetos, rotaciones y escalas [euler-]). Dado que la pérdida de precisión de punto flotante ocurre en ambos sentidos lejos de cero, es seguro asumir que cualquier cosa debajo de 1e+5
( 100000
) unidades lejos de la raíz / origen de la escena es seguro para trabajar.
¡Pero! Ya que...
- Es más apropiado hacer un sistema para manejar estos procesos de re-rooting automáticamente.
- Sea cual sea su juego, no es necesario que una "sección" contigua del mundo tenga 100000 unidades (metros [?]) De ancho.
... entonces probablemente sea una buena idea volver a rootear mucho antes / con más frecuencia que esa marca de 100000 unidades. El video de ejemplo que proporcioné parece hacerlo cada 1000 unidades más o menos, por ejemplo.