🎮 UnityDocs

GetComponent a fondo

Cómo acceder a otros componentes desde un script: GetComponent, TryGetComponent, las variantes InChildren e InParent, y por qué nunca debes llamarlo en Update.

📄 ArtículoPrincipiante✅ RevisadoUnity 6.0 LTSActualizado 2026-07-14
DificultadConceptual Código Matemáticas
Tiempo📖 Lectura 6 min · ⌨️ Práctica 15 min

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.

C#
private Rigidbody rb;

void Awake()
{
    rb = GetComponent<Rigidbody>();   // busca el Rigidbody de ESTE objeto
}
Cachea en Awake, nunca en Update

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:

C#
if (TryGetComponent<Rigidbody>(out var rb))
    rb.AddForce(Vector3.up);
else
    Debug.Log("Este objeto no tiene Rigidbody");
TryGetComponent no genera basura

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étodoBusca 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
C#
// 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>();
InChildren incluye al propio objeto e ignora inactivos

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.

C#
[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.

🧭 ¿Qué debería usar?
  • ¿El componente está en este mismo objeto? → GetComponent en Awake
  • ¿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 GetComponent en Update en vez de cachear.
  • No comprobar null cuando el componente puede no estar (usa TryGetComponent).
  • Olvidar que InChildren incluye 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.

Fuentes y para profundizar