En esta segunda conferencia sobre nodos secuenciales, veremos más de cerca cómo funcionan y algunos de los problemas que
puede tener cuando intenta crear los suyos propios y ejecutarlos.
Entonces, antes que nada, creemos un nuevo Árbol de Comportamiento basado en el 'Wander'. Así que crea uno nuevo.
Lo que suelo hacer es duplicar el que tengo y voy a llamar a esa Patrulla. BT.
Vamos a hacer que el bot patrulle alrededor del mapa, así que estableceremos destinos que estén en las
esquinas particulares.
Ahora se recuerda lo que había en Wander porque era un duplicado.
Lo que queremos hacer es poder decirle a dónde ir, en lugar de elegir un destino aleatorio.
Entonces, para eso, necesitaremos un nuevo método en nuestra clase de IA y lo llamaremos PickDestination
y le diremos que queremos que llegue a los puntos extremos que hemos establecido.
Entonces, comenzaremos en -100 y este es un
ejemplo de cómo puede pasar argumentos de la secuencia de comandos Behavior Tree a sus
métodos.
Entonces, cuando los declaras, pueden ser 'int' que estás enviando, pueden ser
'bool's, pueden ser' flotantes '.
Hagamos estos flotadores en realidad, lo pondré '. 0 'al final porque son ubicaciones en
el espacio y luego, después de eso, podemos reutilizar MoveToDestination porque MoveToDestination solo está monitoreando nuestro
robot moviéndose hacia un destino.
Si no tenía esto y acaba de tener PickDestination, PickDestination, PickDestination,
PickDestination, no se movería a ningún lado porque antes de tener la oportunidad de moverse, obtendría un nuevo
destino establecido en el Nav Mesh Agent. Aquí, MoveToDestination supervisa lo que está haciendo Nav Mesh Agent
en segundo plano, lo que le da tiempo para ir de una ubicación a otra.
Ahora habrá 4 de estos (solo copiaré eso y los pondré aquí) porque tenemos 4 rincones diferentes a los
que queremos ir.
Entonces comenzaremos en -100, -100 y
luego iremos a -100, 100 y luego iremos a 100, 100 y luego iremos a 100, -100 así.
Así que guarda eso.
Entonces quieres volver a la Unidad.
Desea seleccionar el droide y desea cambiar su árbol de comportamiento para
patrullar, así que arrastre y suelte la patrulla. BT en su árbol de comportamiento y verá aquí el nuevo que ha surgido.
Ahora, si espera un poco, recibirá un mensaje de error que aparecerá y estos se volverán rojos si no
existen como método en su clase de IA. Ya escribí el mío, así que lo encontré y está bien.
Incluso si tiene un error de ortografía en los nombres de sus
métodos, lo mostrará
y, por lo tanto, asegúrese de haber verificado que sea el mismo en cualquier lugar.
Lo mismo ocurre con sus parámetros.
Estamos enviando flotadores.
Tiene que estar esperando un flotador dentro de la clase de IA.
Entonces, en su clase de IA (porque probablemente esté viendo errores en este
momento,
abrámoslo y echemos un vistazo, aquí está, aquí) sobre PickRandomDestination.
Creé un nuevo método llamado PickDestination con un valor X y Z para nuestro mapa y
luego estamos usando 'dest' como un nuevo vector que está en X y Z, en lugar de ser un
valor aleatorio.
Y se establece en
0 porque nuestro plano de tierra está sentado en 0.
Si su plan de tierra no está en 0, es
posible que desee ajustar esto y luego ejecutamos SetDestination y regresamos con un éxito y eso es
todo lo que necesitamos hacer, ahora patrullar porque el código de MoveToDestination ya está haciendo
lo que necesitamos. hacer.
Así que agréguelo, guárdelo y luego volvamos a Unity y presione Reproducir y veremos al Droid en acción y si
hace clic en el Droid en la Jerarquía, podrá ver cada uno de estos nodos hoja ejecutándose mientras el droide se
abre camino por el camino. Entonces MoveToDestination se está ejecutando actualmente.
Se desplazará a PickDestination (o simplemente lo hizo) hasta el siguiente MoveToDestination cuando llegue a cada
punto de ruta que está configurando a través del código para que vaya y porque esta 'Repetir raíz' está marcada en la
parte superior, simplemente dará vueltas y vueltas y vueltas y vueltas alrededor de esta secuencia, que es lo que
quieres que haga.
Entonces, con todo eso funcionando bien, obliguemos a que ocurra un error para que pueda ver lo que sucede.
Así que vayamos al script de AI y estamos buscando PickDestination.
Entonces PickDestination tiene al final una 'Tarea. Actual. Tener éxito();'.
Esta NO es una declaración de devolución, por lo que no lo excluye de este método y puede llamarlo desde
cualquier lugar dentro del código. Simplemente enviará un éxito nuevamente al árbol de comportamiento.
Por lo tanto, puede omitirlo
y no obtendrá un error, que es lo que haremos. Solo vamos a comentarlo y guardarlo y luego volveremos
a Unity y presionaremos Play.
Ahora vamos a echar un vistazo a lo que estamos obteniendo aquí.
Puede ver que PickDestination se ha ejecutado.
¿Ves que es azul?
No ha terminado de correr.
Es verde cuando termina de ejecutarse.
Ahora probablemente te estés preguntando "Bueno, el bot todavía se está moviendo, todavía se está moviendo hacia el destino. "y se moverá al destino porque
el código del Agente Nav Mesh es lo que lo está impulsando hacia adelante.
Después de que nos vamos 'agente. SetDestination ', el agente lo buscará.
Es el MoveToDestination el que está sentado allí monitoreando, esperando que llegue a
donde tiene que ir, para que luego
pueda elegir el destino SIGUIENTE, pero ahora puede ver que ha terminado ese 1 camino encontrado
hasta aquí, se detuvo. El árbol de comportamiento completo se ha detenido por completo.
Para que tener éxito sea absolutamente necesario y si encuentra que sus árboles de comportamiento simplemente se están deteniendo, se ha
olvidado de poner un éxito o un fracaso.
Ahora también puedes poner un Fallo aquí, y porque
está en repetición, simplemente girará, girará, girará y seguirá fallando constantemente, por lo que se moverá a
través de las secuencias hasta que llegue a un Fallo y luego te disparará y realmente podemos forzar que
eso suceda y echar un vistazo.
Así que volvamos al código
y voy a volver
a colocar este Éxito para que
podamos avanzar, pero lo que quiero hacer es tener este aquí, el PickRandomDestination.
Vamos a configurar eso para fallar. Entonces, para Panda, es así, eso devolverá un 'error' cuando intentemos hacer
un PickRandomDestination.
Vayamos a nuestra patrulla
y, como la segunda configuración de destino, nos desharemos de los parámetros y lo pondremos como PickRandomDestination como lo
hicimos antes, cuando estábamos deambulando. Así que guárdelo y
regresemos aquí,
presione Reproducir y observemos el árbol. Entonces PickDestination ahora ha tenido éxito (es verde) y nos estamos
mudando a nuestro destino, por lo que esto seguirá funcionando hasta que el bot llegue a la esquina, momento
en el que intentará ejecutar este PickRandomDestination que sabemos que va a fallar.
Así que
está llegando a la esquina, se detuvo y allí, puedes ver que está deambulando tratando
de girarse porque ese es el 'agente'. SetDestination 'recibe llamadas constantemente, en este PickDestination y luego intenta pasar a
él y está eligiendo el mismo destino al que ya fuimos.
Entonces, cuando intentamos y hacemos un MoveDestination, ya estamos allí.
Luego vamos y hacemos un PickDestination que
falla inmediatamente y porque estamos dando vueltas alrededor de esta ruta, está atascado.
Puede ver que está atascado y puede ver que los valores de Éxito y Falla se mueven muy rápido allí arriba y debido a que es
rojo, sabe que es donde tiene un punto de falla en su árbol y es posible que desee un punto de falla en
su árbol, si eso es lo que va a hacer la secuencia. Si una determinada condición NO
se cumple en la secuencia, entonces no desea continuar con la secuencia.
Así que saquemos eso de allí y regresemos y reparemos nuestro código.
Entonces, aquí, solo presionaré Ctrl-Z para recuperar lo que tenía antes y volver a mi script AI, voy a configurar mi
destino aleatorio de nuevo a tener éxito ... como eso.
Consideremos ahora una secuencia de ataque.
Entonces, en esta secuencia, voy a tener 3 comportamientos diferentes.
Queremos que el bot mismo pueda girar hacia un destino particular, no MOVERSE a ese destino.
Entonces eso implicará establecer el punto que queremos mirar y luego dar la
vuelta y luego, una vez que eso haya sucedido, podemos hacer una acción de disparo / Ok, entonces el Árbol
de comportamiento para eso, llámelo 'Ataque'. BT 'y allí, quieres algo que se vea así.
Entonces
tenemos nuestra 'Raíz', tenemos nuestra 'secuencia', tenemos 'TargetPlayer', 'LookAtTarget' y luego 'Fire'.
Ahora, esto significa que cada uno de estos debe ser un método en nuestra clase de IA. Para cada uno de los nodos hoja en
el nuevo árbol de ataque, debe haber un método correspondiente.
En primer lugar, tengo 'TargetPlayer'.
Todo lo que está haciendo es configurar un Vector3 que se declara en la parte superior de nuestro programa en la posición del jugador.
Eso es todo lo que está haciendo, así que solo está configurando el valor de 'objetivo'. Ahora hacerlo de esta manera significa
que podríamos tener otros nodos de hoja que digan 'mirar al árbol' o 'mirar al azar' y poder
establecer este valor 'objetivo' sin movernos hacia él.
Después de eso, tengo un 'LookAtTarget', por lo que es genérico y cambiará el bot para
que esté orientado hacia donde se establezca ese objetivo.
Así que solo desplázate un poco hacia arriba y hazlo un poco más grande para que puedas ver todo.
Este es más o menos el mismo código que hemos usado antes (lo pondré en
la siguiente línea para
usted, ahí vamos) para apuntar a algo y avanzar hacia él, pero
en este caso, lo estamos apuntando y girando Hacia eso. Entonces verás aquí el conocido
Quaternion. Código de Slerp que hemos
usado antes y nuestro cálculo del vector de dirección. Entonces... dirección... Slerp hacia ella.
Ahora tengo una depuración. Inicie sesión aquí, del cual me voy a deshacer porque no
lo necesitamos y en su lugar hay una 'Tarea'. isInspected '. Esta línea aquí nos permitirá ver
el ángulo actual entre el bot y dónde está nuestro jugador (en este caso, el objetivo) en la línea de depuración dentro
del Árbol de comportamiento, lo cual es fantástico porque realmente podemos ver que
este valor cambia a medida que el bot gira y luego decimos al final, si el ángulo está dentro de los 5 grados, entonces esta tarea ha
tenido éxito.
Así que seguiremos girando, seguiremos girando, seguiremos girando y luego obtendremos un 'éxito' en
esta tarea en particular porque no ha habido un fallo y hasta que el Árbol del
Comportamiento haya recibido un fallo, seguirá funcionando estar ejecutando esto. Ahora, después de mirar el 'objetivo', dispararemos y el código de disparo
es bastante familiar. En este
caso, no será el mismo tipo de configuración que tenemos aquí donde tienes
un vacío público y luego un regreso de Succeed.
Lo que también puede hacer con estos métodos para estos nodos hoja es hacer que devuelvan un valor 'verdadero' o 'falso' para que luego
pueda verificar si sucedieron o no y realizar una pequeña lógica booleana en el propio árbol de comportamiento, incluso aunque realmente
no estamos
haciendo eso con esto, en este caso, pero
verá que sucederá en el futuro y
si no lo hace, podría configurar esto como la misma configuración que los otros con el éxito que
se devuelve en lugar.
Ahora aquí, solo estamos obteniendo la prefabrica de viñetas y luego instanciando una copia al final de la viñeta. Nuevamente lo mismo que hicimos con la demostración de los
pequeños tanques, mucho antes en el curso. Luego estamos agregando una fuerza a la
bala, solo para impulsarla en el entorno mundial.
Bien, así que con esas cosas hechas, vamos a guardarlo. Guarde su script AI y su script de ataque y
regrese a Unity.
Así que solo seleccionaré el Droid, para que podamos ver su Árbol de Comportamiento, ponga 'Ataque. BT 'aquí como el guión y luego, cuando
estés listo, presiona Reproducir y el Droid gira hacia nuestro droide, está bien. Por el momento no le preocupan las paredes ni nada, solo gira
(eso es lo que le hemos
dicho que haga) a donde sabe que está nuestro jugador y si muevo al
jugador, seguirá girando y
disparando así. ..
Ahora no se tiene en cuenta la velocidad de los disparos en nuestra secuencia actual.
Simplemente va a pasar rápidamente por todo el árbol, apuntando constantemente al jugador, mirando al
jugador y luego disparando.
Si desea agregar una "espera" aquí, puede hacerlo con bastante facilidad en este sistema Behavior Tree.
Si volvemos a nuestro script de ataque aquí, es que hay 'esperas' incorporadas, por
lo que podemos poner 'Esperar (0. 5) 'y esperará medio segundo antes de disparar y luego volverá
a girar y esperará medio segundo antes de disparar. Así que solo guarde eso y regrese a Unity y presione Reproducir.
Ahora puede ver que habrá medio segundo entre cada disparo y, por lo
tanto, puede agregar retrasos agradables en el propio árbol de comportamiento.
Todo bien.
Así que dejaremos esta conferencia aquí. En la próxima conferencia, comenzaremos
a agregar algunas condiciones y el bot realmente debería probar si puede ver al jugador antes de que
comience a disparar.
Entonces haremos eso a continuación.