Esta conferencia se extiende sobre la última conferencia al mover a nuestros personajes hacia una
meta, donde luego se detendrán. Para hacer esto, necesitará una ubicación de objetivo.
He creado un cubo simple haciendo clic derecho, Objeto 3D> Cubo y luego posicionándolo en algún lugar
del entorno.
Para empezar, vamos a conseguir que uno de los personajes avance hacia la meta.
Por lo tanto, seleccione los personajes que están en la escena y asegúrese de eliminar el guión que ya
está adjunto a ellos.
Ahora vamos a crear un nuevo archivo C # llamado MoveToGoal.
Es un poco diferente al código Move que escribimos antes,
pero aún necesitamos calcular con vectores y, en la parte superior, comenzar agregando un flotante para la velocidad y lo tengo configurado
en 1. 0.
De hecho, podría configurarlo en 2 para que las cosas vayan un poco más rápido esta vez.
Luego tengo una transformación pública expuesta llamada 'objetivo' que
ahora está cambiando desde el código anterior. Antes, teníamos objetivo como vector.
Ahora es una posición en el medio ambiente. Dentro de nuestro LateUpdate, necesitamos calcular la dirección.
Este es el vector entre la posición del objetivo y la posición del personaje. Para hacer eso, simplemente menos a dónde
vamos (por lo tanto,
la posición de la meta) menos dónde estamos actualmente.
Así que esto es "hacia dónde vamos" y esto es "hacia dónde estamos".
Tiene que estar en ese orden.
Si los cambia al otro lado, su vector estará orientado en la
dirección opuesta y su personaje seguirá el mismo vector ...
o al menos a lo largo del mismo tipo de línea hacia
su objetivo, pero viajará en la dirección opuesta.
Si alguna vez sucede eso, entonces sabe que tiene estas dos cosas en el camino equivocado.
Una vez que haya calculado el nuevo vector para viajar, utilice nuevamente su Traductor y coloque el vector que calculó
en el interior, multiplique por velocidad
y multiplique por Tiempo. deltaTime.
Entonces todavía estamos viajando a lo largo de un
vector, pero esta vez lo hemos calculado.
Así que guarde eso, vuelva a la Unidad.
Ahora querrás tomar uno de tus personajes y arrastrar y soltar ese guión del proyecto sobre ellos.
Aquí puede ver que tengo el script MoveToGoal adjunto y he configurado la velocidad a 2 (bueno, el código lo hizo de
todos modos).
Agarra tu cubo y asegúrate de arrastrarlo y soltarlo como la posición del objetivo.
Ahora presiona Reproducir y mira lo que sucede.
Entonces, tu personaje ha calculado la dirección que debe seguir y llegará a la
ubicación de la
meta y luego dejará de moverse, pero está nervioso. La razón es porque todavía estás dentro de ese ciclo de actualización pidiéndole que
calcule la dirección hacia la meta y avance hacia ella.
Ahora, en la mayoría de los casos, no conseguirás que tu personaje aparezca en la ubicación exacta de tu objetivo y, por lo
tanto, debes tener algún tipo de cálculo 'lo suficientemente cerca es lo suficientemente bueno' incluido.
Justo antes de hacer eso, quiero mostrarte algo.
Si movemos a nuestro personaje aquí y presionamos Reproducir, calculará un nuevo vector para la meta y
avanzará hacia la meta.
Ahora, para detener esa inquietud que ocurre cuando llegan a la meta, regrese
al código y queremos poner algo en la actualización aquí para probar si hemos alcanzado nuestra meta.
Si hemos alcanzado nuestro objetivo, entonces no queremos seguir calculando el vector hacia él y avanzando
hacia él.
Entonces puedes hacerlo probando la longitud de la dirección. Ya has calculado este vector y ¿puedes recordar cómo se
llama, la longitud de un vector? Es la magnitud.
Entonces podemos decir 'if (dirección. magnitud> 5) luego avance hacia la
meta.
Así que guarde eso y vamos a verlo.
Entonces, cada vez que se repite y se calcula la dirección, se vuelve cada vez más
corto, el vector en sí mismo. No permanece establecido en el vector original. Aunque todavía está en
la misma dirección, será más corto.
Así que ahora puedes ver que se movió.
pero no muy lejos y eso es porque una distancia de 5 es aproximadamente esa distancia
en este caso, porque estos son pequeños personajes bastante pequeños y tendrás que asumir la responsabilidad
de comprobar la escala que está ocurriendo en tu mundo.
Así que volvamos aquí y hagamos esto 1 y ejecútelo de nuevo.
Ok, entonces debe estar a una distancia de 1 del cubo y si hacemos clic en el cubo y observamos el que creé, puedes
ver que la escala es 0. 2) Eso hace que ese cubo (en términos mundiales) tenga unos 20 cm de ancho.
Cuando un cubo tiene el tamaño 1, que es su tamaño predeterminado, eso sería 1 mx 1 mx 1 m en
el mundo de Unity y, por lo tanto, puede imaginar que 5 de esos cubos encajarían en ese espacio allí, para esa distancia de 5 desde antes. Ahora puedes ver que todavía es
bastante grande, si
quieres que tu personaje esté justo encima de la
ubicación de la meta.
Entonces, intentemos una vez más con un valor
menor.
Regrese a MoveToGoal y cambiaremos esto a 0. 2f.
Guarda eso y ejecútalo de nuevo y el personaje debería estar muy cerca del objetivo en este caso y puedes ver que lo está, así que eso es bastante aceptable.
Voy
a mover este
valor de 0.
1 arriba, así que hagamos esta 'precisión de flotación pública' porque es la precisión que estamos dispuestos a llevar a un objetivo cercano. Vamos a ponerlo
a 0. 01f.
Así que lo haremos muy cerca y luego aquí abajo, pondremos precisión ...
como eso.
Muy bien, así que guárdelo y volveremos y lo ejecutaremos y solo veremos si eso hace alguna diferencia con esa precisión tan estricta.
Eso es bastante bueno.
Lo que quiero mostrarte es algo que hará que tu personaje siga inquieto con este código en particular.
Cambiemos la velocidad a cinco con esa precisión realmente ajustada y corramos de nuevo Ok, por lo que el personaje tembló antes de que
finalmente alcanzara esa precisión.
Lo que está sucediendo aquí es que llegó a la meta, superó la marca, recalcula la dirección de regreso a la meta, sobrepasa la marca y termina rebotando de esta manera porque su
5
velocidad aquí la empuja sobre la meta y luego empuja sobre el objetivo y empujarlo sobre el objetivo de esa manera también.
En este caso tuvimos suerte de que eventualmente se moviera a una
posición que pudiera alcanzar esa precisión, pero a veces no entrarás con esa precisión y obtendrás un
comportamiento realmente extraño en lo que respecta al
personaje bailando.
El
punto de gol.
Eso se debe a que nunca está llegando allí dentro de su precisión.
Entonces, si obtienes eso, solo juega con tus valores de precisión hasta que los hayas elevado lo
suficiente como para evitar que eso suceda, de lo contrario tendrás que reducir la velocidad a
la que atacan tu posición de objetivo.
Voy a volver a poner esta precisión en 1 para este y
luego para el otro personaje ...
pongamos el mismo código y dejémoslo con la velocidad predeterminada, pero
establezcamos la precisión en 0. 1 en lugar de 1.
También necesitamos establecer el cubo en la ubicación de la meta para este tipo aquí y ahora
si presionas Reproducir, se moverán hacia la posición de meta. Como actualmente lo tenemos funcionando, se deslizarán desde su posición
actual hasta la posición de meta, pero no giran y miran en la dirección en
la que viajan, y eso
sería una buena adición para que un personaje haga eso .
En los viejos tiempos, teníamos que calcular los ángulos entre los vectores y de qué lado estaban los
vectores, en relación con los otros vectores, para descubrir cómo cambiar tu
personaje.
Ahora tenemos esta gran función llamada LookAt that Unity tiene que
hace todo ese trabajo duro por nosotros y voy a ponerla en la función de Inicio para que
nuestro personaje primero gire y mire hacia dónde está a punto de ir.
Ese método o función se llama LookAt y lo agrega al final de la transformación y luego le
da la posición de meta que desea que vea su personaje y se moverá y mirará
en esa dirección.
Ahora, en este punto, si lo ejecuto, porque hemos cambiado la orientación del personaje, este Traductor no funcionará correctamente y solo guardaremos
esto y volveremos y echaremos un vistazo rápido a lo que obtienes y yo
' Te mostraré cómo solucionarlo.
Así que ahí tenemos esto y puedes ver que los personajes tienden a arquearse hacia
él y este personaje simplemente girará en espiral hasta que se acerque lo suficiente.
Lo que sucede allí es que ahora que estos personajes ya no están (0,0,0) rotación aquí
arriba en la transformación.
Si ha estado siguiendo y ha cambiado la rotación de sus personajes, probablemente no podría descubrir qué
estaba mal con su código
y este es el problema exacto.
Entonces, en su MoveToGoal, lo que quiere hacer en su Traductor es 'traducir' su
personaje a lo largo de este vector en 'espacio mundial' en lugar de 'espacio local'.
Ahora, si guardas eso y corres, verás que tus personajes se vuelven hacia su objetivo
y luego viajan hacia él. En la escena, tengo estas líneas rojas que habrías visto y
que dibujan los vectores del código con una depuración. DrawRay que dibuja un rayo
desde la posición en una dirección particular y luego le da un color.
Esto es realmente útil para depurar para ver qué está pasando.
Así que acabo de incluir eso, para que pueda usarlo en su propio código para ver qué vectores están haciendo
qué y hacia dónde apuntan.
Muy bien, esa es la manera fácil de hacer un LookAt.
Es posible que hayas notado en este punto, si lo ejecutamos nuevamente y agarras el cubo y en la escena
lo mueves, verás que los personajes responden a su ubicación de forma natural, debido a lo que
hay en esa actualización.
Tenga en cuenta que LookAt no se está actualizando y eso es porque todavía está en la función Inicio.
Entonces, si cambiamos ese LookAt aquí y nos aseguramos de volver a calcularlo cada vez dentro de nuestra Actualización, los
personajes siempre estarán mirando ese cubo y luego lo que podrías hacer es obtener un guión de conducción para que puedas
manejar ese cubo con el teclas de flecha y los personajes se moverían donde quiera que vaya.