Bienvenido de nuevo a la Parte 3 de la serie sobre la creación de una Máquina de estado finito para un
NPC y lo que vamos a hacer ahora es agregar nuestro estado final, que será 'Ataque'.
Entonces, para empezar, primero tenemos que configurar nuestro NPC para hacer eso y va a necesitar balas.
Voy a ir al
tanque (vamos a encontrarlo en
la escena) y queremos disparar desde el tanque. En el tanque que te han dado (si has descargado
mi proyecto) al final de la torreta, si puedo encontrarlo por ti ...
vamos a dejar esto abajo ...
Verás que tengo un pequeño cubo justo allí.
Así que agregué un cubo y lo giré y lo adjunté al tanque en la posición donde quiero que
salgan las balas.
Ahora tendrás que asegurarte de que también apagas tu Box Collider si
estás
haciendo esto en un modelo diferente, pero lo importante es que esta caja esté unida a tu NPC, de modo
que cuando tu NPC se mueva, esta caja también lo haga.
porque es la posición relativa para que salgan las balas.
Entonces, todo
está listo para ir allí.
Volvamos al Animador y aquí, vamos a agregar
nuestro script de ataque.
Así que 'haga clic derecho> Crear estado> Vacío' y llamaremos a esto 'Ataque' y para nuestro estado de ataque agregaremos el comportamiento de Ataque y el código para nuestro Ataque se ve así.
Así que voy
a reemplazar el código
comentado
con el nuevo código.
Una vez más, Attack tomará su liderazgo
de nuestra clase NPCBaseFSM que creamos, para que obtenga los datos de NPC, luego comenzamos a
obtener la información sobre el oponente y el NPC y la velocidad y todo eso (aunque no es necesario en este caso particular) y vamos a llamar a algunos métodos que están dentro de TankAI desde este.
Así que esta vez volveremos a llamar para otro lado y ahora tenemos nuestro TankAI StartFiring cuando ingresamos en el estado de Ataque y luego, en la actualización, continuaremos mirando al oponente. Solo estoy usando
una transformación realmente fácil. LookAt y
luego
la posición del oponente.
Podrías poner slerping y otras cosas aquí si quieres que se vea un poco más suave, pero para nuestros propósitos, esto funciona bastante bien. Luego, cuando
salgamos,
vamos a ejecutar un
método TankAI
llamado StopFiring. StartFiring (como verá en un minuto) es InvokeRepeating, por lo que comenzará a disparar todo el tiempo mientras esté en estado de ataque y luego, justo antes de que salga del estado de ataque, le indicará que deje de disparar.
método invocado. En el script
TankAI, agregaremos los métodos que el estado
está llamando.
Entonces, justo debajo
de GetPlayer, agregaré estas 3
cosas.
El método que hace todo el trabajo es este 'Fuego' y va a instanciar un objeto de bala de un prefabricado (que configuraremos en un momento) desde su posición de torreta y ese es el pequeño cubo que creamos antes y la torreta rotación.
Por lo tanto, se asegurará de que empuja la bala en la misma dirección en que se establece la rotación
de la torreta y lo hace mediante el uso de un cuerpo rígido GetComponent
en la bala y luego una AddForce de la dirección de avance de las torretas multiplicada por 500 en este caso . Entonces esta es la
fuerza de la fuerza a la que sale la bala.
Ahora los 2 métodos públicos aquí (para iniciar
y detener el disparo) son los que se llaman desde atrás en el script de ataque.
StopFiring simplemente cancelará la invocación en 'Fire', que
ocurre cuando se llama a StartFiring.
Entonces InvokeRepeating iniciará el método 'Fire' (que es el que está aquí) después de medio
segundo y luego continuará llamándolo cada medio segundo después de eso. Ahora puede hacer esto más rápido haciendo que este valor sea más pequeño aquí o también podría tener el intervalo más largo. Ahora la bala en sí misma debe
pasar al TankAI,
por lo que haremos una variable pública expuesta en la parte superior para eso ...
para dejarlo caer El objeto del juego también necesita saber sobre su torreta, por lo que colocaremos GameObject porque eso es lo que estamos usando para
configurar la alineación de la bala. Entonces, con ambos públicos, podemos
guardar todo este código, volver a Unity, encontrar nuestro tanque (que está en la parte superior aquí)
y verás que tienes una Bala y la Torreta. Ahora la torreta que tienes que obtener del cubo que está unido al tanque, así que la agarramos y la arrastramos hacia allí y luego la bala ...
Encontrará la viñeta en los activos del proyecto
que le he dado.
Ahora esta es la misma viñeta que está en el proyecto de tanque que
tiene Unity, pero he agregado un script adicional, así que simplemente arrastre y suelte eso en el
lugar para la viñeta.
Si echas un vistazo rápido a la viñeta y en la parte inferior hay un pequeño guión de viñeta aquí y lo que hace es crear una explosión cuando la bala golpea algo y luego hace que la bala desaparezca esencialmente.
Correcto. Eso ya está programado para ti en el
archivo de recursos. Ok, ahora tenemos que configurar
el ataque para que el ataque ocurra. Si estamos en modo persecución, digamos que queremos
hacer la transición a Ataque. Haz una transición al ataque, cuando estemos ... digamos una distancia de menos de ...
10) Entonces tenemos una 'distancia de persecución' de 20 y ahora tendremos una 'distancia de ataque' menor a 10.
Ahora, si llega a ser mayor a 10, volveremos a perseguir.
Entonces, haga la transición de regreso
al otro
lado, seleccione esa transición y luego agregaremos la condición de 'distancia mayor que 10'.
Entonces, si ahora salimos de un rango de 10, volverá a perseguirnos.
Entonces, 'menos que' para atacar y 'más grande que' para volver al modo Chase.
Echemos un vistazo al comportamiento de nuestro tanque ahora.
Entonces estamos patrullando ... La propia patrulla nos acerca lo suficiente como para desencadenar la persecución, por lo que se disparará
y comenzará a perseguirnos.
Una vez que se acerque lo suficiente, se detendrá
y comenzará a disparar, como puede ver allí. Ahora no sigue avanzando hacia nosotros porque ese comportamiento de ataque no
tiene ningún código de movimiento.
Solo tiene un código de giro, por lo que si solo me muevo, seguirá intentando disparar en mi dirección.
Ahora, si me alejo lo suficiente, volverá a Chase y seguirá
persiguiéndome y luego, si me alejo lo suficiente, se olvidará de mí por completo y volveré a la Patrulla.
Ahora, lo que no tengo aquí es una transición que va del ataque
de regreso a la patrulla o al revés porque esta lógica se disparará directamente a través de estos
estados, dependiendo de qué tan cerca esté. Si de repente llegara a 10, pasaría por el estado Chase a Ataque y
ni siquiera tendría tiempo para ejecutar nada en el Chase.
Entonces está bien.
No necesito uno extra aquí, aunque podría poner
uno allí si lo desea,
pero en este caso, no es absolutamente necesario.
Obviamente ahora me está atacando fuera de la pantalla porque su punto de referencia me llevó a acercarme lo suficiente
a mi tanque y puedes ver eso aquí en la vista de escena, lo cual es muy divertido.
Ok, si me muevo nuevamente y salgo de la
carretera, debería olvidarse de mí y se restablecerá.
Está entrando en la patrulla y regresa al punto de referencia 1 y continúa por su pequeña ruta.
Muy bien, eso es en resumen, Máquinas de
estado finito y cómo emplear las máquinas de estado que están dentro del sistema mecanim para
hacer eso.
Ahora puede ver lo fácil que es y lo lógica que es la máquina de estados
finitos y lo que hace sobre la antigua forma de hacerlo, es que hay muchas declaraciones if
que quedan fuera de las distancias y cosas así, que normalmente tendría
programar en tu MonoBehaviour para cambiar el estado de tu
personaje, mientras que esto lo hará automáticamente en scripts separados que puedes usar en otros personajes y, por
supuesto, definir diferentes tipos de comportamiento para esos personajes incluso si son en el mismo estado