Como mencioné en la conferencia anterior, desarrollar el A. YO. para una multitud de NPC es mucho
más simple de lo que la mayoría de la gente piensa. Esto se debe a que a partir de reglas
simples, se puede desarrollar un comportamiento complejo y, aunque no estamos programando los llamados cerebros de los NPC, todavía parecen moverse
con cierto nivel de inteligencia.
En esta conferencia, exploraremos más las multitudes con un grupo de personajes animados. Para seguir, descargue el 'StreetSceneStarter' que
viene con esta conferencia. Como verás cuando abras la escena (que se
llama Multitud) hay
un grupo de personas allí y están parados en un avión.
Si vas a la ventana de navegación, encontrarás que hay una malla de navegación que ya está siendo horneada
allí.
Por lo tanto, no buscamos un entorno complejo en este
momento, solo buscamos algo por lo que la gente pueda caminar.
Ahora cada personaje ha sido descargado de Mixamo y ya tienen una animación sobre ellos.
Entonces, si selecciona, por ejemplo, esta chica aquí (Girl_3), encontrará que tienen un Controlador Animador y
yo
configuraré ese controlador para usted.
Entonces, si hace doble clic para abrirlo y echar un vistazo
a lo que hay allí, encontrará que tienen una animación inactiva, una animación para caminar y una animación en ejecución, y estas animaciones
están configuradas para activarse entre sí.
Así que he creado transiciones de Idle a Walking y luego de regreso y lo
mismo para todos los demás estados.
Y luego, para cada uno, para las transiciones, tenemos disparadores.
Así que tenemos un activador 'isRunning', un activador 'isWalking' y un activador 'isIdle'
y los controlaremos y cuando se activen desde algún código. Los personajes en sí también tienen un
agente navmesh adjunto que encontrarás en el Inspector y su velocidad se establece en 2.
Entonces, en este caso, solo tienen animaciones que les hago caminar y permanecer inactivos. También hay una carrera, por lo que
son animaciones que avanzan.
No hay una configuración de 'strafe set' porque este movimiento no es particularmente complejo en la medida en
que
es bastante simple y se mueven en línea recta cuando
animan hacia adelante y si puedes coordinar la velocidad de tu Nav Mesh Agent con el velocidad que está
en la animación en sí misma, entonces es bastante creíble y es mucho más simple para nosotros.
Supongo que también quería mostrarte una forma diferente de hacerlo si no quieres esforzarte por
la complejidad de configurar un 'set de strafe', o si no tienes las habilidades para crear todo
esas diferentes animaciones.
Entonces, la velocidad se establece en 2 para todos ellos.
Ahora, si presionamos Reproducir, irán directamente a su animación Idle y están todos sincronizados, ¡por lo que parecen ser
un flash mob en este momento!
Para empezar, vamos a hacer que caminen hacia una meta.
Determinaremos el objetivo colocando un cubo en la escena.
Así que vaya a la Jerarquía y haga clic con el botón derecho y cree un nuevo cubo y luego lo trasladaremos a algún lugar de la malla
de navegación.
Así que vamos a ponerlo aquí.
Mientras estamos en eso, crearemos otro también para que puedan moverse entre ubicaciones, de modo que Ctrl-D y
luego muevan otro cubo de nuevo allí.
Se moverán entre estos dos objetivos. Podría cambiar el nombre de estos 'Objetivo' (para que sepamos
cuáles
son) y también puede eliminar los renderizadores en esos
si no desea verlos. También me libraré de su colisión porque no queremos que
eso interfiera con nada.
Ahora para encontrar los objetivos, los etiquetaremos.
Así que vaya al Inspector y con los objetivos seleccionados, en el menú desplegable Etiqueta,
márquelos como objetivo.
Si no tiene 'objetivo' como etiqueta, deberá agregarlo y luego establecerlo en 'objetivo'.
Ahora asegúrese de anotar la ortografía ... Este es el 'objetivo' en minúsculas, que es lo que haremos referencia en nuestro código.
Ahora vamos a agregar un código para controlar el movimiento de los personajes. Vaya a la carpeta Activos y allí encontrará un
script 'AIControl' que he incluido con este archivo de inicio. Solo abre eso y echa un
vistazo.
Ahora debería ser bastante familiar porque ya hemos hecho todas estas cosas antes.
En primer lugar, estamos configurando una variedad de ubicaciones de objetivos (que serán esos cubos) y luego
también estamos agarrando el NavMeshAgent que está en nuestros personajes.
En ese punto, en la función Inicio, vamos a obtener todas las ubicaciones que están en la escena que tienen la etiqueta 'objetivo'
y es por eso que es importante que tenga
'objetivo' etiquetado con exactamente la misma ortografía / en estos cubos y puedes agregar tantos como
quieras a la escena.
Luego, el agente se está apoderando de su
navmesh y luego el agente tiene su destino establecido en una ubicación aleatoria en esa matriz.
Entonces estamos usando un Aleatorio. Rango en la longitud de la matriz goalLocations solo para
extraer uno y luego obtener su posición, que luego será el destino del agente.
Así que guarde eso y vamos a adjuntarlo a cada uno de nuestros personajes. Así que selecciónelos todos y luego
arrastre y suelte el script 'AIControl' sobre ellos en el Inspector.
Ahora presione Reproducir y podrá ver a los personajes elegir una ubicación para ir.
Entonces, al azar, eligen su ubicación y se trasladan a ella.
Lo que también notará en este punto es que permanecen en la animación inactiva.
Entonces, si quieres sincronizar tu animación con el movimiento de tu personaje o lo que sea que estén haciendo,
debes activar una de esas transiciones que te mostré antes. Para hacer eso, volvamos al código y
necesitaremos tomar el componente animador que está en nuestro personaje, al igual que tuvimos que
tomar el agente para la malla de navegación. Entonces... 'Animator anim'; luego, en el Inicio,
también tendrás que configurarlo así que 'anim = this. GetComponent 'con Animator y luego al principio porque
están caminando de inmediato, podemos disparar. Para hacer
eso vamos 'anim. SetTrigger ("isWalking"); ' y guarda eso. Esto tiene que ser exactamente
la misma ortografía y mayúsculas que el animador. Estos valores aquí.
Entonces 'es' con una pequeña 'i' y 'W' con mayúscula. Ahora, si presionas Reproducir, verás que van directamente a la animación para caminar
y elegirán un objetivo al azar para ir y caminar hacia
él y luego caminar alrededor porque no se les dice que dejen de caminar una vez Ellos llegan allí.
Entonces, deja de jugar eso. Ahora, si desea otro objetivo, puede seleccionar su objetivo de la Jerarquía,
Ctrl-D para duplicarlo y luego puede agregar otro ...
y ya están codificados para elegirlos al azar.
Entonces descubrirás que al azar no han elegido el nuevo.
Simplemente presione Play nuevamente.
Ahí vamos, algunas personas tienen ahora.
Lo que vamos a hacer es cuando lleguen a su
ubicación aleatoria, queremos que elijan otra ubicación aleatoria y vayan a esa. Averiguar cuándo estás en una ubicación y luego elegir otra ubicación para ir es muy
similar a los pasos que tomamos cuando movíamos
el tanque y patrullamos entre diferentes puntos de referencia, por lo que es el mismo tipo de lógica.
Abre tu código. En la Actualización, lo que haremos será probar si hemos
llegado al
destino (o si estamos a cierta distancia del destino, nuestro objetivo) y luego elegiremos otro.
Entonces, el código, lo pegaré aquí y luego lo revisaré.
Dice "si el agente se mantiene a distancia", por lo que el Agente de
malla de navegación tiene este valor llamado "Distancia restante", que realiza un seguimiento de cuán cerca está el agente del objetivo de destino.
Ahora, si el agente se encuentra a <1 distancia del cubo del
objetivo, establecerá otra ubicación aleatoria y la configuración de la ubicación aleatoria (este código aquí)
es exactamente
el mismo código con el que elegimos la primera ubicación aleatoria, aquí arriba .
Estas son todas las líneas que necesita y si guarda eso
y vuelve a Unity y presiona
Reproducir, ahora encontrará que los agentes llegarán a una ubicación y luego se darán la vuelta y se moverán a otro lugar.
El giro del agente real ... si seleccionamos uno de ellos que se está moviendo, podrá ver si vamos a la vista de escena que
el código Nav Mesh Agent en sí mismo hace todo el giro por usted.
Anteriormente, cuando estábamos trabajando con el tanque y girándolo, tendríamos que
realizar un slerp y luego empujar el tanque hacia adelante.
Así que este es el navmesh haciendo todo eso por nosotros. Simplemente mantenemos la animación avanzando
y va a reaccionar muy bien para nosotros, sin que hagamos ningún esfuerzo adicional.
Ahora, si quieres una multitud más grande, entonces solo tienes que cambiar-seleccionar
a todos los personajes y solo Ctrl-D para duplicarlos y luego quizás quieras alejarlos unos de
otros un poco, así como así y luego si presionas
Reproducir, seguirán comportándose de la misma manera, porque tienen el mismo código ... están en la misma navmesh y tienen el mismo conjunto
de objetivos para elegir. Con lo que tenemos (y antes de pasar a la
próxima conferencia), lo que quiero es preparar
esta escena de la calle para que la gente se mueva hacia arriba y hacia abajo por la acera, como lo haría en una ciudad. En primer lugar, solo voy a eliminar este objetivo (porque no lo necesitamos) y tomaré este
objetivo y lo pondré en
un extremo de la calle y este objetivo y lo pondré en el
otro extremo. Así que solo
van a caminar arriba y abajo de esta parte de la acera. Para evitar que entren aquí (que es donde podría tener edificios o algo),
podemos simular esos edificios con un cubo.
Así que creemos
un cubo y lo traeré aquí y lo redimensionaremos ...
y cuando tenga algo
con lo que esté satisfecho, puede seleccionarlo, ir a la ventana de navegación y queremos que sea un área 'no transitable'.
Entonces, en la pestaña Objeto, puede convertirlo en
una Estática de navegación, pero en el Área de navegación, puede desplegarlo y decir que no se puede caminar.
Luego, cuando vuelvas a Hornear, esto excluirá
esto, de modo que cuando la gente comience a caminar (si presionamos Reproducir), subirán y bajarán por la acera ...
y evitando esta área aquí.
Algunos de ellos realmente escaparon,
podríamos decir, alrededor del borde para que puedas agarrar este cubo y hacerlo mucho más ancho
para que
llene todo ese bloque y eso los disuadirá de tomar el atajo y llevarlos por aquí.
Por supuesto, si comenzaste con todos tus personajes aquí, entonces no irán por todos lados.
Entonces, con eso redimensionado, si solo voy [Hornear] nuevamente y presiono Reproducir. Ahí están, volviendo
a ese lado y queremos que suban y bajen aquí para la próxima conferencia, en la que agregaremos algo de evitación de obstáculos.