10. CLASE TRANSFORM (I)





Vamos a dedicar los próximos capítulos a estudiar una de las clases más importantes de la API de Unity. La clase Transform, como vemos en el gráfico, hereda de Component, que a su vez deriva de Object, y por lo tanto esta clase tiene como propias las variables y funciones de las dos clases de las que hereda.

La pregunta parece obligada: si Transform hereda de Component, ¿por qué no estudiamos la clase Component primero?

No lo hacemos porque la clase Component, en el fondo, es poco más que una recopilación del resto de clases. Lo veremos mejor si recuperamos el gráfico general de clases que vimos en su día:



Si nos fijamos con atención, observaremos que la mayoría de las variables de la Clase component son a su vez instancias (objetos) de un buen número de las otras clases, algunas de las cuales incluso -como la propia clase Transform- derivan de ésta. Nos veríamos pues, caso de estudiar primero la clase Component, obligados a explicar lo que es un transform, un rigidbody, una camera, etc, antes de explicar las clases que los desarrollan.

Por lo tanto, para no liarnos en exceso, dejaremos la clase Component para bastante más adelante.

Bien. ¿Qué es un transform?.

Posiblemente muchos de los que ya hayan trasteado con la interface de Unity asimilarán esta palabra a la sección homónima del inspector. Efectivamente, si seleccionamos cualquier gameobject de la escena, automáticamente el inspector nos muestra en la sección transform los valores de posición, rotación y escala de dicho gameobject.

No puede existir un gameobject en la escena sin su propio transform. Si nos fijamos, hasta nuestro PortaScripts tiene vinculado un transform, pese a que como mero contenedor de scripts no es renderizado en la escena, y por lo tanto es invisible. En consecuencia, todo gameobject en nuestra escena está situado en un lugar determinado de ésta (position), con una determinada inclinación (rotation) y le es aplicada una determinada escala comparativa de tamaño (scale).

Con esto en mente, empecemos.


VARIABLES:


position:

var position : Vector3


Esta variable nos indica en qué punto del espacio global se ubica nuestro transform (y por ende el gameobject al que el mismo va vinculado). Recordemos que el espacio global es el que hace referencia a las coordenadas de la escena, y no a las de un determinado objeto. Si quisiéramos consultar/indicar el lugar del espacio local de un objeto, utilizaríamos la variable localPosition.

La variable position es de tipo Vector3, y nos permite tanto obtener los datos de posición del transform como modificarlos para darle una nueva ubicación. Por ejemplo, si quisiéramos ubicar un objeto en el centro del espacio global, haríamos:


elObjetoQueSea.transform.position = Vector3(0, 0, 0);


Podemos asimismo acceder a uno sólo de los ejes de la posición, tal como sigue:


Debug.Log(elObjetoQueSea.transform.position.x);


Lo cual nos permitiría imprimir la posición que tiene nuestro transform referida al eje horizontal.


localPosition:

var localPosition : Vector3


Como adelantábamos hace un momento, localPosition indica la posición del transform al que dicha variable pertenece, calculada en términos relativos al transform del que aquél depende.

Parece más difícil de lo que es en realidad, tal como vamos a demostrar con un ejemplo sencillo:

Nos vamos a Unity. Si hemos guardado nuestra última sesión, debemos tener en nuestra escena, aparte de nuestro viejo amigo el cubo, dos cápsulas de nombre origen y destino. Eliminamos Destino. Si por lo que sea no hubiéramos conservado las cápsulas, creamos un gameobject capsule nueva. Esa cápsula (u Origen, si guardamos la última escena)la ubicamos desde el inspector en la posición (3, 4, 2)

Resumiendo, tenemos en la escena(o debiéramos tener) el cubo en las coordenadas de posición (0,0,0) y una cápsula en la posición (3,4,2). Ninguno de estos gameobjects es hijo a su vez de otro, por lo que están y se mueven en coordenadas globales.

Abrimos nuestro script y escribimos:


transform.position = Vector3(-2,-1,-1);


Salvamos y arrastramos el script a nuestro cubo. Al darle al play, vemos que éste se desplaza respecto la posición que ocupaba en las coordenadas globales (el centro justo) dos unidades a la izquierda, una hacia abajo y una hacia delante. Al darle al pause, nuestro cubo vuelve a su lugar original, en 0,0,0 (es importante retener esto)

Vamos ahora a, en la Jerarquía, arrastrar el gameobject cubo y soltarlo dentro de gameobject cápsula (u Origen). Vemos que el cubo mantiene su posición en la vista de escena, pero si lo seleccionamos (está ahora contenido en la cápsula), sus coordenadas en el transform del inspector son ahora las inversas que las que le dimos al gameobject cápsula. Esto es así porque ahora para el cubo sus coordenadas de posición no dependen ya del espacio global, sino del local de la cápsula de la cual depende. Para el cubo la coordenada 0,0,0 no es ya el centro de la escena, sino el centro del gameobject capsula, y dado que con respecto a la cápsula el cubo está desplazado tres unidades a la izquierda, cuatro hacia abajo y dos hacia delante, son las que muestra.

El hecho de que el cubo dependa de la cápsula o dicho en terminología Unity, el cubo sea hijo de la cápsula, no implica que no pueda seguir siendo localizado/ubicado en coordenadas globales. De hecho, si le damos al play de nuevo, habida cuenta de que estamos utilizando en nuestro script la variable position (global), el cubo se seguirá desplazando al mismo sitio al que lo hacía cuando aún no dependía de la cápsula.

Pero, obviamente, al tener ahora un padre, le podemos aplicar ahora al cubo la variable localPosition, y así podemos modificar el script como sigue:


transform.localPosition = Vector3(-2,-1,-1);


Vemos ahora que el movimiento del cubo lo es en relación con la posición que ocupa papá capsula (o para ser más precisos el transform de papá cápsula). Probad si no lo veis claro a pasarle un vector (0,0,0) a nuestro script en lugar del que hemos escrito antes.

Si le aplicáramos esta variable localPosition a un transform sin padre, dicho transform se movería en el espacio global, tal como si le hubiéramos aplicado position y no localPosition.

POSTED BY UnityScripts
POSTED IN
DISCUSSION 0 Comments

Leave a Reply

Con la tecnología de Blogger.