En esta conferencia, vamos a echar un vistazo más de cerca a los agentes navmesh. Para comenzar, descargue el
proyecto NavMeshStationStarter que viene con esta conferencia.
Cuando lo coloque, encontrará un mapa extenso dentro de él.
Este es el mapa que vino con la demostración de Angry
Bots, muchas versiones de Unity.
He eliminado la mayor parte del código y encontrarás solo la geometría allí. Simplemente usaremos esto como
un "centro de juegos" para nuestros agentes.
Ahora voy a hacer zoom en este bit
aquí y también he movido mi cámara para que esté mirando hacia abajo cuando presiono Reproducir.
Así que adelante y seleccione esta área aquí.
También he creado 2 materiales que no tendrás en tus cosas. He creado un
material azul y un material rojo. Esto es solo para que podamos colorear los agentes a
medida que los creamos para poder notar la diferencia entre ellos.
A continuación, configuraremos el navmesh, así que asegúrese de tener su ventana de navegación en algún lugar de su proyecto. Para obtener
eso, es 'Ventana> Navegación'. El siguiente paso es seleccionar la geometría en su mapa que desea formar
parte de la malla de navegación.
Así que vaya y encuentre las piezas individuales de este modelo (por lo tanto, los polígonos individuales) y selecciónelas con
mayúsculas hasta que tenga la mayor parte del área donde desea que los agentes puedan moverse.
Por lo tanto, queremos poder avanzar por el corredor, así que asegúrese de agregar eso y tal vez estas plataformas.
Si desea que puedan saltar sobre las cosas más adelante, puede agregarlas.
Si no los selecciona todos a la vez, puede volver y obtenerlos más tarde.
Cada una de las mallas que ha seleccionado debe configurarse para ser una navegación estática.
Así que seleccione el Inspector, aún con todo lo seleccionado en la
escena y queremos subir a Estático y soltarlo y asegurarnos de que haga clic en Navegación
estática,
para que el navegador pueda recogerlo. Una vez que los haya configurado
(déjeme configurarlo
nuevamente porque podría haberlo desactivado), vuelva a la pestaña de Navegación y
debajo de Hornear, haga clic en [Hornear]. Ahora los bits que forman parte de la red de navegación se volverán azules. En este punto, si se ha
perdido algo (por lo tanto, digamos que desea que se incluya este bit aquí),
puede volver y seleccionarlo por sí mismo e ir al Inspector y nuevamente, 'Estático> Estático de navegación', vuelva
a la navegación y debajo de Bake, presione [Bake] y eso lo agregará.
Así que puedes pasar y hacer un bit a la vez y seguir agregándolo.
Ahora, si ves algo como lo que estoy sucediendo aquí abajo, donde no es azul y tampoco
es
azul allí, es solo un problema de renderizado superpuesto.
Así que trata de no preocuparte demasiado por eso.
El problema será si sus agentes no caminan sobre esa área, entonces no ha sido recogida
para la malla de navegación y simplemente regresa, selecciónela nuevamente y solo asegúrese de que esté
configurada en Navegación estática y luego ' hacer un horno '.
Ahora es el momento de agregar un agente.
Así que alejémonos un poco de aquí.
Voy a entrar en la Jerarquía y agregaremos un nuevo 'Objeto 3D> Cápsula' y esta cápsula
será nuestra A. YO. carácter y hagamos que sea rojo para que
podamos verlo, simplemente arrastre eso hacia allí.
Ahora vamos a necesitar enviar algunos comandos a este personaje y lo haremos etiquetándolo, para que
podamos encontrarlo. En el
Inspector, desea crear una nueva etiqueta llamada 'ai' (que ya he creado), así que cree eso y luego configure
su cápsula para que sea eso. En ese momento, puede cambiar el nombre de esto. Llamémoslo un 'Agente Rojo'.
Lo convertiremos en prefabricado un poco más tarde y luego podrá hacer varias copias de ellos.
Lo importante en esta etapa es que está etiquetado como 'ai'.
Ahora crearé un script llamado AIControl, así que en el proyecto, cree un script
C #, llámelo AIControl y desea adjuntarlo al RedAgent.
Ahora ábralo y adentro queremos agarrar el agente navmesh que está unido a nuestro personaje.
Primero, agregamos la biblioteca para acceder a eso, entonces 'Usando UnityEngine. AI;' luego hacemos una variable
para almacenar el enlace al agente. Entonces, 'agente público NavMeshAgent'; y luego al principio lo configuramos para que sea
el componente que está en él.
Así que esto. GetComponent 'con NavMeshAgent, así.
Ahora quiero programar el agente para que se mueva a una ubicación rápida en la pantalla y podría hacerlo dentro
de la Actualización para este agente en particular, pero
si voy a tener varias copias de este agente en el lugar, No quiero que todos ejecuten
su propia actualización con declaraciones 'if' que comprueban los clics del mouse y ese tipo de cosas.
Entonces, en lugar de hacer eso, crearé un Administrador de agentes.
Avancemos y eliminemos esta actualización porque no quiero que una actualización vacía no procese nada porque
causará un retraso significativo si tiene muchos agentes que intentan ejecutar una actualización vacía y, por
lo tanto, solo necesitamos 1 actualización que envíe el mensaje a todos los agentes.
Así que solo voy a guardar eso, volver aquí al editor y en la Jerarquía, haremos clic
derecho, Crear vacío y le daremos el nombre de AgentManager y luego lo
que haré es crear un script llamado AgentManager. Ese script se adjunta a nuestro
objeto de juego AgentManager (curiosamente) y luego dentro del script, vamos a agregar esto.
Entonces, este script tiene una serie de agentes en la parte superior que se rellena cuando comenzamos a jugar.
Entonces, los 'agentes' se llenarán con todos los objetos del juego en la escena que tengan la etiqueta 'ai'. Es por eso que 'ai' es tan importante
que ha etiquetado a sus agentes con él y luego hacer clic en el entorno para que el
agente se mueva allí va a suceder en la Actualización.
Así que no importa cuántos agentes haya etiquetado como 'ai' en su escena, este mensaje se les enviará.
Entonces, si se hace clic en un botón del mouse (en este caso, el botón
izquierdo del mouse),
crearemos un RaycastHit. Usaremos un raycast de física desde la posición de entrada del mouse a través de un ScreenPointToRay para que dispare una
línea recta desde la posición de el mouse en la pantalla entra en la escena
y descubre dónde golpea, a una distancia de 100.
Si descubre que no está golpeando nada y está haciendo clic en todo el lugar,
aumente este número aquí, para que produzca un rayo más largo. Luego, dentro de la declaración 'if', tenemos un foreach y
eso solo va a recorrer todos los agentes en la matriz y para
cada uno de ellos, se apoderará de su script AIControl y obtendrá su agente que acabamos de
configurar para ellos.
Al igual que en la última conferencia, utilizamos SetDestination y eso pasará por la posición
de donde estaba el clic del mouse. Entonces, es un valor de Vector3 que va a entrar aquí, al
agente navmesh y debido a que el agente navmesh ya está configurado para moverse automáticamente,
comenzará a moverse hacia ese punto de golpe.
Así que guardemos eso y
volvamos al editor, agarremos nuestro RedAgent que tiene el script, pero aún no tiene un
agente navmesh, así que solo [Agregar componente]> Nav Mesh Agent.
No necesita hacer nada más con eso, simplemente dejaremos los valores predeterminados allí.
Correcto, así que presione Reproducir y podremos hacer clic en algún lugar del área que definimos para nuestra malla de navegación
y verá que el agente ahora se moverá.
Ahora, si quisieras moverte un poco más rápido, podemos seleccionar el agente y bajar al
Inspector para ver la Velocidad.
Por lo tanto, actualmente está configurado en 3. 5 por defecto.
Podemos configurarlo en 10, si desea que vaya bastante rápido y presione Reproducir.
En realidad, habiendo dicho eso, no creo que 10 sea tan rápido como podrías pensar. También puedo hacer clic aquí porque ese es mi navegador
y la única forma de entrar en esta área es si atraviesas este pequeño túnel.
Ahora viste allí que se quedó un poco atascado, o debería decir sobrepasado, dónde iba a caer en
este camino.
Eso se debe a la velocidad y la aceleración y ese tipo de cosas, así como al frenado.
Déjame detener esto por un segundo.
Lo que quiero mostrarle es que si va a la ventana de Navegación y selecciona su agente y luego
presiona Reproducir, podrá ver la pantalla de navegación y cómo funciona.
Cuando haces clic en la superficie, verás la ruta que se calcula. Entonces, digamos que quieres
ir aquí.
Puede ver todos los polígonos que se eligen como parte de la ruta. El agente en sí también termina con algunos
vectores que sobresalen, mostrándole la dirección en la que viaja y cómo
está girando, hacia dónde se
enfrentará y ese tipo de cosas también. El lugar donde el agente puede moverse a través
de la red de navegación depende del 'Tamaño del agente al horno'. En la ventana de Navegación, debajo de Hornear, hay un Tamaño de
agente horneado que habría visto antes y cambiar los valores en esto determina cómo se genera el tamaño de la malla de navegación.
Entonces, por ejemplo, el Radio del Agente, si tuviéramos que aumentar eso para decir que nuestro agente es bastante amplio y luego volver a hacer
la reforma, lo que van a hacer es encontrar áreas estrechas por donde pueda pasar antes de que se hayan
ido.
Entonces, por ejemplo, el agente ya no puede bajar por este túnel porque realmente era una
de las
secciones más estrechas y, a pesar de que si selecciona esta pestaña 'Agentes' aquí
y mira lo que está sucediendo aquí, usted puede modificar el tamaño de cualquier tipo particular de agente que veremos
más adelante, todavía no tiene ningún efecto sobre este tamaño de agente horneado.
Por lo tanto, es el Tamaño del agente horneado el que determina cómo se genera la malla de navegación en la superficie de su entorno,
NO el tamaño de los agentes individuales que puede crear. Puedes tener Humanoid, Zombie, Fish, lo que quieras, puedes tener
todos los diferentes tipos de A. YO. pero no afectarán la cocción
del navmesh, esto lo hará aquí.
Entonces, si reducimos esto a 59 y lo rehacemos, tendremos nuestro pequeño camino debajo de este túnel nuevamente.
Incluso si tuviera un agente diferente aquí y él fuera absolutamente enorme
y fuera más grande que 0. En un radio de 59, todavía podría seguir el camino y avanzaría
por la geometría, por lo que probablemente no sea algo que desee y PUEDE controlar eso, pero no aquí.
La otra cosa que puede establecer es la pendiente por la que puede caminar el agente.
Entonces, si solo muevo esto y miro aquí abajo, en esta sala de estar hay una pendiente desde esta plataforma hacia abajo
y podemos cambiar esto en el área de hornear. La 'pendiente máxima' que ese agente puede navegar está
configurada actualmente en 45.
Si dijimos que este agente simplemente no puede usar pendientes en absoluto y establecerlo en 0 y luego volverlo a
generar, verá que ahora no hay camino que el agente pueda tomar para llegar allí.
Ahora, al eliminar esto, es posible que también haya alterado el camino desde donde el agente se encuentra actualmente
en otro lugar y echemos un vistazo aquí. Puede ver que el camino sobre esta sección aquí ahora también se ha ido.
Ahora, incluso si presiono Reproducir en este punto, puedo hacer clic legítimamente en estas áreas, pero el agente no puede llegar allí.
Entonces, si hago clic aquí, él puede
moverse hacia allí, pero si
trato de hacer que venga aquí, seguirá el camino lo más que pueda hasta que se atasque.
Ahora puedes ver en este caso lo que
sucedió, está por aquí ahora, es porque trató de calcular el camino más corto para llegar hasta aquí y porque no pudo
ir de esta manera, dio la vuelta y luego se puso lo más cerca posible de allí, pero
no pudo alcanzarlo.
Entonces, si hacemos clic aquí, el agente puede venir aquí, pero, por
supuesto, no puede pasar por allí porque no hay
camino y si hacemos clic en esta área aquí, nuevamente no hay forma de
llegar allí, por lo que ganó ' t, aunque lo intente. Debajo, donde configura la pendiente máxima, también puede configurar la altura del escalón
y esto es
realmente genial si tiene un entorno con muchos escalones y desea que sus agentes se pongan
al tanto de las cosas. En este entorno,
no hay realmente ningún paso, pero déjame echar un vistazo.
Hay un contenedor aquí.
Ahora este contenedor, puede navegar por encima si
ya está encima. No hay camino para subir encima de este contenedor.
Si selecciono este contenedor (y solo voy a moverlo hacia allí, donde podamos verlo claramente, saquemos esa caja de la
carretera) y luego, si horneamos en este momento, verá que obtiene el arriba, pero todavía no podemos llegar
allí. Esta muy alto.
Así que voy a moverlo un poco
hacia el suelo, así que tal vez sobre ... allí y presione [Hornear]. Ahora, cuando presionamos Reproducir, veremos si podemos levantarnos encima.
Así que iremos allí y el agente se acercará a él, pero no puede levantarse encima. Así que está cerca, pero no del todo.
Hagamos ese paso un poco más alto.
No puedes dar un paso más alto que tus agentes.
Entonces Unity te detendrá si lo intentas y lo haces.
Ok, ahora lo que puedes ver es que ha dibujado el lado de la caja aquí, lo que nos muestra claramente que existe el camino
para ese paso.
Entonces, cuando presiono Reproducir y hago clic en el cuadro, aparecerá en la parte superior.
Así que ahí está y luego él también podrá volver a bajar.
Entonces es como la altura de salto, así como para subir escaleras. Solo para terminar con esta conferencia,
lo
que voy a hacer es volver a Hornear y aumentaremos nuestra pendiente nuevamente para que
podamos entrar a esa área y hornear eso. Ok, trae este camino de regreso aquí
y luego con el propio Agente (nuestro Agente Rojo) podemos simplemente Ctrl-D y hacer un montón de copias de él.
Ahora van a ser exactamente lo mismo.
Todos van a tener la misma etiqueta de 'ai', lo que significa que AgentManager los recogerá y les enviará
cualquier mensaje de clic, lo que establecerá su destino. Ahora, incluso antes de que se
muevan, su física no los hará chocar entre sí y tampoco utilizarán su propio sistema
de evitación para evitarse porque no hemos provocado que eso suceda.
Pero tan pronto como haga clic aquí, todos se separarán y ahora puede verlos a todos trabajando juntos
para obtener la misma ubicación.
Pero todo lo que están haciendo es tratar de llegar a donde han hecho clic mientras se evitan mutuamente.
Así que puedes tener tantos de estos pequeños tipos
rojos como quieras y el AgentManager los recogerá automáticamente por ti.
Muy bien, eso es lo básico para crear un solo agente y algunos de los matices del
mapa y configurar las áreas navegables allí. En la próxima conferencia, veremos cómo agregar un tipo de agente
diferente para que
tengamos 2 y restringir a dónde pueden ir.