Qué es#
Todo GameObject tiene siempre un componente Transform (no se puede quitar). Guarda tres cosas:
- Posición (
position): dónde está, como unVector3(x, y, z). - Rotación (
rotation): hacia dónde mira, como unQuaternion. - Escala (
localScale): su tamaño.
Y además define la jerarquía: quién es hijo de quién. Es el componente que más vas a tocar por código.
En Unity, el eje Y apunta hacia arriba (no la Z). El suelo se extiende en X (derecha/izquierda) y Z (adelante/atrás). Vienes de otro motor, es el despiste número uno.
Vectores: Vector3 y Vector2#
Las posiciones y direcciones son vectores. En 3D usas Vector3, en 2D Vector2. Unity ofrece atajos muy cómodos:
Vector3 a = new Vector3(1f, 2f, 0f);
Vector3 arriba = Vector3.up; // (0, 1, 0)
Vector3 derecha = Vector3.right; // (1, 0, 0)
Vector3 adelante = Vector3.forward; // (0, 0, 1)
Vector3 cero = Vector3.zero; // (0, 0, 0)
float distancia = Vector3.Distance(a, cero);
Vector3 medio = Vector3.Lerp(a, cero, 0.5f); // punto intermedioMover un objeto#
void Update()
{
// Fijar la posición directamente
transform.position = new Vector3(0f, 2f, 0f);
// Moverse en una dirección (respeta Time.deltaTime)
transform.Translate(Vector3.up * 3f * Time.deltaTime);
// Rotar 90 grados por segundo sobre el eje Y
transform.Rotate(0f, 90f * Time.deltaTime, 0f);
// Mirar hacia otro objeto
transform.LookAt(objetivo);
}Mover transform.position en un objeto con Rigidbody "teletransporta" el objeto y rompe la física (atraviesa paredes, colisiones raras). Para objetos físicos usa fuerzas o Rigidbody.MovePosition en FixedUpdate. Ver Update vs FixedUpdate.
Espacio local vs global#
Aquí está el concepto que confunde al principio. Cada propiedad tiene dos versiones:
| Global (mundo) | Local (respecto al padre) |
|---|---|
position | localPosition |
rotation | localRotation |
lossyScale (solo lectura) | localScale |
position: la posición en el mundo, absoluta.localPosition: la posición relativa al padre. Si el objeto no tiene padre, coinciden.
Ejemplo: si una "mano" es hija de un "brazo", su localPosition es su posición respecto al brazo. Mueves el brazo y la mano lo sigue, pero su localPosition no cambia.
Jerarquía (parenting)#
// Hacer que 'this' sea hijo de otro objeto
transform.SetParent(nuevoPadre);
// Recorrer los hijos
foreach (Transform hijo in transform)
Debug.Log(hijo.name);
// Acceder al padre
Transform padre = transform.parent;Agrupar objetos bajo un padre sirve para moverlos juntos, organizar la escena y construir objetos complejos (un coche con sus 4 ruedas como hijas).
Rotación: por qué Quaternion#
La rotación se guarda como Quaternion, no como tres ángulos. Los quaternions evitan un problema llamado gimbal lock y permiten interpolar rotaciones de forma suave. No hace falta entender sus matemáticas para usarlos:
// Crear una rotación desde ángulos de Euler (los que ves en el Inspector)
transform.rotation = Quaternion.Euler(0f, 90f, 0f);
// Interpolar suavemente hacia una rotación objetivo
transform.rotation = Quaternion.Slerp(transform.rotation, objetivo.rotation, Time.deltaTime * 5f);
// Leer los ángulos como Euler (para depurar)
Vector3 angulos = transform.eulerAngles;Modificar transform.eulerAngles.x += 1f puede dar saltos raros por cómo se convierten los quaternions a Euler. Para rotaciones incrementales usa transform.Rotate(...); para fijar una rotación concreta, Quaternion.Euler(...).
Rendimiento#
Cada acceso a transform es una pequeña llamada a GetComponent interna. En bucles muy calientes con miles de objetos, guardarlo en un campo (private Transform _t; en Awake) ahorra algo. Para la mayoría de casos, transform directo está perfectamente bien: no optimices esto sin medir.
Errores frecuentes#
- Confundir
position(mundo) conlocalPosition(relativa al padre). - Mover el
Transformde un objeto conRigidbodyen vez de usar física. - Sumar a
eulerAnglesesperando una rotación limpia. - Olvidar
Time.deltaTimeal mover enUpdate.
Ponte a prueba#
Resumen#
El Transform guarda posición, rotación y escala de todo GameObject, y define la jerarquía. Muévelo con position/Translate, rótalo con Rotate/Quaternion.Euler, y ten claro cuándo usas espacio local (relativo al padre) o global. Si el objeto tiene Rigidbody, deja que lo mueva la física.