Por ejemplo sake:
- Digamos que hay 10 habitaciones en el mundo.
- Y digamos que el mundo está habitado por 10 entidades.
- Y cada entidad tiene su propia "rutina diaria" donde realiza ciertas acciones en la sala y también puede navegar entre las salas.
Dado que el jugador solo puede estar en una habitación a la vez, ¿cuál es una buena manera de realizar un seguimiento de las acciones que realizan las otras entidades en otras habitaciones fuera de la pantalla?
- La opción más sencilla es verificar cada una de las 10 entidades en cada cuadro, verificar su posición / estado y determinar si la entidad debe estar o no en la habitación donde se encuentra el jugador en un momento dado. (Sin embargo, esto se siente realmente con muchos recursos, especialmente a medida que aumenta la cantidad de sala / entidad).
Otra opción es hacer un seguimiento del tiempo que ha pasado desde el comienzo del juego, luego cada una de las entidades verifica si su patrón se cruza con la sala en la que se encuentra el jugador, y si lo hace, compara con el tiempo si se supone que la entidad está en la misma habitación en este momento en particular, las entidades cuyos patrones no se cruzan con la habitación actual en la que se encuentra el jugador no hacen nada hasta que el jugador ingresa a una habitación en la que se cruza su patrón y solo en ese punto calculan si deberían rendir. (Pero si interactúan con la habitación, tendrán que verificar siempre el estado de las habitaciones que se cruzan con su ruta para determinar su ubicación en ese momento, lo que no es tan bueno).
La tercera opción a la que llegué sería, en primer lugar, mirar solo las rutas que se cruzan con la ubicación del jugador (como se describió anteriormente), en segundo lugar al ingresar a una habitación, verificar si el jugador está en esa habitación, si no, entonces solo verificar estado de la habitación y cuánto tiempo llevará pasar a la siguiente habitación. Por ejemplo, un NPC de conserje ingresa a la sala, verifica el estado de la sala, ve que el jugador haya realizado un derrame, calcula cuánto tiempo tomará limpiar eso y cuánto tiempo llevará el recorrido, etc. Y hasta que se mencione es hora de ingresar a la siguiente habitación, solo verificamos si el jugador está en la habitación. La ubicación exacta del NPC para fines de representación solo se calcularía cuando el jugador ingrese a la sala.
Después de una lluvia de ideas, llegué a la tercera opción, pero me preguntaba si tal vez hay una forma conocida o mejor de manejar estas cosas.
fuente
Respuestas:
Un enfoque muy simple es usar el "Nivel de Detalle AI". Aproximadamente, esto significa que actualiza AI con mayor frecuencia cuanto más cerca esté del reproductor / cámara. También puede reducir la complejidad de los cálculos de IA que están más lejos, especialmente. para encontrar el camino. Después de todo, si el jugador no puede ver bien al personaje o no lo tiene, no tiene sentido poner mucho esfuerzo en simular al personaje con la mayor precisión.
En su ejemplo, la sala en la que se encuentra el jugador podría obtener la mayor precisión (AI actualiza cada fotograma, resolución completa). Las habitaciones adyacentes pueden obtener la siguiente precisión más alta (se actualiza cada 10 ticks, se eliminan las suavizaciones y animaciones de ruta). Todas las otras salas pueden obtener la precisión más baja (actualizaciones cada segundo, búsqueda de rutas de baja resolución, eliminar interacciones no esenciales de NPC a NPC).
Los juegos más grandes y complejos pueden (y han usado) enfoques similares. Podrían simplificar los cálculos de combate, teletransportar a los personajes en lugar de encontrarlos cuando necesiten moverse, etc.
Si su juego es lo suficientemente grande como para no poder guardarlo todo en la memoria en todo momento, una buena solución es almacenar el último tiempo de actualización en los datos guardados de la sala y reproducir su simulación fuera de la pantalla (en su resolución más baja) cuando Está cargado de nuevo.
Si espera que AI se mueva a áreas "en vivo" desde áreas "dormidas" sin carga en un horario, querrá crear datos de súper baja fidelidad para esas regiones para mantenerlos en la memoria en todo momento (por ejemplo, solo los más gruesos) nivel de detalle de navmesh y ubicaciones de objetos / personajes clave) o querrá alternar periódicamente esas áreas en (p. ej., mantener X áreas "dormidas" en la memoria y la simulación a baja fidelidad con actualizaciones poco frecuentes y luego hacer un round robin a través de todas las " "áreas dormidas" que tienen NPC activos clave en ellas, descargando y cargando áreas mientras lo haces).
fuente
Almacenaría las entidades que están actualmente en una habitación en esa instancia de habitación, el objeto de la habitación también mantendría un registro de cuándo deben actualizarse las entidades (por ejemplo, viajar a otra habitación o cambiar algo en esa habitación, etc.). Y también actualizaría una (o más) habitación cada segundo (tal vez en otro hilo).
Cuando actualiza una sala, las posiciones de los NPC deben actualizarse y todas las acciones que han realizado que interactúan con la sala desde la última actualización también deben manejarse, por último, la hora de la próxima actualización necesaria debe verificarse / actualizarse.
Si una entidad viaja de una habitación a otra, su instancia debe almacenarse en la otra habitación y la próxima actualización de la entidad también debe actualizarse.
De esta manera, solo tiene que seguir actualizando la sala actual y las salas que tienen una actualización programada en ese momento, actualizar las otras salas es solo opcional (pero se recomienda si tiene una IA que se actualiza cada vez que el jugador se mueve o hace algo) .
fuente