En esta conferencia, seguirá a medida que comencemos a explorar los árboles de comportamiento y comencemos con
la configuración de un árbol de comportamiento muy simple y observemos el nodo Secuencia.
Ahora, si obtiene el archivo de inicio que viene con esta conferencia y lo
abre, encontrará en la escena RobotGuard, esta escena en particular. Tenemos un guardia negro (él será la inteligencia artificial,
el NPC) y uno verde que puedes manejar con las teclas de flecha.
Entonces, si presiona Reproducir, encontrará que puede conducir el robot verde.
Ya está configurado como NavMesh, este
entorno en particular y si golpeas la barra espaciadora podrás disparar. Si golpeas el colisionador que está en
el bot mismo, también
notarás que la barra de salud en la vista de Juego (aquí) se cae.
También está programado para volver a subir gradualmente para que el bot (si puede alejarse de usted)
pueda curarse a sí mismo.
Echemos un vistazo rápido a la forma en que se configura todo este proyecto.
El personaje negro se llama Droid en la Jerarquía. Si lo selecciona, verá que tiene un Colisionador de Esferas a su alrededor y
esto
se está utilizando para determinar cuándo las balas lo golpean y
esa es la única razón por la que está allí.
Aparte de eso, el bot está siendo manejado por un NavMesh y ves que
he agregado un Nav Mesh Agent aquí. También ajusté la velocidad y la distancia de frenado,
así que tengo la distancia de frenado como 30 porque más adelante queremos que el bot nos
siga y no queremos que se acerque demasiado cuando se acerque. el jugador.
También hay una A. YO. script en el bot, que es
bastante simple en este punto y ya está configurado con un punto de generación para las balas, que estará sentado
aquí como un pequeño cubo adjunto que tengo aquí como un punto de generación de torreta y tiene los proyectiles que utilizamos en el ejemplo
del tanque mucho antes en este curso, así que puede disparar.
Actualmente no disparará porque no lo hemos programado con ningún comportamiento, por lo que simplemente se quedará allí y
la barra de salud se reducirá cuando golpeemos su colisionador.
Entonces, si echamos un vistazo al código que está allí, encontraremos todas las cosas habituales
que hemos usado en el pasado. Así que tenemos una transformación pública del jugador para que
el bot sepa dónde está
el jugador, tenemos su punto de generación, tenemos su prefabricado de balas, tenemos nuestro Agente
de malla de navegación, destinos, nosotros ' Tenemos un objetivo que usaremos un poco más tarde para mover el bot, salud, velocidad
de rotación, rango visible, rango de
disparo y también tenemos este control deslizante, que es nuestra barra de salud.
Entonces el control deslizante es un objeto de interfaz de usuario que es ... aquí atrás...
puede verlo en la vista de Juego en
la pantalla y en la Jerarquía, debajo del Lienzo, encontrará un control deslizante llamado DroidHealth que se ha
configurado.
El control deslizante tiene un valor que va de 0 a 100 y
es este valor aquí (el valor justo en la parte inferior) que configuramos en el código lo
que hará que nuestra barra de salud baje y suba. Entonces, de vuelta en ese código, si pasamos a aquí
hay un método UpdateHealth que se llama cada medio segundo, gracias a un InvokeRepeating sentado en el Inicio.
Entonces, esto solo va a marcar y probar si nuestra salud ha bajado a menos de 100,
luego solo lo marcará y reparará el bot.
Ahora la posición de esa barra de salud (si no has hecho algo así antes) está en la Actualización.
Mantendrá ese control deslizante en la pantalla (así como
en la interfaz gráfica de usuario) justo encima de donde está sentado el bot.
Entonces, a medida que el bot se mueve,
se adhiere a él básicamente, pero debido a que la interfaz gráfica de usuario y el bot están en 2 espacios
diferentes (uno es un
plano 2D y el otro un espacio 3D) necesitamos convertir las coordenadas de la posición del bot en sí (que es esta parte aquí)
en coordenadas de pantalla con una cámara. principal. WorldToScreenPoint y luego el resto del
código se encarga de asegurarse de que la barra de salud se mantenga por encima de ese bot y se puede ver que
el valor de las barras de salud también se establece en la Actualización justo aquí.
Ahora más abajo está el código para detectar un impacto de bala, que es nuestro código OnCollisionEnter, que solo verifica
que el bot haya sido golpeado por algo que está etiquetado con el nombre 'bala' y luego la
salud se reduce en 10.
Entonces, realmente no hay mucho código allí porque el agente no está haciendo nada en este momento.
Ok, entonces esa es la A. YO. código.
Ahora, la otra cosa a tener en cuenta es que el bot verde (o nuestro personaje, el personaje jugador) está impulsado
por un código de Drive que está adjunto y lo hemos usado antes solo para
mover un objeto con las teclas de flecha. En los Activos, encontrará una carpeta llamada
PandaBehavior y este es el
complemento Panda Behavior Trees, que puede obtener de Asset Store (aquí está, aquí).
Hay una versión gratuita y hay una versión de pago con algunas características adicionales, pero es
bueno que tengamos esta versión gratuita para jugar y que pueda ver su valor.
Ahora, mientras estoy hablando de esto, hay una serie de activos en la tienda de activos para
crear árboles de comportamiento y no son gratuitos y
también incluyen interfaces gráficas de usuario, por lo que serían mucho más potentes de lo que somos aprenderá aquí porque
puede usar
nodos de arrastrar y soltar y crear un árbol visualmente para el comportamiento
y luego vincularlo con el comportamiento de sus bots particulares.
Sin embargo, si estamos aquí, cavando y escribiendo código de secuencias de comandos para el árbol de comportamiento, le dará una
mejor idea de cómo están conectadas las cosas y cómo funcionan los árboles de comportamiento.
Así que esta es una muy buena introducción
a Behavior Trees y luego, si desea seguir adelante y comprar uno de esos otros
activos que tiene la interfaz gráfica de usuario, siéntase libre y ya comprenderá qué son los Behavior Trees
y cómo crear los más complejos
Ahora esto ya está incluido y descargado con el archivo que acaba de abrir, por lo que
no necesita volver a hacerlo.
Comencemos creando un script realmente simple que hará que el Droid divague. Al programar el 'deambular', si piensa
en NavMeshes, la forma en que lo haría es elegir un destino aleatorio en
NavMesh y luego hacer que el robot se mueva hacia él.
Ahora NavMesh está haciendo todo ese trabajo por nosotros.
Lo único que necesitamos verificar realmente es si el bot ha terminado de llegar a su punto de destino y
podemos incluir todas estas funcionalidades en un Árbol de Comportamiento realmente simple.
Entonces, antes que nada, crearemos el Árbol de Comportamiento. En Proyecto, despliegue "Crear". Ahora no lo verá
aquí porque está fuera de mi pantalla y está justo en la parte inferior cuando tiene
el complemento Panda BT, dirá 'Panda BT Script'.
Así que cree uno nuevo y lo agregaré al activo.
Llamémoslo 'Wander. BT '. Realmente no importa cómo lo llames, siempre y cuando sepas lo
que es.
Así que ahí está tu Wander. BT.
Ahora en esto (abramos esto) obtendrás una estructura muy simple de un árbol muy básico.
En primer lugar, el nivel superior del árbol que va a ejecutar debe llamarse el nodo 'Raíz' y puede
ver que allí
y debajo, hay un éxito.
Entonces este es un nodo raíz, todo por sí mismo.
No tiene hijos y está funcionando con éxito, por lo que siempre será cierto. Dejará que el árbol
continúe funcionando.
Ahora, esto se llama Wander, pero todavía lo llamaremos 'Root' porque es el primer nodo de nuestro árbol.
A medida que trabajamos a través del árbol, cada rama sucesiva y estructura de nodo tiene que ser tabulada en una
para que funcione.
Entonces, si hice eso, sería un error porque no puede tener 2 nodos raíz.
Entonces se vería así, donde tienes tu nodo inicial y luego una rama yendo directamente
hacia el éxito,
pero no vamos a hacer esto. Vamos a deshacernos del éxito y reemplazarlo con una 'secuencia'.
Entonces, estas palabras son palabras que el compilador de scripts de Panda BT sabe qué son y sabe que después de colocar un
nodo de 'secuencia', le daremos una serie de nodos hoja o incluso podríamos darle un ' secuencia 'o un' selector ',
si desea profundizar más y más en el árbol.
No estamos en este punto, por lo que le daremos 2 nodos secundarios que serán las acciones que queremos que
tome nuestro bot.
Entonces, el primero llamaremos
PickRandomDestination y el segundo llamaremos MoveToDestination. La ortografía de estos debe ser perfecta y quiero decir que en la forma
en que ESTA ortografía debe coincidir con el nombre de un método que ahora va a escribir en
su A. YO. archivo.
Si no es así, obviamente obtendrá un error.
Así que solo tenga en cuenta cómo ha deletreado estas dos cosas, que también las ha tabulado.
Bien, ese es el final de este árbol de comportamiento.
Así que solo guarde eso, regrese a Unity y vamos a abrir el archivo de script AI.
Aquí es donde agregaremos 2 métodos que corresponden a esos 2 nodos de hoja que acabamos de
agregar en el Árbol de Comportamiento. Entonces aquí abajo, vamos a agregar esto.
El primero se llama PickRandomDestination, que se escribe exactamente igual en el árbol de Beahvior aquí.
Ahora de vuelta en la IA. cs, estamos creando el
método PickRandomDestination y notamos que de antemano, está precedido por esta pequeña [Tarea] y esto
le está diciendo al Behavior Tree (el sistema
Panda BT) que lo tome como una tarea, que lo vinculará de nuevo a el nodo hoja en su archivo BT.
Lo sabe porque en la parte superior del código
(si volvemos aquí) tenemos nuestra biblioteca Panda incluida.
Correcto.
Entonces, volvamos aquí abajo.
Todo lo que estamos haciendo en PickRandomDestination es crear algún punto en nuestro mapa que esté dentro de un rango de
-100 a 100.
Si echas un vistazo al avión que está en la escena, en realidad está sentado a 0, 0,
0 y, por lo tanto, nos mantendremos en 0 en la dirección y, pero solo encontraremos un punto que esté dentro del radio de
100 del bot mismo y luego usaremos este punto como destino para el Nav Mesh Agent. En este punto, estamos devolviendo
una tarea 'Triunfar'.
Por lo tanto, debe enviar un mensaje de éxito al Árbol
de comportamiento, de lo contrario no seguirá ejecutando su secuencia.
Ahora puede ver esto en la siguiente tarea, que es MoveToDestination y en
este código, también he incluido información de depuración que es bastante útil cuando ejecuta un árbol de comportamiento, para ver dónde
funcionan las cosas y cuándo ' No estás trabajando.
Esto significa que cuando la tarea se está inspeccionando (y eso está en el
depurador que le mostraré en un momento para esto), luego imprimirá (junto a esta tarea,
en el depurador) una cadena, formateada como 't = 'y luego esto aquí e imprimir la hora y este formato de cadena, puede
poner cualquier cosa aquí.
Entonces, más adelante, cuando estemos girando el bot a través de ciertos ángulos, podría
colocar el ángulo aquí para que pueda depurar fácilmente a medida que avanza, donde las cosas podrían no funcionar para usted.
Así que esa es una pequeña característica de esto.
Ahora, la otra cosa que tenemos aquí, que en realidad está haciendo todo el
trabajo en esta tarea en particular, es probar si el agente ha llegado a su destino.
Entonces estamos haciendo un 'agente. restantesDistancia <= agente. stoppingDistance 'y eso
dice que estoy en mi destino. Ahora también estamos probando a ese agente. pathPending es falso.
Si agente. pathPending es verdadero, eso significa que Nav
Mesh Agent no ha terminado de calcular una ruta y si intenta ejecutar estas tareas fuera de sincronización con la actualización NavMesh, entonces
esta tarea podría fallar, en lugar de tener éxito.
Entonces, cuando configura este destino aquí, no puede estar seguro de que ha calculado la ruta y, por lo tanto, comenzará
a moverse hacia él, antes de que se ejecute esta tarea aquí abajo.
Es por eso que tengo esto aquí y volverá y lo intentará de nuevo.
Así que siempre es bueno tener eso. Si lo omite, probablemente encontrará un
pequeño error en sus cálculos de NavMesh cuando intente hacerlo.
De todos modos, si hemos llegado al destino, entonces estamos devolviendo un 'éxito' al árbol de comportamiento que dice que
hemos terminado y eso haría que ambas cosas terminaran, lo que haría que todo el
árbol terminara.
Bien, ahora lo tienes,
guárdalo y volveremos a la Unidad.
Iremos al Droid. Lo que vas a hacer es agregar el árbol de comportamiento.
Entonces, antes que nada, vaya a 'Agregar componente> Comportamiento Panda'.
Agregue eso y luego tiene un 'Conde'. Esta es la cantidad de
scripts de Behavior Tree que ha agregado a su bot y puede poner más de 1, solo estamos usando 1
en este momento.
Tendrás un 'BT Script 0' escrito aquí. Ahí es donde arrastramos y soltamos nuestro Wander. BT, así
que arrástralo hasta allí. Inmediatamente podrá ver el pequeño árbol que ha escrito en ese archivo
y, a
medida que lo ejecutemos, verá que estas cosas se ejecutan y cambian de color.
Entonces aquí es donde ocurre la depuración, en el Inspector.
Entonces presione Play para ejecutar esto y verá que el agente comienza a moverse de inmediato.
Puede ver en la depuración que PickRandomDestination se ejecutó y tuvo
éxito porque
es verde y luego verá MoveToDestination.
¿Ves cómo tiene un pequeño temporizador al lado?
Ese es nuestro código de depuración que aparece, para que sepa que se está ejecutando al hacerlo. Por el momento, también tenemos este árbol
marcado como 'Repetir raíz', por lo que continuará vagando y vagando
y vagando y eso es lo
que está haciendo este agente. Es elegir un destino aleatorio y luego moverse
para moverse al destino.
Ahora, la otra cosa que también está sucediendo con este árbol de comportamiento es su actualización.
Entonces, lo que sucede con todos esos nodos es que se procesan cada actualización, 1 nodo a la vez
(y puede cambiar esto a diferentes tipos de actualizaciones aquí). La forma en que se actualiza un
Árbol de Comportamiento se llama 'Tick'. Entonces, algunos árboles de comportamiento podrás configurarlo a mano y decir que quieres un tic
de 1 segundo.
En este caso, está vinculado a Unity MonoBehaviour para que marque y se actualice con, en este caso,
actualización, que podría ser todo lo que desee. Dejaremos este ejercicio aquí y veremos más de
cerca las Secuencias en la próxima conferencia.