Muy bien.
Así que ahora a la actualización.
Deshagámonos de la base.
No vas a necesitar eso de nuevo.
En primer lugar, tenemos que calcular la dirección hacia el jugador y el ángulo porque queremos rotar
el NPC.
Así que están disparando en la dirección del jugador.
De lo contrario, tendrá un aspecto un poco extraño.
Así que esto va a ser un vector tres.
Queremos que la dirección sea igual a la posición del jugador menos la posición de transformación del PNJ.
Entonces vamos a obtener nuestro ángulo flotante es igual al vector.
Tres ángulos de punto es el mismo código que hemos escrito antes para encontrar el ángulo, la dirección y el punto de transformación
NPC hacia adelante.
Y una vez que tenemos esa dirección, lo que vamos a hacer con ella es establecer el por qué de la misma para que sea la dirección cero
y sea igual a cero.
Ahora, ¿por qué estoy haciendo eso?
Porque queremos rotar el personaje, pero no queremos que el personaje se incline en los ejes X
o Z en absoluto.
Sólo queremos que gire en el punto que está alrededor de su vector ascendente.
Por lo tanto, tenemos que asegurarnos de que cualquier diferencia entre el jugador y el propio PNJ sea nula
en lo que respecta a la altura.
Ahora para hacer la rotación, usaremos un retorno hacia adentro.
Así que la rotación del punto de transformación NPC es igual a la vuelta en el deslizamiento del punto.
Así que vamos a hacer un bucle esférico entre dos ángulos.
Así que la rotación del punto de transformación de NPC, es la rotación actual.
Y luego ponemos un retorno en.
No mirar la rotación en la dirección que acabamos de calcular, que es el vector hacia el jugador y queremos
girar eso usando nuestra velocidad.
Así que se cronometrará el tiempo Delta multiplicado por la velocidad de rotación.
De acuerdo.
Así que eso va a rotar tu NPC para que siempre esté de cara al jugador cuando esté atacando.
Ahora, recuerda, necesitamos una forma de salir de la actualización.
¿Cuándo vamos a dejar de atacar al jugador?
Bueno, si no podemos ver al jugador o, en realidad, si ya no podemos atacar al jugador, por lo que el
jugador ha salido de su alcance, entonces será lo siguiente.
Estado.
Iguala al nuevo ídolo y.
Agente.
El jugador Adam.
Desde aquí puedes volver a cualquier estado, así que puedes volver al estado de persecución o puedes
volver al estado de patrulla.
Depende de ti cómo quieras que funcione.
La razón por la que hago esto es que si has estado en ralentí, el ralentí realmente te permitirá llegar a cualquier
otro estado.
Si esperas lo suficiente y no tienes que esperar lo suficiente, porque lo que
ocurrirá en este caso es que si te sales del rango, dejará de dispararte, lo que hará que vuelva al estado
de reposo.
Entonces habrá como un 10% de posibilidades de que pase al estado de patrulla y entonces será el estado de patrulla
el que determinará si puede ver al jugador y entonces podrá caminar hacia el jugador y atacarlo.
Así que va en un bucle completo para volver de nuevo.
Y sí significa que si corres lo suficientemente rápido y te pones fuera del alcance del NPC, entonces simplemente se olvidará
de ti y se pondrá en reposo de todos modos y luego volverá a patrullar.
Bien, entonces esa es nuestra salida de la actualización y sólo tenemos que ir a la etapa de salida de eventos iguales para asegurarse de
que eso suceda.
Y luego terminar con ese corchete.
Así que luego nos dirigimos a la salida y tendremos algunas cosas habituales como hemos hecho antes con
Adam.
Reiniciar.
El gatillo cuatro está disparando.
Y luego dispara.
No te detengas.
Así que ese es más o menos el código para el ataque y también para la persecución.
Lo que aún no tenemos es una forma de activar esos estados desde el inicio.
Así que vamos a volver a la parte superior a nuestro ídolo y vamos a ir a la actualización y establecer que
si el jugador se hace visible que empezamos a perseguirlos.
Bien, entonces bajemos aquí y hagámoslo.
De hecho, lo haré por encima.
Haremos de este uno más si para eso.
Y luego vamos a ir por encima de aquí y poner si.
Puedes ver Playa.
El siguiente estado equivale a una nueva persecución.
Y P. S..
El agente Adam y el jugador.
Y luego el escenario.
Equivale a un punto de evento.
Salir.
Así que vamos directamente a la persecución y también podemos en la patrulla de utilizar esta misma declaración si.
Así que si estamos patrullando y vemos al jugador nos detendremos y empezaremos a perseguirlo.
Así que copiar eso y vamos a bajar a la patrulla y vamos a poner que dentro de la actualización.
Vamos a ponerlo después de aquí.
Mientras esté en la actualización y se vaya a ejecutar en algún momento y luego cambie al nuevo
estado, lo que requiere estas dos líneas.
Por supuesto, estaremos bien.
Ahora sabemos que si ya estás en persecución y te acercas lo suficiente, entonces se desencadenará el ataque.
Así que no vamos a pasar directamente al ataque.
Vamos a dar una persecución.
Ahora bien, aunque de repente te acerques mucho a él y pueda atacarte directamente,
pasará por la persecución y realmente no te costará mucho más hacerlo de esa manera.
Sí.
Así que tenemos que guardar eso.
Ahora volvamos y justo antes de probar esto, si seleccionas, puedo ir al código I.
Tenemos este personaje PHP que ponemos ahí, pero este personaje no está realmente donde está nuestro
personaje real.
Es como aferrarse a nuestro carácter.
El personaje se define básicamente por esta cápsula, por lo que nos interesa más que pueda ver esta
cápsula en su alcance y distancia visibles.
Así que lo cojo y lo cambio en su código.
Así que está mirando eso en su lugar, ¿verdad?
Así que vamos a pulsar el play.
Y puede que ya estemos en su rango visual.
Sí, así es.
Así que va a empezar a dispararnos así.
Ahora, si mantienes pulsados los botones shift y se, deberías ser capaz de huir lo suficientemente lejos.
Y luego, si podemos rodear estos árboles, sigo chocando con detrás de mí vas, perderá
el interés y volverá a patrullar.
Así que en este punto deberíamos ser capaces de acercarnos por detrás de él.
De acuerdo.
Vamos a mostrarte algo más aquí.
Así que si paso por delante de él y me pongo en su cara de nuevo, empezará a perseguirme de nuevo.
Cambia a la baja para huir.
Al final perderá el interés.
Y vuelve.
Ahora, si lo seguimos y echamos un vistazo, lo que sucede es que en realidad se dirigirá directamente
a la baliza cero porque está programado para crear un nuevo estado de patrulla cada vez.
Así que eso no es especialmente realista.
Debería, cuando termine de perseguirnos, volver al waypoint más cercano y seguirlo.
Ahora, esto heredará algunos problemas que tienes con el caminar a través de la geometría y eso.
Pero como es un agente de malla naval y porque tenemos colisionadores y eso y el entorno,
debería ser capaz de sortear esos.
Bien, dejemos de jugar.
Ahora, lo que vamos a hacer es actualizar nuestro código para encontrar el waypoint más cercano.
Resiste.
Bien, entonces vamos a abrir nuestro código para el estado y vamos a poner eso en el estado de patrulla en el enter, donde
vamos a encontrar el más cercano en lugar de sólo usar el cero.
Así que vamos a deshacernos de este índice actual y en su lugar vamos a resolverlo.
En primer lugar, necesitamos un float para almacenar la distancia que estamos calculando entre cada uno de los waypoints
y el NPC y para recordar la distancia más pequeña.
Así que vamos a empezar con un flotador llamado lastest y vamos a ponerlo a algo muy grande y muy grande
significa infinito.
No se puede conseguir mucho más que eso, así que cualquier otra distancia que comparemos para empezar tendrá
que ser más pequeña.
Bien, ahora necesitamos que int i sea igual a cero.
I es menos que y aquí viene nuestro fantástico singleton.
Los puntos de control no cuentan.
Yo más más.
Así que este es nuestro bucle for que vamos a ir alrededor de todos ellos entonces vamos a obtener el singleton.
Así que objeto del juego.
Este punto del camino es igual.
Entorno de juego.
Punto único.
Puntos de control.
I.
Entonces calculamos la distancia.
Así que la distancia flotante es igual a la distancia vectorial de tres puntos entre la posición transformada en punto del NPC y esta posición transformada
en punto del waypoint.
Todo esto lo escribo en líneas separadas.
Por supuesto, si quieres ponerlo en una gran línea, está bien.
Pero en cuanto a su legibilidad, si lo hiciera, no podría ver lo que está pasando.
Bien, ahora tenemos nuestro waypoint.
Tenemos la distancia que vamos a recorrer.
Si la distancia que acabamos de calcular es menor que la última dist que de esta manera, un punto debe estar más cerca.
Por lo tanto, el índice actual va a ser igual.
Y la última distancia va a ser igual a la distancia.
Así que estamos actualizando cada vez.
Así que cada vez que consigamos una distancia más pequeña, la última, la iremos reduciendo
hasta encontrar la que queremos.
Ahora, hay un pequeño ajuste que tengo que hacer aquí para que esto funcione.
Sabemos que estamos recibiendo el índice del waypoint que está más cerca de nosotros, pero a donde se va a dirigir
el NPC es al que está después de ese.
¿Cómo lo sé?
Pues bien, en la actualización, le añado un uno o lo pongo a cero antes de fijar el destino.
Por lo tanto, en realidad tenemos que sentar este aquí a menos uno o de alguna manera lo dijo dentro de la actualización, que va a hacer que sea un poco difícil porque las actualizaciones
están constantemente corriendo alrededor.
Así que va a ser más fácil aquí si vamos menos uno y luego cuando llegamos a actualizar, dejar que el índice actual de
actualización.
Así que si el más cercano es, digamos, el tres, entonces.
Y no tenemos el menos.
Va a entrar aquí y le va a sumar uno y nos va a dar cuatro.
Y por eso vamos a dirigirnos al equivocado.
Así que necesitamos ese menos uno ahí arriba.
De acuerdo.
Así que solo te digo eso, para que no uses este tipo de código para encontrar tu proximidad más cercana a
una lista de cosas sin deshacerte de este menos uno.
Bien, pulsemos el play y veamos su comportamiento ahora.
Así que nos van a disparar inmediatamente por el lugar donde estamos.
Así que este es el punto cero.
¿Dónde está realmente parado?
Vamos a ir por aquí.
Debería seguirnos.
Es más fácil si avanzo porque seguro que me encuentro con algo.
Bien, ahora puedo volver rápido aquí hasta que pierda el interés.
Bien, entonces está caminando.
Debería dar la vuelta en breve si no me alcanza.
Ya está.
Bien, entonces volvamos a seguirlo para ver a qué punto de ruta va primero.
Así que debería elegir su punto de ruta más cercano, que es ese.
Y cuando llegue allí, continuará su ruta, como acabas de ver entonces.
Así que no necesita volver al principio cada vez porque eso no tiene ningún sentido.
De acuerdo.
Así que ese es el patrón de estado en código finito.
Y la IA es extremadamente corta y estamos.
Confiando totalmente en estos estados y el código en estos estados para encarnar un único estado, pero también
decirle al NPC cómo pasar de un estado a otro.
Así que, básicamente, una vez que te vas a otro estado, el lugar de donde vienes se olvida por completo.
Y si necesitas un sistema que sea así, entonces es posible que quieras mantener algún tipo de enlace con
el estado anterior, lo que podrías si vas a la parte superior aquí.
¿Y dónde se declara nuestro próximo estado?
Tenemos nuestro próximo estado aquí.
Podrías tener otro que diga el último estado del que vienes.
En cierto modo, sería como una lista enlazada de doble E en la que se puede ir hacia adelante y hacia atrás entre los estados si
eso es lo que se necesita.
Muy bien.
Así que espero que disfrutes aprendiendo sobre el patrón de estado, porque creo que es muy, muy potente
y muy divertido jugar con él.
Y puedes construir muchos sistemas diferentes con él.
De hecho, el sistema del GOP del que hablo en mi curso utiliza un sistema de clases estatales muy parecido
a este.