En esta conferencia, me gustaría que siguieras mientras examinamos el movimiento a lo largo de una línea recta usando vectores.
Descargue el proyecto de recursos que viene con esta conferencia. Allí encontrarás un Hombre / personaje y encima de
eso se agregará un script de Movimiento y es el script de Movimiento en el que vamos a trabajar.
Así que ábrelo y echa un vistazo aquí.
Puede ver en el script que hay un Vector3 que es un objetivo.
Entonces, el Vector3 es una versión 3D de nuestro vector que tiene una x, yyz, y inicialmente estamos configurando ese vector para que sea 5 en la
dirección x, 0 en la dirección y y 4 en la dirección z. Debido a que este es un personaje humanoide
en una superficie plana, cuando lo
movemos, no estamos agregando ninguna 'y' porque no quieres que suba y flote en el
aire.
Si fuera un avión o algo que vuela, sería completamente diferente.
Observe también que no hay física involucrada en este proyecto.
Estamos moviendo este personaje simplemente usando nuestro propio código y eso es para que podamos mantener el control de él.
Ahora en la función de Inicio, estamos agregando nuestro Vector3 a la posición actual de nuestro personaje.
Así que aquí tenemos una transformación y estamos ejecutando un Traductor.
Lo que hace es agregar el 'vector objetivo' al 'vector de transformación'. Con eso guardado, regrese a Unity
y presione Reproducir.
Y lo que verás es que tu personaje salta "tanta distancia" a lo largo de ese vector. Debido a que está en la función
Inicio,
agrega todo de una vez y mueve a tu personaje a ese objetivo.
Ahora eso no
va a funcionar si quieres mover el personaje bit por bit en la Actualización y hacer
que parezca que se está moviendo. Así que deja de jugar. Volvamos a Mover y echemos un vistazo a mover
este Traducir hacia abajo en la Actualización.
Deshágase del que está en Inicio y guárdelo, vuelva a Unity y presione Reproducir.
Y lo que notará es que el personaje desaparece por completo, pero si selecciona el Hombre en
la Jerarquía, eche un vistazo a la transformación y la posición en la xy la z va hacia arriba y hacia
arriba y hacia arriba y eso es porque todo el vector se agrega cada vez que se produce una actualización.
Entonces se está moviendo, está saltando a pasos agigantados y alejándose cada vez más para
que no podamos verlo. Así que paremos eso.
Lo que queremos, en lugar de saltar a la posición de meta, es movernos en pequeños pasos a lo largo de aquí, exactamente
en la misma dirección que ese vector.
Entonces, para obtener una versión más pequeña del vector, puede dividir el vector más grande por un número que dará algo más pequeño.
Entonces, si volvemos a Mover y en el Inicio,
vamos a goal = goal * 0. 5f; y eso reducirá a la mitad el tamaño del gol.
Así que ahora debería moverse en la misma
dirección, pero debería verlo detenerse a mitad de camino y luego saltar a la ubicación de la meta.
Pero después de eso, seguirá pedaleando y agregando el gol. Guarde eso, vuelva a Unity, presione Reproducir.
Probablemente lo viste saltar un poco allí y eso fue cuando se movió en esos pasos, todavía un gran salto, pero
solo la mitad del vector cada vez.
Así que volvamos a Move.
¿Qué sucede si multiplicamos esto por 0? 01, entonces obtenemos el 10% de ese vector en su lugar.
Cualquier cosa que multipliques o dividas en el vector seguirá en la misma dirección en la que
quieres que vaya tu personaje.
Así que juguemos este, eche un vistazo.
Eso es mucho más suave en el movimiento y se está moviendo hacia la ubicación de la meta.
Ahora la ubicación del objetivo en sí no era una posición en el espacio.
Fue una "dirección de gol".
Entonces, hay una diferencia entre un punto y un vector. Un punto es un lugar fijo en algún lugar de tu mundo.
Un vector es solo un conjunto de instrucciones sobre en qué dirección moverse, desde cualquier lugar de su mundo.
Entonces, tu personaje ahora está en algún lugar, si haces clic en él, sigue avanzando al 10% del
'objetivo' cada vez.
Ahora, si simplemente multiplicamos 'nuestro vector, queremos que nuestro personaje se mueva' por un pequeño número,
entonces cada vez que ese vector cambie, afectará la velocidad de nuestros personajes.
No se moverá a una velocidad constante y podemos ilustrar eso agregando otro personaje.
Entonces, antes que nada, hagamos público nuestro objetivo de vectores, para que podamos cambiarlo, luego lo
multiplicaremos por 0. 01 y traducir a lo largo de eso.
Así que solo guarda eso.
Ahora, si volvemos a la Unidad, haga que el Hombre y simplemente Ctrl-D se dupliquen y luego muévalo e intente que se mueva
en esta dirección, queremos que se muevan paralelos entre sí.
Así que solo quiero ponerlo allí.
Pero para este tipo, su objetivo de movimiento, multipliquemos por 2.
Entonces está el doble de lejos.
Está aquí afuera en alguna parte.
Entonces hagamos que 10, 0 y
8.
Entonces, cuando lo ejecutamos, veremos diferentes velocidades. mira cómo este tipo va mucho más rápido porque el
10% de ese vector más largo será un salto más grande que el 10% del más corto.
Por lo tanto, no están a una velocidad uniforme y eso hará que el movimiento de tu personaje sea
inconsistente cuando se mueven a lo largo de diferentes vectores de longitud.
Entonces, la pregunta es cómo podemos obtener un
vector que tenga un tamaño estándar, que apunte en la misma dirección a lo largo del vector por el que estamos viajando.
La solución es obtener su versión 'Normalizada'. La versión normalizada de cualquier vector es un vector
que tiene una longitud de 1 y puede encontrar la versión normalizada de un vector dividiendo cada uno
de los valores x, y y z del vector por la magnitud.
Ahora también puedes hacer que Unity lo haga por ti.
Volvamos al movimiento y, en lugar de tener nuestro objetivo aquí, nos
movemos multiplicado por 0. 01 solo para hacerlo mucho más pequeño, queremos convertirlo en un tamaño estándar.
Así que vamos a deshacernos de eso por completo y
lo que estamos tratando de hacer es traducir a lo largo de la meta. normalizado ... así y será un vector
de unidad de longitud 1 en la misma dirección.
Ahora, cuando juegas, esto probablemente será demasiado lejos.
Entonces, si volvemos y lo ejecutamos. Sí, se puede ver que se movieron al mismo ritmo,
pero fue bastante nervioso y fue un gran salto cada actualización.
Pero ahora sabemos que tenemos un movimiento de unidad 1 estandarizado en cada actualización y ahora que tenemos
esto, podemos multiplicar esto por un valor de velocidad para cambiar la velocidad de nuestro personaje.
Así que creemos otra 'velocidad de flotación pública' y la estableceremos (porque queremos
que sea un poco más lenta) 0. 1f y luego multiplica tu objetivo normalizado por tu velocidad ... así y ahora porque es público, puedes cambiar la
velocidad de cada uno de esos personajes, pero lo
dejaremos en 0. 1 para ambos porque queremos verlos moverse a la misma velocidad. Presiona play...
y ahí vas ... y continuarán por siempre porque a
pesar de que les dimos vectores iniciales que eran completamente diferentes, apuntaban en la misma
dirección y
luego se normalizaron a la unidad 1
y terminaron con exactamente el mismo vector multiplicado exactamente por la misma velocidad.
Entonces, no importa qué tan largo sea el vector, si lo normalizas, terminas con el mismo pequeño vector que
es de la unidad 1.
Ahora esas velocidades, aunque creas que es una velocidad constante, el otro factor involucrado en él
(vuelve a tu código de movimiento) es la velocidad a la que se produce esta Actualización porque cada vez que tu juego ejecuta
una actualización no es necesariamente exactamente igual hora en que ocurrió la última actualización.
Por lo tanto, obtendrá inconsistencias en la velocidad y, aunque probablemente ni siquiera se dará cuenta de esto, verá en muchos códigos
que la gente multiplica por Tiempo. deltaTime y lo que
esto hace es que se suaviza y permite la diferencia en la ejecución de la actualización.
La otra cosa que debo decir también antes de que terminemos, es hacer que esto sea una actualización tardía.
Cualquier movimiento que tenga sobre sus personajes (y especialmente cuando comience a agregar cámaras que
siguen las cosas) querrá que todo suceda después de
que se haya calculado toda la física en la escena.
Actualmente no tenemos física, por lo que no es un problema, pero debes acostumbrarte a poner tus
movimientos en LateUpdate, que todavía no tengo, y no dudes en corregirme si tengo
un ciclo de actualización con movimiento en porque estoy obligado a hacerlo, porque esa es una mala costumbre mía.
Entonces, esto debería ser todo lo que necesitamos ahora para tener un movimiento suave y consistente de nuestro personaje.
Guárdalo Regresemos a Unity y presione Play ... y ahora...
bueno, esa velocidad es bastante pequeña, ¿no?
Se puede decir que la multiplicación del tiempo. deltaTime también lo ha ralentizado un
poco porque va a ser un valor bastante pequeño debido a
la diferencia horaria entre los bucles de actualización y, por lo tanto, eso le permite jugar con las velocidades que está configurando en sus personajes. Entonces tal vez en lugar
de 0. 1, es posible que desee cambiarlos a 1 y probarlo.
Eso es un poco mejor, pero ese es realmente el código que debes usar cuando dejas de mover un personaje.
Muy bien, eso es todo para mover algo en línea recta y cómo
obtener una velocidad constante en los movimientos de tu personaje. En la próxima conferencia, comenzaremos a ver cómo avanzar hacia una meta y hacer que
nuestros personajes giren.