En el taller Line Of Sight, configuramos una variable llamada 'estado' para realizar un seguimiento de la actividad que
el NPC estaba realizando actualmente. A. YO. Los métodos que utilizan estados son muy comunes en
la programación de NPC y no se centran más en ellos que en el caso de las máquinas de estados finitos.
En esta conferencia, construiremos una máquina de estado finito desde cero y la usaremos para
controlar un tanque que realizará funciones de 'protección' y 'persecución'.
Una máquina de estados finitos es una máquina conceptual que puede estar exactamente en 1 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 computadora. Se representa como un gráfico con nodos que representan los estados
y las transiciones, que definen la ruta de un nodo al siguiente. Una vez que se ha ingresado un estado, el
NPC
permanece en ese estado hasta que se cumpla una condición en la transición.
Aquí tenemos una máquina de estados finitos para un comportamiento de protección simple.
Si el NPC está en 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, está esperando hasta que el jugador esté a una distancia inferior a 20.
Una vez que se cumple esa condición, el NPC pasa al estado Chase. Si ha estado usando Unity y cree que el concepto de máquina de
estados finitos le resulta familiar, ¡es porque lo es! El sistema mecanim utiliza máquinas de estado finito para
controlar los comportamientos de animación y es exactamente lo que estamos a punto de utilizar para definir el comportamiento
del pequeño tanque verde. Para seguir mientras construyo
este F. S. METRO. , descargue el archivo de inicio que viene con esta conferencia.
Esto utiliza muchos de los recursos del tutorial de tanques que Unity lanzó hace un par de
años y los he reutilizado para usarlos en esta situación.
Cuando abra la escena que se llama Tanks, verá esto. Así que tenemos un pequeño tanque verde que será nuestro NPC y
tenemos un tanque que podemos manejar, ya tiene un script. Si presiona Reproducir, podrá usar las teclas
de flecha para conducirlo ... como eso.
Lo primero que debemos hacer para nuestro tanque verde es crear un controlador de animación.
Entra en el proyecto y haz clic en Crear y estás buscando Animator Controller, que está fuera de mi
lista aquí.
Déjame decirte esto ... Crear> Animator Controller.
Si has usado animación antes en Unity, estarás familiarizado con esto.
Vamos a llamar a esto nuestro NPCFSM, así. Para comenzar a crear los estados, haga doble
clic en el NPCFSM y se abrirá la ventana Animator.
El primer estado que crearemos es Patrol. Haga clic derecho en la ventana del Animador, vaya a
'Crear estado> Vacío', luego seleccione ese estado y en el Inspector, puede cambiar su nombre.
En lugar de asignar este estado con animaciones, lo asignaremos con comportamientos y más en el Inspector, verá
que hay un botón 'Agregar comportamiento'.
Seleccione eso y crearemos un nuevo script. Lo llamaremos 'Patrulla' y 'Crear y agregar' eso. Eso creará un archivo C
# llamado Patrol en su carpeta Activos que ahora está asociado con este estado de
Patrulla y si hace doble clic y lo abre, encontrará un montón de código
comentado que se activa por ese estado. Cualquier estado en una máquina de estados tiene 3 procesos que se ejecuta en diferentes momentos.
Tiene una entrada, tiene una actualización y tiene una salida. Enter se ejecuta tan pronto como el estado haya pasado a la transición.
El estado luego entra en el bucle sin fin de la actualización. La actualización continúa ejecutándose hasta que se desencadena la
transición fuera del estado. En este punto, antes
de abandonar el estado, se ejecuta el método Exit. De vuelta en nuestro script de comportamiento de máquina de estado, encontraremos cada uno de estos métodos incluidos.
El primero es un
Enter (eliminemos los comentarios para eso).
La siguiente es la Actualización (elimine los comentarios para eso
también) y, por último, hay
una Salida (también eliminemos esos comentarios).
El sistema de animación utiliza los otros métodos ('OnStateMove' y 'OnStateIK').
No estamos haciendo animación en este caso, así que eliminemos esos.
Ahora construiremos un sistema realmente simple de 'seguimiento de puntos de referencia' en este código. En la parte superior,
voy a definir 3 valores como este.
Entonces, el primero es 'NPC' y esto es para agarrar al NPC que está usando este código a través de su Animator y llegaremos a
eso en un momento.
A continuación, necesitamos una matriz de todos los puntos de referencia, para poder recorrerlos y mover el NPC
y luego debemos realizar un seguimiento de a qué punto de referencia estamos yendo actualmente,
que será en este int llamado currentWP.
Ahora para obtener los puntos de referencia, ya que este es
un objeto programable, el Inspector no tiene forma de enviar valores a esto y, por lo tanto, necesitamos tomarlos en tiempo
de ejecución.
Podemos agregar un método Despertar (que haré aquí arriba) a esto y lo que
va a hacer es establecer puntos de referencia para encontrar todos los GameObjects con la etiqueta de 'punto de referencia'.
Una vez que tenga eso allí, si cambia de nuevo a Unity (lo guardaré) y eche un vistazo a
los puntos de referencia que he agregado y verá que están etiquetados con 'punto de referencia' .
Así es como el guión los va a encontrar. OnStateEnter se ejecutará
cada vez que se haga la transición a este estado, sin importar
lo que esté haciendo el NPC. Entonces, debe considerar lo que necesita aquí para configurar el NPC para patrullar,
en este caso.
Ahora lo que quiero hacer es agregar estos.
En primer lugar, voy a agarrar el NPC (que es nuestro valor que hemos definido en la parte superior).
Ahora podemos hacer que el NPC ejecute este script usando el objeto animador que se está pasando por aquí y solo
estoy configurando esto solo para ahorrarme un poco de escritura, en cuanto a tener que escribir esto cada
vez que quiero obtener el transformación o posición de la APN.
Eso es solo agarrar eso.
Ahora, cada vez que entramos en Patrol, le diré al NPC que debe ir al punto de referencia 0.
Entonces, si se interrumpe en su búsqueda de patrullaje (al tener que perseguir a alguien), siempre regresará
y comenzará en la posición 0 y volverá a contar desde allí.
Entonces eso es OnStateEnter. OnStateUpdate se ejecutará una y otra vez, mientras el NPC está en
este estado.
Así que aquí es donde vamos a poner el código para patrullar y movernos por esos puntos de referencia.
Lo que esto está haciendo es, en primer lugar, preguntar si hay algún punto de referencia (por lo tanto, si la matriz
de puntos de referencia tiene una longitud de 0, entonces 'regresar' porque no hay punto tratando de moverse por puntos de
referencia inexistentes).
A continuación, está haciendo un cálculo de distancia y este cálculo de distancia determina dónde está el NPC en relación
con el waypoint actual hacia el que se dirige. Si se alcanza el punto de referencia actual con una precisión en este caso, de 3, irá y
obtendrá un nuevo punto de referencia y, por lo tanto, actualizará el punto de referencia en 1. Comienza en 0, así que ahora va
a subir a 1.
Luego preguntará si el punto de referencia es mayor o igual que la longitud de la matriz, volverá a
establecer el punto de referencia actual en 0.
Entonces esto hará un ciclo (o contará hasta el final y luego volverá a girar) y creará un circuito de
puntos de referencia.
Después de eso, hay un código que moverá el tanque hacia adelante, así como también lo orientará en la dirección
del punto de referencia hacia el que viaja.
Primero calculamos la dirección en la que queremos que viaje el tanque y luego, usando esa dirección,
aplicamos un slerp.
Entonces Quaternion. Slerp va a girar lentamente el NPC hacia el punto de referencia.
Ahora puede modificar qué tan rápido ocurre esta rotación con este cuantificador aquí.
Entonces, en este momento, la velocidad de rotación se establece en 1.
Después de eso, hacemos un Traslado y empujamos el NPC a lo largo de su eje z (que es su eje orientado hacia adelante).
Entonces, la rotación está haciendo todo el trabajo en cuanto a orientarse con el punto de referencia y este Traductor
simplemente lo empuja hacia adelante
y la velocidad, en este caso, para nuestra dirección de avance es un valor de 2 y ahí es donde puede
cambiarlo si Quiero estar moviéndome más rápido. Para OnStateExit, no hay
nada que necesitemos en este momento, así que lo dejaremos vacío.
Así que ahora salvemos a nuestra Patrulla y volveremos a la Unidad. Lo que haremos ahora es en nuestro tanque verde, vamos
a agregar esta animación (que es nuestra máquina de estados finitos en lugar de una animación,
pero el proceso es el mismo). Entonces agregaremos un componente ... agregaremos un Animador y
luego en la parte del Controlador del Animador,
queremos arrastrar y soltar nuestro NPCFSM que acabamos de crear. Por supuesto, no hay ningún Avatar o Movimiento de raíz para aplicar
porque solo estamos usando el sistema de comportamiento dentro de esta Máquina de estado finito para impulsar el movimiento de nuestro tanque.
Ahora, con todo eso configurado, podemos presionar Reproducir.
Puede ver ese comportamiento trabajando en la ventana Animator, si selecciona el estado actual que está
sucediendo.
Si no puede ver eso, seleccione el tanque en la Jerarquía también.
Lo que esto le muestra es que el método de actualización se ejecuta una y otra vez.
Ahora no hay transiciones fuera de aquí para provocar que suceda algo más, excepto que este pequeño tanque verde solo va
a dar la vuelta a los puntos de referencia en el orden en que terminan en esa matriz de puntos de referencia.
En el próximo tutorial, comenzaremos a agregar más estados a nuestra Máquina de estados finitos para que el
tanque pueda comenzar a disparar y perseguir al jugador.