Además de girar un personaje y moverlo a lo largo de un
vector establecido, también podemos girar el personaje y empujarlo en la dirección que está mirando (o a lo largo de uno de sus vectores locales).
En
Unity, un personaje tiene 3 vectores locales: z para adelante, y para arriba yx para derecha, independientemente de la rotación del personaje, podemos
impulsar cualquiera de estos vectores locales con la función Traducir, especificando el movimiento en uno (o
más ) de los ejes locales x, y y z. Para mover el personaje hacia adelante a una velocidad
constante, modificaríamos solo su coordenada z. Para mover un personaje a la derecha a
una velocidad constante, modificaríamos su coordenada x y para
moverlo hacia arriba, modificaríamos su coordenada y.
También puedes mover un personaje hacia atrás, hacia la izquierda y hacia abajo especificando una velocidad negativa.
Si modifica la rotación de un eje mientras lo gira, el personaje se moverá en una dirección del
mundo diferente, sin
embargo, todavía se moverá a lo largo de su eje local especificado.
Por ejemplo, si un personaje cambia de dirección mientras se lo empuja a lo largo de un eje z, se moverá alrededor
del mundo, pero
en relación con sí mismo, seguirá moviéndose a lo largo de su eje z, ya que es el eje de avance de
los caracteres que ha cambiado en el rotación y no su velocidad de movimiento.
Entonces, intentemos todo esto en un proyecto.
Descargue el proyecto 'PushForward', que es el recurso que viene con esta conferencia y cuando lo abra,
abra la escena de zombies (porque todo es mejor con zombies) y abra y eche
un vistazo a lo que tiene allí . Si presiona Reproducir en este punto, notará que tiene un zombie animado que
no va a ninguna parte ... rápido y
con aspecto de cubo.
Si usa las teclas de flecha, encontrará que puede rotar ese cubo y conducirlo.
Este cubo será nuestro objetivo y al moverlo se nos permitirá ver la rotación de ese zombi y cómo vamos
a empujarlo hacia adelante.
Muy bien, entonces dejemos de jugar eso. El cubo en sí, si está interesado, tiene un código de
'Unidad' y puede ver ese script y lo que hace, simplemente conduce el cubo. Nuevamente, lo empuja de la misma manera que lo
estamos haciendo con nuestro personaje zombie y también tiene una rotación allí, pero ese no es
el enfoque de esta lección.
Estamos buscando mover al zombi, cambiar su dirección (por lo que siempre está mirando este cubo) y empujarlo a lo largo
de su eje z.
Ahora, si hace clic en el modelo en sí y observa, verá que su eje z está orientado hacia
adelante y esto es lo que estamos empujando.
Así que cree un nuevo archivo C # llamado 'MoveLocal'. En ese script, vas a agregar esto.
Entonces es similar a lo que tuvimos en la conferencia anterior.
Tenemos un 'objetivo' que pasaremos (ese será nuestro cubo) y tenemos una velocidad.
Ahora deberá ajustar esta velocidad, en función de la animación y de si encaja con ella. A veces, si su velocidad es demasiado
rápida o demasiado lenta para la animación en particular, el personaje se deslizará y hay
muchas formas de solucionarlo, pero tampoco volveremos a profundizar tanto con la
animación.
Correcto.
Entonces agregue eso y luego en la Actualización, tenemos una transformación. Mire para cambiar la dirección en la que estamos buscando
a nuestro zombie, que será la posición de 'objetivo' y luego empujaremos al zombi a lo largo de su eje
z usando nuestra velocidad y multiplicándolo por el tiempo. deltaTime.
Ahora estoy haciendo esto en la Actualización y
¿qué te dije antes?
Siempre olvido poner LateUpdate, así que pongamos eso allí.
Ahora guarda eso.
Vuelve a Unity y quieres adjuntar ese 'MoveLocal' a Jill (Jill es el nombre
de nuestro zombie) en el nivel más alto. Al buscar a Jill en el Inspector, ella tendrá una Transformación, un
Animador y luego el guión que ha agregado allí. En el script, verás que el
'objetivo' ha sido expuesto, así que toma tu cubo y arrastra y suelta eso como el objetivo de nivel superior.
Ok, ahora presiona Play y ella comenzará a moverse hacia el cubo.
Ahora, si alejamos esto, debido al LookAt, ella estará constantemente girando y mirando el cubo.
Todos en esta escena están flotando sobre el suelo, pero
puedes ajustar eso agarrando a tu personaje y conduciéndolo hacia el suelo y también agarrando
tu cubo y conduciéndolo así.
Ok, entonces ten otra jugada.
Ahora puede ver que el personaje todavía está flotando un poco por encima del suelo y
tenemos el mismo problema con el parpadeo que tuvimos en la conferencia anterior, donde
el personaje alcanzará el punto objetivo y luego seguirá intentando llegar al punto objetivo. ,
ligeramente sobrepasando y regresando
e intercambiando direcciones, pero si aleja su cubo, se detendrá.
Ahora todavía está
flotando en el aire y esto resalta otro problema con este código en particular, que es que va a cambiar y
mirar ese cubo, donde sea que esté.
El LookAt no discrimina si el cubo está en el aire. Así que vamos a mover este cubo así y
veamos cómo ese LookAt está moviendo el eje z, para que cambie y siempre esté orientado hacia el cubo.
Si hacemos una pausa y miramos a Jill, verás que su eje z se está girando hacia nuestra posición de cubo y esto
causará muchos problemas cuando comiences a mover objetos que realmente deberían permanecer en el suelo (como un humanoide)
para mirar la posición de la meta que está en el espacio 3D y puede estar en el
aire.
Para recapitular sobre eso, lo que está haciendo LookAt es rotar su modelo para que el eje z apunte
hacia la posición de la meta.
Por lo tanto, no importa en qué parte
del espacio 3D se ubique ese objetivo, orientará el modelo 3D, de modo que esté orientado en esa dirección y este es
un problema real para los personajes que necesitan permanecer en tierra.
En cambio, lo que queremos hacer es que nuestro personaje gire en la dirección del objeto, pero solo en
el plano xy en el plano, de modo que el eje z se alinee con la posición del objeto en un eje
vertical desde él, en exactamente la misma altura del personaje.
Por lo tanto, necesitamos que el personaje realice un LookAt en un punto que esté en la misma y que el
personaje, pero las mismas x y z que el objeto objetivo. Lograr esto en Unity es solo un
pequeño ajuste a nuestro código MoveLocal. En lugar de realizar un LookAt en el objetivo (que es
nuestro cubo por el que estamos pasando), calculamos una nueva posición de objetivo para mirar, que estará en la misma posición xyz del cubo,
como puede
ver aquí , pero su posición y es la misma que nuestro personaje.
Luego usamos esta nueva posición que hemos calculado (que he llamado lookAtGoal y
la usamos dentro de LookAt en su lugar. Entonces, una vez que haya actualizado su código, si lo guarda, regrese a
Unity y ejecútelo, puede mover su cubo en altura (como puede ver aquí, mi cubo ya está flotando) y no afecta al
zombie personaje en absoluto.
Por lo tanto, se queda en tierra y, por lo tanto, su z no se gira hacia arriba.
Se queda paralelo al suelo.
Una última cosa para completar nuestro código es hacer que el zombie deje de moverse cuando llegue a la
ubicación, para que no se sientan nerviosos.
En primer lugar, necesitaremos agregar un valor de "precisión".
Entonces, esto es muy similar al código que hemos hecho antes.
Lo pondré a 1. 0f.
en este caso y puedes ajustar eso más tarde.
Luego, queremos probar la precisión antes de hacer un traductor, por lo que seguiremos buscando incluso si estamos lo
suficientemente cerca, pero no nos acercaremos más. Entonces 'si' y en este caso, no tenemos una dirección. magnitud para usar como nuestra distancia a
la meta porque nunca hemos calculado la dirección, por lo que esto es un poco
diferente al código anterior.
Pero lo que realmente viene con nuestros vectores es que podemos calcular la distancia entre 2 posiciones
y podemos hacerlo con Vector3. Distancia y queremos encontrar
la distancia entre nuestra ubicación actual (que es transformar. posición) y la posición de
gol.
Entonces gol. posición Así que
esa es su declaración 'si' y allí queremos probar si la distancia es mayor que nuestra precisión,
lo que nos permitirá seguir avanzando, de lo
contrario no se ejecutará ese Traductor.
Entonces, al resolver este Vector3. Distancia entre estas dos posiciones, es esencialmente lo
mismo que encontrar la dirección (o el vector) entre esos dos valores quitando uno del otro y
luego usando el. magnitud.
Es el mismo cálculo, son solo diferentes formas de resolverlo. Entonces podría entrar aquí y calcular la dirección
y obtener la magnitud de ese vector, o puede usar esta función de distancia.
Correcto.
Así que guárdelo y ahora volveremos a Unity y lo ejecutaremos ... y conducir ... conduzcamos un poco más cerca.
Ahora todavía podemos ver, en este caso, que tenemos 'nerviosismo'.
La razón es que nuestra distancia actual es calcularla entre la distancia del cubo real y la distancia del zombi, pero el
zombi no está tratando de llegar a
la posición del cubo, está tratando de llegar a la posición que está debajo del
cubo en La misma altura.
Por lo tanto, tiene muy pocas esperanzas (especialmente si este cubo está en el aire) para que esté
cerca porque no se le permite moverse hacia arriba.
Así que haremos un pequeño ajuste a nuestro código, de vuelta aquí. En lugar de tratar de obtener la distancia
entre nuestro personaje y la posición del objetivo, lo que podría no ser posible porque esa
posición del objetivo está en el aire, entonces solo queremos llegar desde el LookAt.
Así que lo pondremos allí, guárdelo y regrese y corra.
Ahora, cuando el zombi se acerque lo suficiente a nuestro cubo, dejará de moverse.
Por supuesto, la animación todavía se está ejecutando, pero no
estamos trabajando con eso en este momento y no importa cuán alto en el aire mueva esto y la
distancia real entre estos dos, solo se trata de la distancia entre sí y esta posición aquí está a la misma altura.
Así que ahora puedo conducir este cubo y el zombie aún lo seguirá pero permanecerá en tierra ...
y cuando nos acerquemos lo suficiente, se detendrá.
Así es como mueves un personaje a lo largo de su eje delantero.