#3 Método LookAt. [Serie Fundamental de Unity]

Por GameDevTraum

Introducción

En este artículo vamos a analizar cómo aplicar en Unity el método LookAt, para hacer que un GameObject mire en la dirección de otro.

Página principal del proyecto

Artículos de la Serie Fundamental de Unity

Antes de empezar te invito a ver el siguiente video en el que se resuelve este problema:

Procedimiento

Vamos a trabajar con la estación Look At, la cual consiste en una cápsula de contención en la que se encuentra flotando el modelo de Lucy. El objetivo es lograr que Lucy nos siga con la mirada por todo el escenario.

Fig. 1: Cápsula de contención anti-maldad, de la estación LookAt.

En la jerarquía tenemos un GameObject llamado “#3 LookAtObject”.

Fig. 2: Jerarquía de la escena. La estación LookAt es el GameObject #3.

Este GameObject tiene asignado el Script “LookAtObject”, que se encargará de hacer que Lucy siga con su mirada al jugador.

Fig. 3: Script para completar en este desafío.

En la figura 4 se observa que hay 3 campos para completar, el primero es para el objeto observador, el segundo para el objetivo de observación y el tercero es para que Lucy mire a una altura fija del escenario, de esta forma no se sale de la frontera de su cápsula de contención.

Fig. 4: Script asignado al GameObject “#3 LookAtObject” que se ve en la figura 2.

Vamos a asignar a Lucy directamente desde la jerarquía y al personaje lo vamos a encontrar a través de su tag.

Si querés aprender distintas formas de encontrar las referencias de los GameObjects de la jerarquía para usar en los Scripts podés leer el artículo anterior o mirar este video.

Si abrimos el Script encontramos algunas cosas hechas. En el método FixedUpdate, que se ejecuta una vez cada cierto tiempo, hacemos la llamada al método “lookAtObject”, que se encargará de cumplir la función.

Fig. 5: Script LookAtObject sin completar.

En el método start que se ve en la figura 5, tenemos una instrucción que estaba comentada al momento de hacer la captura. Hay que quitar las barras de comentarios para encontrar la referencia del jugador y lograr que Lucy lo mire.

Fig. 6: Campos definidos en el Script.

En la figura 6 se observan los campos definidos en el Script. Vamos a utilizar el Vector3 llamado “objectToLookPosition” para las coordenadas a la que Lucy debe mirar.

Fig. 7: Con estas dos instrucciones logramos que Lucy mire al origen del personaje.

Dentro del método “lookAtObject” escribimos estas instrucciones:

objectToLookPosition = objectToLook.transform.position;

objectThatLooks.transform.LookAt(objectToLookPosition);

Con estas dos instrucciones logramos que Lucy esté orientada todo el tiempo hacia el origen del jugador.

Fig. 8: Lucy sigue al personaje con la mirada.

Fig. 9: Al acercarse a la cápsula, Lucy se inclina tanto que se sale de las fronteras de la cápsula.

El desafío está parcialmente resuelto, aún tenemos que solucionar el problema que se ilustra en la figura 9.

Fig. 10: Tres GameObjects mostrando sus orígenes. El origen se representa por un gizmo que muestra los ejes locales.

Primero entendamos qué está pasando.

Todos los GameObjects tienen una coordenada en el espacio donde se encuentra su origen.

El método lookAt va a modificar la orientación del objeto al que se lo aplique (en este caso Lucy). Lo hará de tal forma que el eje local forward apunte hacia el origen del objeto a mirar. Como se ilustra en la siguiente figura.

Fig. 11: Lucy con el método lookAt aplicado, personaje lejos.

Si el personaje está lejos de Lucy su inclinación es pequeña, pero al acercarse pasa lo siguiente:

Fig. 11: Lucy con el método lookAt aplicado, personaje cerca.

¿Cómo podemos corregir esto?

Tenemos que hacer que Lucy mire hacia una coordenada que esté a la misma altura que su origen. De esa forma su ángulo de inclinación será pequeño.

Ásí que vamos a sobreescribir la componente y del Vector3 por el valor de la variable “yPos” que ajustaremos desde el inspector.

Idealmente podríamos hacer que la componente y del Vector3 valga exactamente la altaltura del origen de Lucy, esto es algo que me di cuenta luego en la post producción del video. Sin embargo está bueno como ejemplo de que no hay una sola forma de resolver los problemas.

Fig. 12: Se añade una instrucción entre medio que sobreescribe el valor de la componente y del Vector3.

Se puede probar escribir la variable yPos en tiempo de ejecución, pero al parar la simulación todos los valores volverán a su valor inicial.

El valor 0.75 funciona bien para este caso. Un número menor a este hace que Lucy se incline hacia abajo y salga por el frente de la cápsula.

Fig. 13: El valor -0.3 hace que Lucy salga por el frente de la cápsula.

Fig. 14: Con yPos igual a 0.75 Lucy mira correctamente al personaje.

Fig. 15: Con yPos igual a 0.75 Lucy mira correctamente al personaje.

En el siguiente artículo estudiaremos cómo crear y destruir objetos en tiempo de ejecución. Suscríbete al canal de YouTube para estar al tanto de los nuevos videos y artículos.