Si has trabajado con animaciones de personajes o con comportamientos de personajes no jugadores en un juego, es
probable que hayas implementado estados en algún momento, u otros estados permiten que los objetos del juego adopten diferentes comportamientos
cuando es necesario, haciendo que parezca que son controlados por una clase completamente diferente.
La unidad hace uso de los estados en el sistema de mecanismos.
En el animador, puedes crear un gráfico simple de estados a partir de animaciones individuales y definir
cómo pasar de uno a otro estado.
Las máquinas de estado finito utilizadas en los juegos son la encarnación de este patrón de diseño.
Una máquina de estado finito es una máquina conceptual que puede estar exactamente en uno de cualquier número de estados
finitos en cualquier momento.
Una máquina de estados finitos se utiliza en el campo de la inteligencia artificial para definir, entre otras cosas, los
comportamientos de los personajes controlados por ordenador.
Se representa como un gráfico con nodos que representan los estados y transiciones que definen el camino
de un nodo al siguiente.
Una vez que se ha entrado en un estado, el NPC permanece en ese estado hasta que se cumpla una condición de la transición.
Aquí tenemos una máquina de estado finito para un comportamiento de vigilancia simple.
Si el NPC está en el estado de patrulla, continuará realizando los comportamientos asociados hasta que se cumpla una
condición en cualquiera de las transiciones que salen del estado.
En este caso, se espera hasta que el jugador esté a una distancia inferior a 20.
Una vez que se cumple esa condición, el CNP pasa al estado de persecución.
Cualquier estado de una máquina de estado tiene tres procesos que se ejecutan en diferentes momentos.
Tiene una entrada, tiene una actualización y tiene una salida.
Enter se ejecuta tan pronto como el estado se transmite al estado, a continuación, entra en el bucle sin fin de la actualización.
La actualización continúa ejecutándose hasta que se activa la transición de salida del estado.
En este punto, antes de abandonar el estado, se ejecuta el método de salida.
Por ejemplo, un NPC que pasa al estado de patrulla al entrar necesitará establecer la animación apropiada,
así como determinar dónde están los puntos de ruta para la patrulla.
Durante su actualización, el NPC simplemente caminará de un waypoint a otro, comprobando constantemente
cuándo se ha alcanzado un waypoint y buscando el siguiente.
Algo en la actualización debe hacer que la salida se dispare.
Esto puede ser algo tan simple como que el NPC decida tener un sueño.
La animación de caminar se detiene y la transición de los NPCs al siguiente estado que se encarga del nuevo
comportamiento de dormir comenzará.
Una máquina de estado puede ser tan fácil de implementar como una sentencia if.
Por ejemplo, digamos que tienes un NPC que quieres que esté en cualquiera de los dos estados, inactivo o caminando.
Esto sería fácil de manejar en un bucle de actualización, y probablemente lo hayas hecho tú mismo antes.
De hecho, el código que se ve aquí es demasiado verboso para lo que realmente se quiere hacer en una tarea tan sencilla.
Pero se desmonta para ilustrar el funcionamiento de los estados.
Así que, en primer lugar, tienes una bandera de estado que registra el estado en el que se encuentra el NPC.
Ahora, en este caso, he usado una cadena, pero podrías fácilmente tener un entero o incluso usar un enum que
lo haría más significativo.
Ahora se podría utilizar una pulsación de tecla para indicar si se quiere caminar o si se quiere estar inactivo, con lo
que se establecería esa bandera de estado.
Más adelante en el bucle de actualización.
Hacemos pruebas para el Estado.
Así que como el estado está cambiando, si quiere que su NBC esté caminando, entonces va a jugar una animación
de caminar y realmente traducir el personaje en una dirección hacia adelante.
Mientras que si es el estado de inactividad, entonces usted quiere jugar la animación de inactividad y no quiere mover
el personaje.
Sin embargo, si el código fuera de esta clase es capaz de establecer el estado a muerto, las pulsaciones de teclas dentro de la actualización
sobreescribiría esto y usted tendría que lidiar con él por un poco de refactorización que podría ser
así.
Obsérvese cómo estamos probando que el estado esté muerto dentro de la actualización antes de hacer cualquier otra cosa.
Vale, esto no es demasiado complicado, pero una vez que empiezas a añadir muchos otros estados de carácter
y los tienes mezclados, montar una máquina de estados en este formato se vuelve demasiado complicado.
Por lo tanto, el patrón de estado entra en juego donde un estado se define como una pieza de código contenida que
se ocupa de todos los comportamientos y sólo los comportamientos que pertenecen a ese estado en particular.
En su lugar, vamos a escribir nuestra propia clase basada en el estado que todos los demás estados heredarán de
un estado registra el tipo de estado que es, que dependerá totalmente del tipo de máquina de estado que está
escribiendo.
En este caso, se utilizará para construir una máquina de estados para un guardia NPC que patrullará una zona y perseguirá
un ataque que se acerque a los jugadores.
¿Recuerdas las tres fases de un estado?
Bueno, son entrar, actualizar y salir.
La fase dictará el método a ejecutar.
Puedes ver que hay métodos para cada una de las etapas y los métodos base actualizan las etapas en consecuencia.
Por último, pero no menos importante, hay un método de proceso.
Se llama desde fuera de cualquier estado y determina qué método dentro del estado debe ejecutarse en cada
momento en función del escenario establecido.
Mediante el uso de esta clase base como plantilla para todos los estados, podemos estar seguros de mantener el código
relacionado con cada estado compartimentado de otros comportamientos de NPC.
Realmente es un patrón de diseño bastante inteligente.
Bien, basta de teoría.
Vamos a empezar a construir esta cosa una vez que se reúnen algunos códigos y empezar a crear más.
Más estados que heredan de esa clase base.
Verás lo poderoso que es este método de diseño y cómo hará que tu vida creando comportamientos de IA en tus personajes sea mucho más simple que tener
que hacer malabares para saber en qué estado están y qué animación se está reproduciendo y qué animación no se está reproduciendo,
qué cuidados presiona y todo este tipo de cosas, porque pueden volverse muy,
muy desordenadas muy rápidamente.
¿Verdad?
Así que abre un nuevo proyecto unity.
Ahora quiero que traigan el archivo de inicio que se adjunta a esta conferencia como recurso.
Sólo ten en cuenta que cuando traigas por primera vez ese paquete de unity, unity querrá
reiniciarse, y eso es porque el controlador tiene el nuevo sistema de entrada en él.
Así que deja que se reinicie por sí mismo para que traiga los paquetes correctos.
Y una vez hecho esto, es posible que aparezcan algunos errores en la consola.
Puede que no, pero si lo haces, ignóralos, ¿vale?
O simplemente límpialos, no te causarán ningún problema en el futuro porque la mayoría de las cosas de los activos estándar
que están aquí de los antiguos activos estándar, que sí causan algunos problemas porque el código ha sido obsoleto.
La verdad es que lo he quitado, pero no puedo prometer que no se me haya escapado nada.
Yo mismo lo he metido y no me da ningún error, así que tenedlo en cuenta.
Mientras no sean errores de lectura, estarás bien.
Ahora tengo la pestaña de navegación aquí arriba también, y si has abierto mi proyecto, creo que lo tendrás
también.
Si no vas a la ventana y yo a la navegación para abrir la navegación, ve a la pestaña de atrás y luego sólo haz
clic en Bake.
Ahora se volverá a hornear la superficie de la malla naval mostrando las áreas transitables en azul.
Y puedes ver aquí que la estructura está excluida y el área alrededor de los árboles también.
Ahora, ug, ¿quién es nuestro Dios?
Vamos a acercarnos un poco más a él.
Acércate aquí.
Ahí está.
Bien, así que está protegiendo nuestra estructura.
Va a salir a patrullar y tiene un componente de agente de malla naval unido a él, que hará todo el trabajo por nosotros.
Para que se mueva.
Tiene una fuente de audio para el disparo de la pistola y su animador está todo preparado para ti si echamos un vistazo
rápido a ese animador.
Así que vamos a hacer doble clic en el animador UG y abrir esto.
Pulse F para centrarlo.
Verás que hay un ídolo así que hay un ídolo de rifle.
También hay aquí arriba, un paseo de rifles, una carrera de rifles y un disparo de rifles.
Y hay algunas otras cosas aquí abajo a las que llegaremos un poco más tarde.
Esto en sí mismo es una máquina de estados porque son estados de animación, y estas son las transiciones
que se activan entre ellos.
Pero no vamos a escribir esto.
Así que esto es sólo la animación, pero verás si haces clic en cualquiera de las transiciones.
Así que para pasar de Rifle Idol a Rifle Walk, entonces usted tiene que desencadenar la condición está caminando y vamos a hacer todo
eso en el código para que no tenga que configurar eso.
Está ahí listo para ser utilizado, pero no hay ningún código actualmente en UG.
Lo primero que vamos a hacer es escribir una clase singleton para el entorno del juego, ya que al igual que
nuestros proyectos anteriores que hemos creado, hay algunos puntos de control establecidos en
la superficie y los verás en la escena si subimos aquí.
Y si hago clic en todos ellos, hay cinco en total y ahí están.
Así que nos dan un circuito para dar vueltas.
Cada punto de control tiene una etiqueta de control con C mayúscula.
De acuerdo.
Bueno, eso es más o menos todo el montaje de este entorno, al que le ha costado todo un vídeo acostumbrarse.
Así que investiga esto un poco más si quieres ver cómo está todo montado con el animador y todo ese
tipo de cosas.
Cuando volvamos en el próximo vídeo, empezaremos a programar nuestra máquina de estados finitos.