Qué es#
Un GameObject tiene varios componentes. Desde tu script a menudo necesitas hablar con otro de ellos (su Rigidbody, su Animator...). GetComponent los busca y te los devuelve.
private Rigidbody rb;
void Awake()
{
rb = GetComponent<Rigidbody>(); // busca el Rigidbody de ESTE objeto
}GetComponent recorre los componentes del objeto para encontrar el que pides: no es gratis. Llámalo una vez en Awake/Start y guarda el resultado. Hacerlo cada fotograma en Update es el error de rendimiento más repetido entre principiantes.
TryGetComponent: más seguro#
Si el componente puede no existir, GetComponent devuelve null y puedes acabar con un NullReferenceException. TryGetComponent te dice si existe y lo entrega de una vez:
if (TryGetComponent<Rigidbody>(out var rb))
rb.AddForce(Vector3.up);
else
Debug.Log("Este objeto no tiene Rigidbody");Además de más claro, TryGetComponent evita una pequeña asignación de memoria que GetComponent puede provocar cuando no encuentra nada. En bucles, es la opción preferida.
Buscar en hijos y padres#
| Método | Busca en |
|---|---|
GetComponent<T>() | Solo este objeto |
GetComponentInChildren<T>() | Este objeto y sus hijos |
GetComponentInParent<T>() | Este objeto y sus padres |
GetComponents<T>() | Todos los de este tipo en el objeto (array) |
GetComponentsInChildren<T>() | Todos, en el objeto y sus hijos |
// Un arma que está en un hijo del jugador
Arma arma = GetComponentInChildren<Arma>();
// Todos los colliders del objeto y sus hijos
Collider[] colliders = GetComponentsInChildren<Collider>();GetComponentInChildren también mira el propio objeto, no solo los hijos. Y por defecto ignora los objetos desactivados: pásale true (GetComponentInChildren<T>(true)) si quieres incluirlos.
Requerir un componente#
Si tu script no puede funcionar sin cierto componente, decláralo con [RequireComponent]: Unity lo añade automáticamente y no deja quitarlo.
[RequireComponent(typeof(Rigidbody))]
public class Movimiento : MonoBehaviour
{
private Rigidbody rb;
void Awake() => rb = GetComponent<Rigidbody>();
}Alternativa: asignar por Inspector#
Muchas veces ni siquiera necesitas GetComponent: si la referencia es fija, exponla con [SerializeField] y arrástrala en el editor. Es más rápido (cero búsqueda) y explícito.
- ¿El componente está en este mismo objeto? →
GetComponentenAwake - ¿Puede no existir? →
TryGetComponent - ¿Está en un hijo o padre? →
GetComponentInChildren/InParent - ¿Es una referencia fija a otro objeto? →
[SerializeField]y arrástrala
Errores frecuentes#
- Llamar a
GetComponentenUpdateen vez de cachear. - No comprobar
nullcuando el componente puede no estar (usaTryGetComponent). - Olvidar que
InChildrenincluye el propio objeto e ignora inactivos.
Resumen#
GetComponent accede a otros componentes del objeto; cáchealo en Awake, nunca en Update. Usa TryGetComponent cuando pueda faltar, y las variantes InChildren/InParent para recorrer la jerarquía. Si la referencia es fija, asignarla por Inspector suele ser mejor que buscarla.