En esta conferencia, crearemos la base de un auto de carreras simple conducido por A. YO. Hasta ahora, hemos desarrollado un NPC que
puede seguir a un progresor de circuito de waypoint a un ritmo constante,
pero
en realidad, no es así como se mueven los automóviles.
En cambio, debemos considerar la velocidad, aceleración y desaceleración de los autos y programar el NPC para saber cuándo
acelerar y cuándo reducir la velocidad.
La velocidad es el vector que representa la velocidad de la APN, así como la dirección en la que viaja.
La velocidad se utiliza para impulsar el NPC hacia adelante. La aceleración y la desaceleración se consideran fuerzas que pueden
aumentar o reducir la velocidad con el tiempo.
También son vectores. Por lo general, la aceleración es una fuerza hacia adelante y la desaceleración
es una fuerza
hacia atrás, aunque podrían aplicarse en cualquier ángulo. Por ejemplo, en el caso de una colisión lateral.
Hasta ahora hemos desarrollado un NPC que seguirá un punto que está rastreando alrededor de un circuito de waypoint.
Este punto lo usaremos como los ojos de los NPC para ver cómo gira la pista.
Cuando la pista se ejecuta en línea recta, el NPC y el rastreador tendrán el mismo vector de avance.
Sin embargo, cuando el circuito se dobla, el ángulo entre el rastreador y los vectores de avance de los NPC se hará más grande.
Para seguir, mientras armamos este simple auto A. YO. , descargue los recursos WaypointsCarsStarter con
esto.
Cuando lo abras, obtendrás exactamente lo que estoy viendo aquí, aunque tus vistas de
escena y juego pueden ser ligeramente diferentes, pero en él tienes una pista de carreras con un circuito de
waypoint ya configurado, usando el mismo código que usamos en la última
conferencia y que agregué en un auto naranja. Ese auto naranja tiene un cubo adjunto.
Ahora este automóvil naranja tiene configurado el WaypointProgressTracker.
El cubo se establece como el destino para ese WaypointProgressTracker y hay un
script C # llamado SimpleAICar adjunto a ese automóvil. Ese script, si lo abrimos, encontrará que es muy
similar al último lote de código que tenemos para empujar objetos en línea recta, mientras
que continuamente están buscando un objetivo.
Así que vamos a tomar este script y modificarlo para agregarle un poco de dinámica del automóvil.
También es posible que hayas visto, en esta escena del juego, que se ha agregado un velocímetro.
Esto es impulsado por un código llamado AnalogSpeedConverter y no vamos a entrar en
eso, pero la velocidad del automóvil se alimenta al velocímetro.
Por lo tanto, le brinda una representación visual de lo que está haciendo el automóvil con respecto a su velocidad.
Ahora con este automóvil, si solo presionamos Reproducir, verán que gira alrededor de la pista a una velocidad constante.
Por lo tanto, va a subir a 200 (como puede ver en el dial) y solo debe seguir constantemente alrededor del cubo,
ya sea que esté en la esquina o no.
Esta velocidad no es muy indicativa de una velocidad real, por lo que dice que va a
200 pero es 200 'metros por segundo' o 200 'kilómetros por hora'.
No parece que esté viajando a ninguna de esas velocidades y eso
se debe a la forma en que lo estamos calculando.
Así que también cambiaremos eso y lo actualizaremos, para que el dial tenga sentido.
De vuelta en nuestro código, lo primero que haremos es modificar la forma en que se configura la velocidad.
Así que quiero que te deshagas de estas dos líneas (o las muevas) y vamos a poner esto.
Entonces comenzamos con una aceleración de 5, luego una desaceleración que también tengo como 5 (estos
dos valores pueden cambiar, en función de la potencia y la potencia de frenado que tendrá el automóvil), una velocidad
mínima y un velocidad
máxima (porque sin esto, puede hacer que su automóvil retroceda cuando no lo desea porque está
frenado demasiado), y una velocidad máxima para evitar que vaya demasiado rápido al infinito.
La velocidad misma viene aquí, ahora he sacado al público de esto porque la velocidad ya no es una variable
expuesta.
Vamos a calcularlo.
No vamos a configurarlo.
Las otras cosas que tengo aquí son aceleración, desaceleración, velocidad mínima y máxima NO como variables expuestas,
aunque puede exponerlas más adelante.
Por lo tanto, deben ser configurados por el usuario.
La razón por la que hago esto es porque siempre olvido cuando estoy editando que si trato de
cambiar los valores aquí y están expuestos, no cambia en el Inspector y luego
paso mucho tiempo tratando de averiguar por qué Mi código no funciona.
Así que me parece mejor no tenerlos expuestos hasta que tenga todo funcionando de la manera que quiero.
A continuación, agregaremos nuestro cálculo para la velocidad.
Vaya a justo antes de que se use la velocidad, en esta función Traducir aquí y por encima de
eso, vamos a agregar ESTO: 'Velocidad ='. Estamos usando un Mathf. Sujete y eso se asegurará
de que cualquier cálculo de velocidad que coloquemos aquí, se sujete entre minSpeed y maxSpeed.
Entonces, este bit primero en la abrazadera está haciendo un cálculo para nosotros, que luego pondrá en 'velocidad'.
Sin embargo, si queda fuera de ese rango, lo fijará a 0 o cualquiera que sea la
velocidad máxima.
Este cálculo aumenta la velocidad con ... tiempo de aceleración. deltaTime y porque nos hemos
multiplicado por Time. deltaTime allá arriba, podemos bajar y eliminarlo
del Traductor
para que solo estuvieran haciendo una velocidad simple.
Ahora, la otra cosa con este convertidor de velocidad (que le muestra el dial en la pantalla) es que se necesita
un valor 'min' y 'max' para calcular cuánto debe girar la aguja.
Ahora, en este caso, será minSpeed y 100 será maxSpeed.
Entonces va a ir, en este caso, entre 0 y 100.
Así que guardemos eso, regresemos a Unity y presione Play y
ahora, en lugar de que el dial gire y alcance la velocidad máxima, se acelerará lentamente.
Entonces puede ver que el dial aumenta y el automóvil sigue el cubo. También puede ver que necesitamos corregir
el formato de nuestra velocidad y luego
llegamos a un punto que puede ver aquí. ¿Ves cómo el auto salta
y gira dando vueltas alrededor de ese rastreador? Es el mismo problema que hemos tenido en el pasado con nuestros NPC cuando no
están llegando al punto en el que necesitan
estar y este automóvil esencialmente no puede seguir al rastreador porque está atascado. Ahora, para arreglar eso, si entra
en su automóvil y baja a su circuito adjunto WaypointProgressTracker, el 'Look Ahead For Target' se establecerá en
1 y también el
'Look Ahead For Speed', que son demasiado grandes.
Bajarlos a 0. 1 en su lugar,
para que no estemos mirando hacia el futuro.
Nos estamos quedando mucho más cerca de ese rastreador de puntos de referencia.
Luego, si corremos de nuevo, verás que se mantiene agradable y cerca, pero lo que no
va a hacer es alejarse demasiado y tampoco va a cortar esquinas.
Entonces, a medida que aumente ese valor para el 'Objetivo de anticipación', comenzará a alejar su automóvil del rastreador
de puntos de referencia. Si solo detengo esto por un segundo ... porque está calculando en línea recta hasta
ese punto, cuando el rastreador de waypoints está a la vuelta de la esquina y
si los autos están aquí, podría rastrear directamente a través de la pista aquí y lo
encontrará a medida que construya más sistemas que obtendrá el automóvil va a la zaga detrás del cubo y cortará esquinas y no se
mantendrá en la pista perfectamente, y es por eso que necesita ajustar estos 'Mira hacia adelante' y los valores de velocidad a su
circunstancia y a sus pistas. Entonces, si volvemos a jugar ...
ahora vamos a 100, que es extremadamente rápido como se puede ver en esta pista, pero el auto
sigue el circuito y el seguimiento de la pista, así que eso es bueno.
Ahora, lo que está sucediendo es que está llegando a 100
y esa es su velocidad constante. Por supuesto, los autos reales no hacen eso.
No vas a la vuelta de la esquina a las 100.
Así que ahora queremos cambiarlo para frenar cuando lleguemos a una esquina. Si puede correr y detenerse en una esquina,
obtendrá una situación como esta.
Observe cómo el vector orientado hacia adelante de los automóviles no está alineado con el vector orientado hacia adelante del rastreador.
Cuando esto sucede, significa que el automóvil viaja en una dirección diferente al
rastreador y, por lo tanto, sabemos que el rastreador ha doblado una esquina y el automóvil no.
Cuando esto sucede, queremos aplicar los frenos (o poner desaceleración en nuestro cálculo de velocidad) y podemos determinar cuándo hacer esto en
nuestro código calculando el ángulo entre cada vector hacia adelante. De vuelta en el código, agregaremos otra
variable
en la parte superior: 'float brakeAngle' y este será el ángulo en el que aplicaremos
los frenos, por lo que debido a que es una variable, puede cambiarlo
para diferentes tipos de automóviles. Algunos pueden ser muy cautelosos y frenar cuando hay un ángulo pequeño.
Otros pueden ser un poco más temerarios y puedes tener un ángulo grande, pero configuremos 20 para comenzar
como nuestro ángulo.
Entonces, ese es el ángulo de freno que probará el ángulo entre nuestro vector de avance y nuestro vector de avance del
automóvil.
Así
que haremos eso aquí abajo en la Actualización. Actualmente, estamos calculando la velocidad por
sí solo aquí y solo tiene la aceleración. Ahora la desaceleración será el mismo trato, pero será un signo negativo.
Reemplacemos esta línea aquí
con esto. Entonces esto se calcula con un Vector3. Ángulo. Puede darle dos vectores para que
el vector delantero de la meta y el vector delantero del
automóvil y luego probar si ese ángulo es mayor que el ángulo de freno.
Si es así, entonces vamos a desacelerar (por lo que vamos a aplicar los frenos esencialmente), de
lo contrario seguiremos acelerando. Mientras estemos aquí, arreglaremos
el texto leído en el velocímetro, lanzando la velocidad a un 'int', solo para cortar
todos los decimales.
Bien, guarda eso.
Ahora vamos a jugar.
Así que comenzamos acelerando y cuando lleguemos a la primera curva, verás que la velocidad tiene un pequeño hipo
y luego, al pasar por otras esquinas, verás que la aguja de la velocidad desciende un poco, por
un un poco.
Pero la cosa es que todavía está acelerando y si lo dejamos correr lo suficiente, alcanzará
la velocidad máxima.
Ahora, la razón por la que esto ocurre es porque la rotación entre el vector de avance de los autos y el vector de
avance de los cubos no es
lo suficientemente diferente como para que nos preocupemos por aplicar los frenos.
La razón es que, si dejamos de jugar, entra al auto y baja a tu WaypointProgressTracker.
Si echas un vistazo, tienes este valor 'Mira hacia adelante para la velocidad' que actualmente está configurado en 0. 1)
Ahora ese es el cubo girando por sí mismo, por muy lejos que pueda mirar en la pista y
cuánto puede girar. Entonces, esto es como la velocidad de rotación de los cubos.
Ahora, si cambiamos eso a algo como 1, permitirá que el cubo se actualice mucho
más rápido para más adelante. Ahora, si observa el cubo mientras presionamos Reproducir aquí, verá que gira sobre su propio eje y lo
que hará es permitir que el automóvil aplique los frenos en las esquinas. Entonces, cuando llegue a la
esquina, vea que el cubo gira y gira bastante rápido (y aquí arriba también lo
hará) y los frenos ahora se están aplicando mucho porque hay una gran diferencia entre el automóvil y
el cubo y puedes ver que realmente está disminuyendo la velocidad aquí.
Así que de nuevo todo se reduce a "¿Qué buscas, en esto? "y" ¿Cómo quieres que se vea y funcione? ".
Dependerá del tamaño de su mundo y también del tamaño de la pista porque el mundo ... recuerde que un cubo mide 1 metro x 1
metro x 1 metro y, por lo tanto, esta pista
(puede ver que el cubo blanco se hizo como un cubo unitario), no es una
pista muy grande.
No puede esperar alcanzar una gran velocidad. Si desea velocidades del mundo real, debe asegurarse de
que su pista también esté en las coordenadas del tamaño del mundo real.
Así que dejemos esto aquí y en la próxima conferencia comenzaremos a ver la personalización de las
propiedades para crear un comportamiento NPC único.