‫Hola y bienvenido.
‫En esta lección, vamos a considerar tener alguna opción en nuestros árboles de comportamiento, de modo que pueda
‫hacer que un enemigo corra hacia mí y, si me pierde de vista, venga a mi última ubicación conocida realizando básicamente
‫dos comportamientos por persecución y luego Investigo el comportamiento.
‫Profundicemos y veamos cómo se puede lograr.
‫Uso de árboles de comportamiento.
‫Entonces, si bien este comportamiento de patrullaje es muy instructivo, no es realmente el tipo de comportamiento que
‫queremos implementar.
‫Lo que preferiríamos tener es algo como lo siguiente.
‫Cuando podemos ver al jugador, vamos y nos movemos lo más cerca posible de él.
‫Y cuando el jugador se pierde de vista, intentamos movernos a la última ubicación conocida del jugador para
‫encontrarlo.
‫Y una vez que hayamos agotado esa opción, tal vez volvamos a un lugar diferente, o tal vez
‫nos quedemos allí por ahora.
‫Entonces, ¿cómo podemos lograr esto?
‫Bueno, por el momento, no tenemos forma de lograr esto con una secuencia de acciones.
‫Tenemos que hacer una elección basada en los datos que tenemos disponibles.
‫Tenemos que elegir entre si podemos ver al jugador o si no, si tenemos la última ubicación
‫conocida del jugador o no, ese tipo de cosas.
‫Entonces, para hacer esto, necesitamos un nuevo tipo de nodo en el árbol de comportamiento llamado nota selectora.
‫Entonces, si hacemos clic derecho y miramos nuestros compuestos, una de las opciones es el selector.
‫Ahora el selector a diferencia de la secuencia se ejecuta de esta manera.
‫Si tiene un montón de tareas debajo del selector, se ejecutará hasta que la primera tenga éxito.
‫Y básicamente es esperar que todos fracasen hasta que uno de ellos tenga éxito.
‫Ahora la secuencia hizo lo contrario.
‫Los ejecuta todos hasta que uno de ellos falla.
‫Entonces, ¿por qué es eso útil?
‫¿Por qué es útil que el selector ejecute uno de ellos hasta que uno de ellos tenga éxito?
‫Porque básicamente queremos que elija la primera opción que sea viable.
‫Ahora, la forma en que vamos a hacer esto no es ejecutando tareas debajo del selector,
‫sino ejecutando secuencias debajo del selector.
‫Entonces, en el nivel raíz, vamos a hacer una nota selectora.
‫Y luego, debajo de eso, dejemos esta secuencia a un lado y creemos otras secuencias.
‫Vamos a tener una secuencia aquí.
‫Y lo que podemos hacer es cambiar el nombre de la secuencia de secuencia a algo como Chase.
‫Y luego podemos agregar otra secuencia aquí, que estará en la línea de investigación.
‫Y estos son básicamente nuestros dos comportamientos entre los que queremos poder elegir.
‫Y para que fallen, podemos agregar cosas a los nodos llamados decoradores.
‫Entonces, si hace clic derecho en un nodo y va a agregar un decorador, puede ver aquí que hay un montón de opciones aquí.
‫Y básicamente cambian la forma en que funciona este nodo.
‫Entonces pueden hacerlo de varias maneras.
‫Por ejemplo, tenemos este bucle condicional que le permite repetir todas las acciones de nuevo en
‫la secuencia tantas veces como este condicional sea correcto.
‫Tenemos otras cosas aquí, como una verificación de código, que tiene que ver con la visibilidad y otras cosas maravillosas.
‫Solo tenemos un bucle puro.
‫Tenemos un límite de tiempo.
‫Entonces, esto solo puede permanecer dentro de esta secuencia durante un cierto período de tiempo.
‫Básicamente muchas cosas que modifican el comportamiento de esta secuencia.
‫Pero el que nos interesa es la pizarra, porque esta es una condición de pizarra.
‫Y como puede ver en la escritura debajo, el valor predeterminado es algo similar a ¿está
‫configurado este acto propio?
‫Y si esto no está configurado, automáticamente este nodo y todo lo que está debajo fallará, lo que significa que
‫nuestro selector pasará a la opción dos, que es investigar.
‫Entonces, en este caso, realmente queremos cambiar esto.
‫Queremos cambiar cómo funciona esto.
‫Entonces, nuestra ubicación del jugador, queremos que sea tal que solo se establezca cuando el jugador esté visible.
‫Y luego queremos agregar una nueva variable aquí nuevamente, un vector que será la última ubicación conocida del jugador y
‫la última ubicación conocida del jugador cuando el jugador esté visible será la misma.
‫Pero una vez que el jugador se vuelve invisible, la ubicación del jugador se desarma.
‫Y la última ubicación conocida del jugador es a dónde queremos ir.
‫Así que podemos hacer esto yendo a nuestra condición base de Blackboard y simplemente cambiándola para que
‫la consulta sea Sí.
‫Pero lo que queremos que esté establecido es la ubicación del jugador.
‫Entonces, si la ubicación de juego está configurada, entonces vamos a perseguir y vamos a darle a
‫Chase haciendo básicamente solo un movimiento hacia y nos moveremos a la ubicación del jugador.
‫Así que ahora no estamos haciendo mucho más bajo la secuencia.
‫Entonces, de hecho, también podría poner esta condición de pizarra directamente en movimiento.
‫Pero como es posible que queramos hacer otras cosas, como filmar, lo dejaré como una secuencia por
‫ahora.
‫Entonces tenemos esta investigación.
‫Investigar básicamente también hará un movimiento, pero en lugar de moverse a la ubicación
‫del jugador, se moverá a la última ubicación conocida del jugador.
‫Y pueden ver que no tenemos una condición sobre eso porque esto fracasa si esta condición falla.
‫Una cosa importante a tener en cuenta sobre estas condiciones de pizarra es que, de forma predeterminada, una vez que
‫hayamos tomado la decisión de comenzar a ejecutar este nodo, no vamos a volver a evaluarlo.
‫Entonces, si por alguna razón perdemos de vista al jugador mientras nos movemos a la ubicación de ese
‫jugador, seguiremos intentando llegar allí.
‫Entonces, si quisiéramos poder abortar la ejecución de esta nota, entonces hay una opción para eso.
‫Si va al control de flujo, notifica a los observadores y está debajo.
‫El observador aborta en el momento establecido en ninguno.
‫Pero puede seleccionar entre un par de opciones.
‫Puede establecerlo en uno mismo.
‫Entonces, esto significa que si esta condición de repente se vuelve falsa, detenga lo que esté haciendo y vuelva a
‫evaluar su selector y vea.
‫Tal vez ahora necesitemos hacer la nota de investigación.
‫La otra opción aquí es de menor prioridad y puede ver que ha cambiado lo que está resaltado aquí.
‫Está diciendo que si de repente esta condición de la pizarra se vuelve cierta, detengamos cualquier otra cosa que estuviéramos haciendo
‫y comencemos a ejecutar esta condición de persecución.
‫Y luego la opción final es ambos.
‫Y este es el que queremos.
‫Básicamente, está diciendo que esta condición basada en la pizarra, si se cumple, comenzamos a ejecutar
‫la secuencia inmediatamente.
‫Si se vuelve falso, dejamos de ejecutarlo inmediatamente o dejamos de ejecutar cualquier otra cosa que estuviera pasando.
‫Básicamente, solo queremos ir siempre y hacer cualquier camino que dicte esta condición de pizarra.
‫Entonces, con suerte, tiene sentido que el observador informe que detiene las cosas en acción; de lo contrario, esperará
‫hasta que finalice la acción antes de volver a evaluar.
‫Realmente, ahora queremos seguir adelante e implementar nuestra última ubicación conocida y ubicación de reproducción porque, por el momento, si pasamos
‫a nuestro C++ y nos damos un poco más de espacio, entonces pueden ver que solo estamos configurando
‫esto ubicación de juego en Begin Play.
‫Lo ideal sería que hiciéramos esto cada vez que tuviéramos línea de visión con nuestro grupo de jugadores, por lo que
‫podemos descomentar nuestro código de línea de visión aquí.
‫Y probablemente también queramos descomentar el código else.
‫Pero en este caso no vamos a despejar el foco y detener el movimiento directamente.
‫Puedo seguir adelante y eliminarlos por completo porque.
‫Esa no es la forma en que estamos haciendo las cosas en este momento.
‫En cambio, lo que queremos hacer, si elimino el código, es que queremos estar aquí configurando la ubicación del
‫jugador.
‫También queremos establecer la última ubicación conocida allí.
‫Y de lo contrario, queremos borrar la ubicación del jugador.
‫Ahora, para hacer eso, tenemos una función disponible para nosotros, que es en lugar del valor establecido
‫como vector, si continuamos y abrimos nuestro componente de pizarra dot h, hay un valor claro.
‫Y esto solo toma el nombre f, no necesita tomar un tipo ni nada porque estamos borrando
‫completamente lo que haya en esa variable.
‫Así que aquí tengo un desafío para que completes nuestra marca.
‫Establezca las dos variables cuando la línea de visión.
‫Básicamente, complete este primer bit de la declaración F y luego borre la ubicación del jugador cuando tengamos el
‫resto.
‫Entonces, cuando perdemos la línea de visión, ya no tenemos un lugar de juego.
‫Reduce la velocidad del enemigo que hay en el mundo para que puedas alejarte de él más fácilmente.
‫Y luego verifique la funcionalidad, verifique que pueda esconderse detrás de una esquina y que él vaya a la última
‫ubicación conocida para tratar de encontrarlo.
‫Pausa el video y prueba esto.
‫Bueno.
‫Bienvenido de nuevo.
‫Así que vamos a darle una oportunidad a esto.
‫En primer lugar, estamos configurando la ubicación de juego.
‫Voy a mover eso fuera del juego inicial y moverlo aquí en su lugar.
‫Entonces, para establecer la ubicación del jugador, necesitamos traer al jugador aquí y tomar de nuevo.
‫Así que voy a descomentar esa línea.
‫Y luego estamos haciendo exactamente lo mismo, exactamente la misma línea de código para nuestra última ubicación de jugador
‫conocida aquí.
‫Entonces, vayamos a nuestra pizarra y asegurémonos de copiarlo para obtener exactamente el mismo nombre y luego solo queremos
‫borrar, eso es lo último que es borrar la ubicación de nuestro jugador aquí.
‫Así que va a ser un valor claro y va a tomar esta ubicación del reproductor de texto como el valor
‫que estamos tratando de borrar al final.
‫Y podemos seguir adelante y compilar y ver si esto funciona.
‫Mientras Compile fue exitoso.
‫La otra cosa que dije que hacer para facilitar la depuración fue seleccionar al enemigo y
‫podemos ir y cambiar su velocidad bajando a sus componentes de movimiento y encontrando la forma de caminar y encontrando su velocidad.
‫Así que Max Walk Speed es 600 aquí.
‫Pongámoslo en 400 para que podamos alejarnos fácilmente de ellos.
‫Van a caminar un poco lento y seguir adelante y jugar.
‫Están caminando hacia un lento.
‫Podemos huir.
‫Nos escondemos detrás de una esquina y ahí van.
‫Ven a buscarnos cada vez.
‫Pero con suerte, si nos escondemos detrás de dos esquinas, no podrán encontrarnos.
‫Así que me escondo allí, escondo aquí, escondo aquí.
‫Y él va a ir e investigar en el último lugar conocido, ya ves, solo
‫asoma la cabeza por la esquina, pero luego se queda atrapado allí porque no sabe qué hacer.
‫Y si tuviéramos que ir y echar un vistazo a nuestro árbol de comportamiento y dejar esto a un lado y el
‫juego al otro y darme un poco de espacio.
‫Luego, si echamos un vistazo al árbol de comportamiento, podemos ver que está un poco animado aquí porque no
‫puede hacer ninguno de los dos.
‫Está tratando de moverse a la última ubicación conocida que está teniendo éxito.
‫Así que se está quedando un poco atascado aquí.
‫Pero si aparezco a la vista, puedes ver que se está moviendo hacia mí.
‫Si me pierde de vista, entonces pasa a la condición de investigación.
‫Así que pierde de vista.
‫Él va a investigar.
‫Y luego viene y me ve y luego vuelve a perseguirme.
‫Así que este comportamiento realmente está funcionando.
‫Ahora podemos elegir entre tratar de perseguir o tratar de investigar en función de este comportamiento de
‫pizarra.
‫Cambiemos el nombre de esta pizarra a comportamiento aquí para poder ver un signo de interrogación.
‫Así que va a ser mucho más fácil de leer.
‫Ahora que tenemos este selector, podemos ver la reproducción y luego debemos perseguirlo; de lo contrario,
‫debemos investigar y podemos eliminar esta secuencia aquí porque ya no está en uso.
‫Así que espero que ahora comprenda un poco mejor cómo se pueden vincular los árboles
‫de comportamiento para crear opciones y secuencias y juntar muchas tareas para crear comportamientos más complejos con mucha facilidad.
‫En la próxima lección, veremos cómo podemos crear nuestras propias tareas personalizadas en C++ para que podamos
‫tener algo de acción de disparar.
‫Te veré en el próximo video.