Diferencia entre revisiones de «Unity NavMesh»
Ir a la navegación
Ir a la búsqueda
| Línea 110: | Línea 110: | ||
| − | |||
| − | |||
Revisión del 09:12 4 jul 2019
Introducción
- Más información en:
- Uno de los problemas a los que nos podemos enfrentar al desarrollar un juego es de dotar de inteligencia a los enemigos y que sean capaces de 'esquivar' los obstáculos de un escenario mientras intentan coger a nuestro protagonista.
- Podríamos intentar hacerlo nosotros, ya que vimos en esta Wiki el uso del vector dirección y podríamos hacer que los enemigos calcularan dicho vector con respecto al jugador y que se movieran hacia él.
- El problema que tendríamos es que si existen obstáculos entre el enemigo y el jugador, quedarían atrapados, como se observa en la siguiente escena:
- Si tuviéramos que programarlo podría ser muy laborioso.
- Para solucionarlo, Unity ofrece el sistema de navegación inteligente: Navigation System.
- Este componente va a permitir definir mediante una serie de parámetros que área de nuestra escena es 'caminable' por los enemigos.
- Por ejemplo, podremos definir que las zonas elevadas más de X grados no sean navegables (por tanto serían un muro) o que las bajadas o subidas de desnivel a partir de un tamaño no sean accesibles (formarían otro muro).
- Una vez creado el Navigation, asociamos a cada enemigo un NavMesh Agent el cual hará que dicho enemigo vaya 'detrás' del protagonista esquivando los posibles objetos que encuentre por el camino.
Preparando la escena
- Vamos a preparar una escena para mostrar el uso de este componente.
- Los gráficos son utilizados de otras partes de este manual de la Wiki. Si no dispones de ellos no pasa nada. Puedes emplear los que tengas disponibles llegados a este punto de la Wiki y como último recurso puedes emplear figuras básicas como Cubos o Esferas.
- Creamos una nueva escena o un nuevo Empty GameObject, sobre el que situaremos todos los gameobjects siguientes.
- Un plano de dimensiones 5x1x5 y un material con una textura color Rojo asocicada (si ya habéis visto como crear un Terrain podríais hacer uso de uno).
- Dos vallas que conformarán los obstáculos.
- Un Jeep que será nuestro protagonista.
- Un taque que será nuestro enemigo.
- El tanque viene rotado por lo que el eje-Z del mismo no se corresponde con el eje-Z del mundo.
- Para solucionarlo, creamos un Empty GameObject y dentro del mismo ponemos el tanque con el eje-Y rotado -90 grados.
- Preparando la escena
- El NavMesh o Navigation Mesh es el componente con el que vamos a definir el área que es 'utilizable' por los enemigos para poder desplazarse.
- NOTA IMPORTANTE: Para que una superficie forme parte del NavMesh es necesario que sea de tipo Navigation Static.
- En nuestro ejemplo, queremos que el plano forma parte del NavMesh, por lo que debemos ir a la ventana Inspector y comprobar que, al menos, esté marcada la opción indicada:
- También queremos que las vallas formen parte del NavMesh en el sentido que queremos que no se pueda pasar a través de ellas, por lo que también las marcaremos como Navigation Static:
- Cuando creamos un NavMesh estamos creando la superficie sobre la que los enemigos van a poder desplazarse. Esta superficie es 'precalculada' y guardada por Unity y es por lo que se conoce como Baking un NavMesh (al igual que tenemos el proceso de Bake sobre las luces para precalcular las sombras generadas).
- Para crear un NavMesh debemos ir a al menú principal Window => AI => Navigation
- Al abrir la ventana Navigation aparecerá en la 'Inspector Window' una nueva pestaña (Navigation) formada por 4 pestañas. En la pestaña Bake disponemos de las propiedades que van a conformar nuestra superficie 'caminable'.
- Agent Radius: Indica a que distancia (medio metro) los enemigos deben de parar cuando lleguen a su destino o choquen con un obstáculo.
- Agent Height: Indica la altura (2 metros) que quedará libre de cualquier otro enemigo o protagonista.
- Max Slope: Indica en grados (45 grados) la inclinación máxima de un obstáculo por el cual el enemigo va a poder caminar.
- Step Height: Altura (0,4 metros) que es considerada como un escalón por el cual el enemigo va a poder subir. En el ejemplo, un obstáculo de más de 0.4 metros no podría ser caminable.
- La sección Generated Off Mesh Links hace referencia a la posibilidad de 'conectar' diferentes puntos de un NavMesh.
- Más información en este enlace.
- La sección Advanced se puede consultar en este enlace.
- Una vez conformadas las características de nuestro NavMesh tendremos que hacer el proceso de Bake para que Unity calcule la superficie caminable y los obstáculos de nuestra escena. Para ello presionamos el botón Bake:
- Creando un NavMesh
Al hacerlo podemos ver como en la escena aparece una superficie que será la superficie 'caminable' por los enemigos. En cualquier momento podemos eliminar la superficie generada pulsando el botón Clear. Sobre las vallas aparece otra zona indicando que no es transitable (es un obstáculo). Si no os aparece, debéis de modificar las vallas
Fijarse como debajo de las vallas aparece una zona de otro color, indicando que dicha zona no es transitable (es un obstáculo). Si movemos la valla, la zona no se 'regenera' ya que hemos hecho un 'bake' y por lo tanto no se actualiza. Para actualizar dicha zona, tendremos que volver a presionar el botón de 'Bake'.
- Vamos a 'complicar' un poco más la escena y vamos a hacer que haya una especie de 'paso'.
- La idea es hacer que el tanque pueda pasar por debajo de dicho paso. Este ejemplo sería aplicable a juegos con un túnel o lugares sobre los que queramos que los enemigos (o incluso el propio protagonista) puedan pasar.
- Creando una zona de paso
-- Ángel D. Fernández González -- (2018).

