En la última conferencia, configuramos el sistema GOAP básico con un agente simple y ahora vamos a agregar algunas acciones.
Así que crea un nuevo archivo
C # llamado 'BakeBread' y solo traeré uno que he escrito antes y veremos qué hay allí.
Entonces, si lo abrimos ...
Todas las acciones que escriba serán de este mismo formato.
Ahora todos son módulos separados e individuales por sí mismos, por lo que no hay enlaces entre sí.
Recuerde: lo que los
une son sus condiciones previas y su coincidencia de efectos.
Ahora esto se llama BakeBread y es una GoapAction, por lo que heredará nuestras
cosas que están en ese conjunto de GoapAction.
Lo primero que vamos a hacer es establecer 'completado' en Falso, por lo que este será un valor booleano
que mantenemos, para saber cuándo hemos terminado nuestra tarea. Las tareas también llevan tiempo, por lo que
vamos a realizar un seguimiento de un tiempo de inicio para la tarea e inicializarlo a 0 y luego establecer una
duración de trabajo (entonces, cuánto tiempo dura la tarea). Es público, por lo que puede configurarlo en el Inspector.
Así que lo tengo durante 2 segundos y puedes cambiarlo como quieras.
A continuación tenemos nuestro constructor público para esta clase, que es donde agregamos nuestras Condiciones previas y nuestros Efectos.
Estas son probablemente las cosas más importantes en todo este sistema porque tienen
que coincidir entre sí,
en otras acciones, para que puedan encadenarse. Ahora puede ver aquí que nuestra condición previa
para BakeBread es que 'hasFlour' es verdadero y nuestro addEffect (después de haber horneado el pan) va
a decir que 'doJob' es verdadero.
Entonces 'doJob' es verdadero en nuestro objetivo que establecimos, aquí en Worker, que está aquí ... ESO coincide con ESO.
Entonces, el objetivo hará que la meta retroceda a ESTO, para que luego pueda ejecutarlo y luego, si 'hasFlour'
es, de hecho, Verdadero, comenzará a ejecutar esta acción en particular, de lo contrario, volverá a encadenar la lista
, si hay otras acciones, para
ver si puede seguir satisfaciéndolas en algún momento. Ahora, en este caso, tenemos harina (porque
recuerde que
le hemos dado a nuestro agente 5 bolsas de harina) y luego de vuelta en este sistema
de trabajo aquí, estamos inyectando hasFlour, lo que le dará un valor True porque la harina es mayor que uno.
Correcto.
Entonces, el nombre aquí es solo para fines de depuración, para que podamos imprimirlo si es necesario (en la Consola) para
ver qué está pasando.
Bien, entonces cada acción necesita un 'reinicio', de modo que cuando esa acción se realice nuevamente, comenzará con nuevos
valores. Entonces,
startTime obviamente vuelve a 0 y
'completado' de nuevo a False y luego hay algunos otros métodos que se requieren, uno
regresa 'completado' (isDone, para decir "¿Hemos terminado o no? "), luego tenemos otro llamado 'requireInRange' y esta es una función
que puede establecer en False si permite que su agente realice una tarea cuando en realidad no están
en la ubicación en la que necesitan estar.
Entonces estamos diciendo que "Sí, debe estar en su ubicación asignada para realizar su tarea (o esta tarea
en particular).
Luego tiene otra opción para más Condiciones previas de procedimiento, para que pueda verificar que otras cosas
en el entorno también sean Verdaderas o Falsas, antes de que el agente lleve a cabo cualquiera de estas acciones.
Así que por el momento no tenemos ninguno.
Simplemente estamos horneando pan, simplemente,
pero es posible que desee verificar algo como tal vez "Necesita tener 10 barras de pan, antes de
entregarlas a la panadería. "o" Es posible que no pueda
hornear si está inundando o lloviendo, dependiendo del clima. ", todo tipo de
otras cosas que no encajan con la cadena real de acciones que pondrías
aquí.
A continuación, tenemos nuestro método 'realizar', que funciona mientras se realiza la tarea, por lo que inicializa el tiempo de inicio y también
tengo algunos Debugs aquí,
para que pueda verlos en la Consola cuando se está iniciando un determinado trabajo y cuando
haya
terminado ese trabajo, por lo que esto solo marca el tiempo que lleva realizar
esa tarea.
Para cada acción, esto será más o menos lo
mismo, pero luego puede realizar diferentes cosas según la acción en la que se encuentre.
Esta es la acción BakeBread,
así que al final de la acción BakeBread, estoy diciendo que nuestro nivel de harina en nuestro
inventario se reducirá en 2 (porque recuerde que se necesitan 2 bolsas de harina para hacer una barra de pan)
y luego nos deshacemos de 2 bolsas de harina y luego vamos a agregar 1 barra de pan a
nuestro inventario, luego decimos que
'completado' es Verdadero, lo que finalizará esta tarea porque se devolverá al sistema aquí.
Así que ese es el código completo para nuestro BakeBread.
Así que guarda eso ... vuelve a la Unidad ... desea agregar ese código a su agente.
Por lo tanto, esta es una acción, la arrastra y suelta en el agente y
ahora puede crear tantas acciones diferentes como desee y simplemente sigue
arrastrándolas y soltándolas en el agente y el agente sabrá sobre estas acciones.
Ahora lo único que necesita establecer en este momento es el Objetivo para BakeBread.
¿Dónde quieres hornear pan?
Lo vamos a hornear en la panadería, así que encontramos nuestro marcador de panadería (que es mi 'puerta' de
panadería allí) y voy a arrastrar y soltar ESO como el objetivo para hornear.
Okay.
Ahora estás listo para ejecutarlo, así que voy a cambiar a la consola para poder ver qué está pasando ... simplemente aclare eso y
presionemos Reproducir.
Por lo tanto, se moverá a la ubicación donde puede realizar la acción BakeBread y luego, cuando llegue allí, comenzará
a hornear pan y podrá verlo en la Consola. Cuando termine, verá que
su inventario y su harina bajarán 2 cada vez.
Ahora eso sucedió
bastante rápido, pero si regresas y miras a través de la consola, hay muchísimo allí.
Hagamos una pausa porque ahora no puede encontrar ningún plan, solo continuará con el 'Plan fallido'.
Podemos encontrar dónde ocurrió la cocción ... aquí vamos.
Entonces nos estamos mudando justo aquí.
Así que nos mudamos a BakeBread ...
estamos comenzando BakeBread ... BakeBread terminado ... se mudó a BakeBread ... iniciando BakeBread ... terminado BakeBread.
Así que hicimos 2 hogazas de pan y luego dice NO PLAN Y es
porque nos hemos quedado sin harina. Así que solo queda 1 lote de harina y de
eso tenemos 2 hogazas de pan.
Ahora no hay forma de obtener más harina, en este momento.
Entonces el plan para hacer su trabajo ha fallado.
No puede seguir adelante cuando lo procesa.
Entonces, lo que podemos hacer ahora es agregar otra acción que lo ayude a obtener algo de harina, para que pueda seguir horneando.
Bien, deja de jugar eso
y en el proyecto vas a crear un nuevo archivo C #
llamado 'PickupFlour' y se verá como este aquí.
Entonces PickupFlour ...
si es más fácil para usted, simplemente haga una copia completa de la acción BakeBread y luego póngala en su script
PickupFlour y luego asegúrese de cambiar el nombre aquí ...
y en el constructor ...
así que allí y luego también el PickupFlour. Todo lo demás puede permanecer exactamente igual porque
solo está procesando la acción.
Ahora, la condición previa y el efecto de PickupFlour es que vamos a hacer que el agente recoja harina cuando se nos haya
acabado la harina.
Entonces, cuando 'hasFlour is False' es cuando esta acción debería tener lugar y luego el
Efecto después de eso, es que hasFlour será igual a True.
Entonces, este Efecto aquí está configurando hasFlour en True, que luego permitirá que se ejecute la acción BakeBread.
Entonces ese es el vínculo que sucederá allí.
Ahora más abajo en nuestro 'desempeño', donde necesitamos establecer cómo va a cambiar el inventario, es que después de que hayamos terminado de recoger la harina,
entonces podemos recoger el nivel de harina en nuestro inventario. En este caso, estoy diciendo que cuando
va
al molino a recoger la harina, en realidad puede llevar 5 lotes de harina, por
lo que agregaremos 5 al inventario, lo que le permitirá continuar y creando más
pan por un rato.
Correcto.
Entonces, una vez que tenga todo eso allí, solo guárdelo, regrese a Unity y ese script nuevamente
se puede soltar (PickupFlour) en el agente.
Recuerde que debemos configurar nuestro destino de destino para recoger la harina y, en este caso,
diremos que está en la puerta del molino de viento.
Así que usaremos la puerta del molino de viento para nuestro objetivo para recoger la harina.
Ahora, cuando presionamos Reproducir, podemos ver que la harina baja (por lo que bajará 2 con cada barra de pan
que se produce) y luego sabemos que cuando queda 1 cantidad de harina y 2 pan,
tendrá que irse y recógelo del molino y aquí puedes verlo irse a recoger la
harina.
Ahora, si todo esto es demasiado lento para usted, recuerde que puede hacer clic en su agente BAker, ir a
su Agente de malla de navegación y cambiar su Velocidad.
Entonces, si lo configuramos en 15, lo que debería acelerar un poco las cosas, no aumentará
el tiempo que lleva completar las tareas, solo
aumentará el tiempo que le toma ir entre los lugares, para que pueda verlo sucediendo un poco
más rápido
Ahora podemos ver que va a volver ... conseguir la harina ... la harina en tu inventario
subirá a 6 porque tuviste 1, él agregó 5 y luego continuará y usará esa harina y
horneará más pan y cuando se acabe, volverá y lo conseguirá.
Ahora puede hacer una cadena bastante compleja de todos los diferentes eventos que desea que ocurran en cualquier
comportamiento en particular,
pero solo con un par puede obtener algunas cosas bastante complejas, como puede ver aquí.
Muy bien, eso es configurar tu pequeña cadena y, en
este caso, es como una cadena de suministro.
En la próxima conferencia, lo que conseguiremos que entregue el pan (cuando tenga suficiente) a
los mercados.