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. Esto se traduce en la orientación de uno de los ejes del GameObject de modo que apunte hacie el origen del GameObject objetivo.
Página principal del proyecto
Antes de empezar te invito a ver el siguiente video en el que se resuelve este problema:
En el siguiente vídeo explico el funcionamiento del método LookAt en Unity
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.
En la jerarquía tenemos un GameObject llamado “#3 LookAtObject”.
Este GameObject tiene asignado el Script “LookAtObject”, que se encargará de hacer que Lucy siga con su mirada al jugador.
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.
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.
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.
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.
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.
El desafío está parcialmente resuelto, aún tenemos que solucionar el problema que se ilustra en la figura 9.
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.
Si el personaje está lejos de Lucy su inclinación es pequeña, pero al acercarse pasa lo siguiente:
¿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.
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.
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.