En esta conferencia, vamos a continuar escribiendo algo de código que permitirá a nuestros agentes ejecutar un
plan.
Y luego vamos a poner un plan simple en nuestro agente.
Y antes de que empieces, si quieres exactamente el mismo archivo de proyecto con el que acabo de empezar
aquí, se adjunta a esta conferencia como un proyecto de inicio.
Ahora, para hacer esto, vamos a ir a nuestro script de agente G.
Así que abre eso.
Ahora, si recuerdas de antes, hubo una actualización tardía y no completamos esto.
Así que ahora es el momento de añadir el código.
Bien, lo primero que vamos a hacer aquí es añadir el planificador.
Así que voy a bajar un poco porque quiero volver y poner otras cosas encima de esto
un poco más adelante.
En primer lugar, vamos a decir que si el planificador es igual a null o nuestra pista de acción, que se devuelve desde el planificador
es igual a null, eso significa que el agente actualmente no tiene planes para trabajar.
¿Qué vamos a hacer aquí?
Bueno, vamos a crear un nuevo plan.
Así que creamos un nuevo planificador.
En primer lugar, el planificador es igual al nuevo planificador G.
Así.
Y luego vamos a clasificar todos los objetivos que tenemos ahora.
¿Recuerdas cuando creamos nuestro agente y le permitimos tener múltiples subobjetivos?
Así que si volvemos a subir aquí arriba, un objetivo no es un solo objetivo, sino que hay múltiples objetivos.
Y también tenemos el nombre del objetivo y estamos almacenando con él un valor entero, que va a ser lo importante
que es este objetivo en particular para satisfacer.
Así que vamos a clasificar todos nuestros objetivos y a ponerlos en orden de más a menos importante, para luego poder
recorrerlos de uno en uno hasta que encontremos uno que podamos hacer.
Así que voy a hacer una meta ordenada var, que va a ser igual a nuestro diccionario ordenado, que será el
uso de un comando de enlace.
Así que va a ser de entrada en las metas, el orden por el valor de entrada descendente.
Seleccione la entrada.
De acuerdo.
Y eso va a requerir nuestros objetivos.
Muy bien.
Y ordenarlo y meterlo en metas ordenadas.
De acuerdo.
Ahora, una vez que tenemos eso, vamos a hacer un bucle a través de cada uno a la vez.
Así que para cada uno, queremos el par clave-valor de la sub-meta.
E int.
Así que este es el sub-objetivo en las metas clasificadas.
Entonces aquí diremos que el taco de acción.
Equivale al plan de puntos del planificador.
Así que aquí es donde estamos llamando al plan.
Así que tomamos el objetivo más importante que conocemos y tratamos de crear un plan para ello.
Así que planificar un plan necesita el conjunto de acciones que tenemos el objetivo.
Así que tenemos ese es el sub-objetivo, los objetivos clave.
Así que son todos esos subobjetivos los que componen ese objetivo.
Y luego tenemos que pasar por el estado, no los estados del mundo, pero esto es las creencias del agente y en realidad
no hemos puesto esos todavía.
Así que en este momento sólo vamos a pasar por null.
Bien, entonces no vamos a usar el sistema de creencias, sólo va a usar esos objetivos mundiales que tenemos.
Entonces vamos si acción.
Q Después de haber hecho esto no es igual a nulo, entonces debemos tener un plan que podamos seguir.
Y en ese caso, vamos a establecer el objetivo actual en el que estamos trabajando para que sea igual
al s g, el sub objetivo, valor clave.
Y luego nos vamos a separar porque no necesitamos seguir buscando en esos objetivos otro
plan porque ya tenemos uno.
Así que ese es básicamente nuestro plan.
Y ahora recuerda la actualización tardía, es un bucle, va a hacer un bucle y un bucle y un bucle.
De acuerdo.
Así que cuando se produzca el primer bucle y no tengamos un plan o una ejecución, entonces conseguiremos un planificador.
Ahora bien, si tenemos una acción, entonces justo por encima de esto, quiero probarlo primero.
Así que si estamos en medio de la realización de una acción, entonces voy a volver fuera de esta actualización
tardía antes de llegar a la etapa de planificación.
Así que aquí arriba iremos si la acción actual no es igual a null y el punto de acción actual se está ejecutando.
Así que hay un bool que podemos establecer para decir que realmente estamos trabajando en nuestra acción.
Ahora, si estamos trabajando en nuestra acción, lo que vamos a hacer es poner si acción actual.
Agente de puntos.
El punto tiene camino y corriente.
Acción.
La distancia restante del agente es inferior a un f.
Ahora, esto, como reconocerás, es código de malla naval.
Y por eso necesitamos tener esto aquí para mover al agente hacia la meta.
Ahora, tan pronto como el agente tiene una meta y en realidad ha llegado a esa meta, y estamos diciendo en este caso, como
menos de una distancia de uno, entonces vamos a ejecutar el final de nuestra acción, que es ejecutar básicamente
la finalización de la misma.
De acuerdo.
Ahora recuerda que ponemos en cada acción una duración.
Así que cuando hemos llegado a este punto, hemos alcanzado nuestra ubicación de la meta, entonces tenemos que esperar la duración de la misma.
Digamos que te has presentado en el mostrador de registro y te estás registrando, así que has llegado
allí físicamente, y entonces vas a tardar 10 segundos en completar la tarea que el agente está haciendo allí.
Este es el código que lo hará.
Así que vamos a decir, si no se invoca y voy a explicar esto en un momento y si no se invoca, entonces
vamos a invocar un método externo llamado completo.
Acción.
Y eso va a ser enviado a través de la acción actual de corta duración.
Bueno, en realidad, se va a invocar en que 10 segundos más tarde y luego invocar.
Es igual a verdadero.
Ahora cuando empecemos a invocar va a ser falso y lo voy a poner aquí.
Así que bool invocado e igual a falso.
Así que sabemos que la primera vez que entremos aquí, esto será falso.
Nos permitirá entrar aquí, invocar este método de acción completo en tantos segundos, y luego establece invocado
a verdadero.
Así que no vamos a volver a entrar aquí en este punto.
No podemos, no nos deja.
Pero el método de acción completa que vamos a la derecha justo aquí arriba va a establecer invocado de nuevo a falso para
nosotros.
Así que queremos una acción nula y completa.
Y luego dentro de este método, la acción actual que se ejecuta es igual a false.
Así que aquí es donde finalmente decimos que hemos terminado de ejecutar nuestra acción actual y forzará a nuestro sistema de
planificación a ir en el plan de nuevo.
Y por eso queremos que la acción actual se realice.
Que es el método que ejecutamos justo al final y luego pondremos invocar de nuevo a false.
De acuerdo.
Así que eso es lo que sucede cuando terminamos una acción actual y luego después de cuánta duración es que vamos a tener corriendo
establecido en falso, lo que significa que esto entonces fallará.
Discúlpame un momento mientras me trago mi propio vídeo sólo para decir que he echado en falta una sentencia return
que tendrás que poner dentro de esa sentencia if.
Ahora, en ese momento, o bien te has quedado sin acciones o bien todavía tienes más acciones en la cola.
Así que si ese es el caso, ahora tenemos que considerarlo.
Así que debajo de nuestra sentencia if para nuestro planificador, vamos a considerar si la acción Q no es igual a null.
Así que en realidad tenemos una cola de acciones y el recuento de puntos de la cola de acciones es igual a cero, lo que significa que tenemos una cola de acciones
vacía y en realidad nos hemos quedado sin cosas que hacer.
Entonces podemos ir si la meta actual eliminar.
Así que si el objetivo en el que acabamos de trabajar es uno de esos removibles, entonces podemos decir
objetivos, eliminar nuestro objetivo actual de allí y luego vamos a después de haber hecho eso establecer planificador para igualar a null, que
va a desencadenar la obtención de otro plan y la próxima vez que este bucle pasa.
Ahora, finalmente, hay una condición más de la declaración if que necesitamos considerar aquí que
podría ocurrir y es la cola de acción if.
No es igual a null.
Y la acción.
La cuenta de puntos de referencia es mayor que cero.
Esto significa que todavía tenemos acciones en la cola que han sido devueltas por el planificador.
En ese caso, podemos empezar a ejecutarlos.
Así que ahora vamos a conseguir la acción actual y vamos a ir a la acción de los iguales.
Q.
Punto D.
P Y esto sacará la acción que está en la parte superior de nuestra cola de la cola y la pondrá en la
acción actual.
Ahora realizamos el método de preactuación que tenemos para nuestra acción.
Así que va a ser la acción actual punto pre realizar.
Y ahí podemos hacer las comprobaciones que necesitemos, como para los atributos físicos que hay
que decir si el número de, digamos, cubículos está disponible y todo ese tipo de cosas.
Y entonces si eso es cierto, queremos ir si el objetivo de la acción actual es igual a null.
Y la etiqueta de destino de la acción actual no es igual a una cadena vacía.
Entonces lo que vamos a hacer es ir que la acción actual punto objetivo es igual al objeto de juego punto encontrar con la etiqueta
acción actual punto.
Target para que podamos establecer el objetivo al que se moverá el agente de la malla de navegación estableciéndolo en el inspector.
O podemos encontrarlo utilizando una etiqueta.
Así que si has hecho un prefabricado de tu personaje, será mucho más fácil para ti simplemente poner la etiqueta.
Entonces hace esta búsqueda cuando entra en el entorno para buscarlo.
Ahora, como puedes ver, estoy recibiendo errores con nuestra etiqueta de destino aquí.
Si guardo eso rápidamente y vuelvo a mi acción G y puede que quieras echar un vistazo aquí, puedes ver
que establecemos la etiqueta de destino como un objeto del juego cuando en realidad se supone que es una cadena.
Así que eso fue un pequeño error que cometí antes y que seguirá estando en su código.
Así que guarda eso y luego podemos volver a nuestro agente.
La otra cosa que se puede ver aquí es que los objetos del juego para encontrar con la etiqueta tiene que ser una G mayúscula
en allí.
Ahora vamos a terminar esto.
Si la declaración que tenemos nuestro objeto de destino, entonces vamos a ir.
Si el objetivo de la acción actual no es igual a null.
Así que todavía podría ser que acabáramos sin tener nada que hacer en cuanto a mover a nuestro agente.
Y si es así, vamos a comprobar que no es igual a null.
Así que si no es igual a null, el objetivo, no la etiqueta, debería decir que la acción actual punto corriendo es igual a true.
Y aquí es donde empieza a tener lugar la acción.
Deshagámonos de esa T y de la acción actual dot agent set destination y ese es nuestro agente de malla nav estableciendo
el destino a la corriente.
Acción.
Objetivo de punto, transformación de punto.
Posición del punto.
De acuerdo.
Este es el punto de partida para establecer el destino de nuestro agente.
Y luego, más arriba, es donde se comprueba si hemos llegado al destino.
Ahora recuerde que el código del agente de malla naval va a ir y hacer su cosa automáticamente en el
fondo en cuanto a mover el agente alrededor.
De acuerdo.
Así que vamos a terminar esta declaración ahora.
De lo contrario, si no podemos hacer nuestro método de Pre-performance, vamos a decir cola de acción.
Es igual a null.
Y eso nos obligará a conseguir un nuevo plan.
Vuelve a los objetivos.
Consigue un nuevo plan.
Ahora bien, si alguna de las acciones en las que estás trabajando o tratando de trabajar falla, entonces va a volver a planificar
todo el asunto, que de hecho puede volver a planificar exactamente la misma secuencia de acciones,
pero te envía de nuevo al principio para que se asegure de que lo haces.
Y también se asegura de que su agente no se quede atascado en medio de un plan.
Bien, ahora que tenemos eso, vamos a guardarlo.
Ese es nuestro código principal para nuestra última actualización.
Sí.
Volvamos a la unidad.
Ahora vamos a crear nuestra clase básica para nuestro paciente.
Así que haz clic con el botón derecho del ratón y crea un nuevo script de C-sharp.
Vamos a llamar a este paciente y luego abrir esto.
Va a ser un código muy corto.
Así que el paciente va a heredar de G.
Agente y no va a tener una actualización.
Va a tener un comienzo.
Ahora en el inicio queremos llamar al inicio base que está pasando en el script del agente G y luego vamos a crear un
sub objetivo.
Así que el subobjetivo S uno es igual a un nuevo subobjetivo y el subobjetivo será está esperando y le daremos una prioridad de uno y diremos
true, lo que hará que deje de ser un objetivo y entonces tendremos que añadirlo a nuestros objetivos.
Así que los goles se suman.
S uno y su prioridad en este caso es tres.
Ahora bien, este inicio en particular y nuestro agente G, vamos a guardar esto vamos a volver a los agentes g quieren
señalar algo que usted necesita para arreglar aquí que acabo de hacer antes es añadir un público a la puesta en marcha, de lo contrario
que va a obtener un error cuando se intenta y llamar a esa base de inicio.
Pero básicamente el punto base comienza a configurar todas las acciones que has adjuntado a tu paciente,
y luego puedes seguir adelante y ejecutar el resto de este código del paciente, ¿verdad?
Así que vamos a guardar eso, volver a la unidad y agarrar esa secuencia de comandos paciente y arrastrar
y soltar en su paciente.
Sí.
Y ahí está.
Ahora necesitamos una acción a seguir, así que vamos a hacer una acción rápida.
Y aquí, vamos a crear C-sharp y vamos a llamar a esto.
Ve al hospital.
Ábrelo para editarlo.
Y esta vez, no va a ser un comportamiento mono.
Esto va a ser realmente una acción g.
Y dentro de aquí, vamos a deshacernos de nuestro inicio y actualización.
Y todo lo que tenemos que hacer es poner un bool público para nuestro pre rendimiento que vamos a poner retorno
verdadero en allí y luego una copia de que aquí para nuestro post rendimiento.
Así que esa es una acción estándar básica de las acciones.
Así que guarda eso.
Ahora vuelve a cambiar a la unidad.
Vamos a adjuntar este hospital de oro a nuestro paciente, lo que le dará acceso para poder realizar
esa acción en particular.
Ahora esta acción, recuerde, tenemos pre condiciones y tenemos post condiciones que podemos
poner aquí.
Digamos que, por ahora, no hay ninguna condición previa.
El efecto posterior tendrá que estar a la altura de nuestro objetivo.
Ahora, el objetivo para nuestro paciente, si volvemos a la secuencia de comandos aquí está buscando es la espera.
Bien, así que de vuelta a la unidad en nuestro paciente vamos a añadir uno.
El efecto posterior y va a ser está esperando y aquí es donde tiene que ser escrito correctamente.
Ahora, el valor en este caso no importa porque realmente no lo estamos usando para nada.
La otra cosa que necesitamos saber es donde el objetivo de esta acción va a ocurrir ahora, porque
el agente está en la escena, en la jerarquía con, digamos que vamos a ir al hospital en la sala de espera, por lo que obtener
la sala de espera y arrastrar y soltar que en su objetivo.
Todo va a salir bien.
No es un prefabricado, así que no tenemos que buscarlo usando la etiqueta de la zona de espera.
De acuerdo.
Así que ahora, si pulsamos "play", nuestro agente va a formular un plan para asegurarse de que ese objetivo de espera se produzca.
Y como puedes ver, lo ha hecho porque todo lo que necesitaba hacer era ejecutar el script de ir al hospital
para satisfacer su objetivo.
Así que ahí vamos.
Ahí está nuestro muy, muy básico, muy, muy simple sistema de planes trabajando en nuestro sistema de cuerdas que acabamos
de armar.
Así que ahora, a partir de ahora, a las acciones más complejas.