13. CLASE TRANSFORM (IV)










FUNCIONES:


Translate:

function Translate (translation : Vector3, relativeTo : Space = Space.Self) : void


Esta función nos permite mover el transform en la dirección y distancia indicados en el parámetro de tipo Vector3 traslation. El segundo parámetro nos permite decidir si el transform se moverá según sus propias coordenadas (locales) o lo hará en base al espacio global. Por defecto, si no indicamos el segundo parámetro, Unity entiende que el transform se moverá según sus propias coordenadas (Space.Self).

Desarrollemos esto con un ejemplo:

Para empezar, desemparentamos nuestro cubo respecto de la cápsula, arrastrándolo a un espacio vacío de la jerarquía. Acto seguido, con el cubo seleccionado, en el inspector le asignamos a la coordenada Y de rotación un valor de 35. Abrimos el script que tenemos asignado al cubo y tecleamos:


transform.Translate(Vector3.forward * 5);


Salvamos y presionamos play. El cubo avanza cinco unidades en su eje Y, y recalcamos lo de "su" eje, ya que al no añadirle un segundo parámetro que diga lo contrario, se mueve según sus coordenadas locales.

Para ver la diferencia, añadamos como segundo parámetro a la función la variable World de la enumeración Space, para que sustituya al parámetro por defecto Space.Self:


transform.Translate(Vector3.forward * 5, Space.World);



function Translate (x : float, y : float, z : float, relativeTo : Space = Space.Self) : void

Existe un segundo prototipo para la función Translate. Como se puede comprobar, se diferencia del primero en que en lugar de pasar como parámetro para establecer la dirección y longitud del movimiento un Vector3, se pasa cada eje como un float independiente.


function Translate (translation : Vector3, relativeTo : Transform) : void
function Translate (x : float, y : float, z : float, relativeTo : Transform) : void

Estos dos prototipos varían de los anteriores en el segundo parámetro, que ya no versa sobre si el movimiento se hará tomando en cuenta las coordenadas locales del objeto que se mueve o las globales de la escena. En cambio, aquí el movimiento de nuestro transform vendrá fijado por otro transform. De esta manera, nos moveremos de acuerdo con las coordenadas locales de ese segundo objeto al que hacemos referencia. Si por ejemplo el parámetro relativeTo es una cámara, la derecha del traslation no es la derecha local de nuestro transform, o la derecha global, sino la derecha de la cámara. Por ejemplo:

Tecleamos lo siguiente en nuestro script


transform.Translate(Vector3.right * 5);


Esto hará que nuestro cubo se mueva cinco unidades a su derecha.

Y ahora modificamos el script para que quede así:


var miCamara : Transform;

transform.Translate(Vector3.right * 5, miCamara);


Arrastramos la cámara principal hasta la variable miCamara. De nuevo al play.

Ahora el cubo se mueve cinco unidades a la derecha de la cámara.

Como último apundo hemos de añadir que si relativeTo es nulo, las coordenadas del movimiento pasarán a ser las globales.


Rotate:

function Rotate (eulerAngles : Vector3, relativeTo : Space = Space.Self) : void


Esta función permite rotar un transform. Acepta como parámetro un Vector3 con los grados de rotación en ángulos Euler. Por defecto, al igual que sucediera con la función translate, el transform rota sobre sus coordenadas locales, pudiendo hacerlo según las coordenadas globales si se lo indicamos con Space.World como segundo parámetro.

Veamos un ejemplo. Rehagamos nuestro script con el siguiente contenido:


function Update() {

transform.Rotate(Vector3.right * 25 * Time.deltaTime);
transform.Rotate(Vector3.up * 20 * Time.deltaTime, Space.World);
}


Al darle al play, observaremos que nuestro cubo rota sobre su eje X a razón de 25 grados por segundo mientras a la vez gira sobre el eje Y global a razón de 20 grados por minuto.

Es de señalar que ambas instrucciones se encuentran contenidas dentro de la función Update. Esta función, que en su momento estudiaremos con la debida profundidad, es llamada cada frame por nuestro ordenador (el framerate de cada ordenador varía), de tal manera que el movimiento es contínuo, pues los valores de rotación de nuestro cubo son actualizados constantemente.

Precisamente porque el framerate de cada ordenador es distinto, y para evitar que en función de cada PC los objetos se movieran más o menos deprisa (lo que tendría indeseables consecuencias, sobre todo en juegos en línea multijugador), se suele utilizar la variable de la clase Time Time.deltaTime. Time.deltaTime lo que consigue es transformar la unidad de frecuencia de cualquier tipo de movimiento de frames a segundos. Si por ejemplo en el último script no hubiéramos usado estas variables de tiempo, el cubo giraría 25 y 20 grados cada frame, quedando al albur de cada ordenador la frecuencia real que eso supondría. Al multiplicarlo por Time.deltaTime las rotaciones dependerán del tiempo y en consecuencia se producirán con la misma cadencia en cualquier ordenador.


function Rotate (xAngle : float, yAngle : float, zAngle : float, relativeTo : Space = Space.Self) : void

En esta versión de la función, la única diferencia es que se sustituye el Vector3 por tres floats, en los cuales se consignarán igualmente los grados de rotación.


function Rotate (axis : Vector3, angle : float, relativeTo : Space = Space.Self) : void


La variante que nos ofrece este tercer prototipo es que por un lado se indica en el primer parámetro sobre qué eje queremos que rote el transform, y en un segundo parámetro de tipo float le hemos de indicar el número de grados ha de rotar.


Mañana más.

POSTED BY UnityScripts
POSTED IN
DISCUSSION 0 Comments

Leave a Reply

Con la tecnología de Blogger.