Menu
CoddyTech

Componentes faltantes

Parte de la sección Fundamentos de scripting en Unity del Journey de Unity de Coddy. Lección 31 de 67.

Cuando el componente que buscas no está en el objeto, GetComponent no te lo indica. En el Editor te devuelve un sustituto que es igual a null, y Unity lanza una excepción la primera vez que tu código lo usa. Esta pelota debería saltar al pulsar la barra espaciadora, pero nadie le agregó un Rigidbody:

Rigidbody rb;

void Start()
{
    rb = GetComponent<Rigidbody>();
}

void Update()
{
    if (Input.GetKeyDown(KeyCode.Space))
    {
        rb.AddForce(Vector3.up * 300f);
    }
}

Al pulsar la barra espaciadora, aparece MissingComponentException: There is no 'Rigidbody' attached to the "Ball" game object, but a script is trying to access it. El mensaje indica el tipo que falta y el objeto. Agrega el componente en el Inspector o, si el objeto puede carecer de él intencionalmente, compruébalo primero. TryGetComponent(out rb) devuelve true y asigna un valor a rb cuando el componente está presente, y devuelve false sin generar un error cuando no lo está (out permite que el método devuelva un valor a través de la variable):

bool canHop;

void Start()
{
    canHop = TryGetComponent(out rb);
}

Update() después impulsa la pelota solo if (canHop). Fuera del Editor, en un juego compilado, GetComponent devuelve un null normal, así que el mismo error aparece allí como NullReferenceException.

challenge icon

Desafío

Intermedio

La barra espaciadora enciende y apaga las farolas, pero la bombilla de Lamp2 está rota: no tiene ningún componente Light y, al pulsar la barra espaciadora, se produce una MissingComponentException. Arregla el script:

  • Las farolas que tienen un componente Light siguen encendiéndose y apagándose con la barra espaciadora.
  • Una farola sin componente Light nunca intenta acceder a él, así que no se produce ningún error.
  • Cuando empieza el juego, una farola sin componente Light cambia el color de su bombilla a Color.gray, para que los jugadores puedan ver que está rota.

Pulsa Play y, después, la barra espaciadora para ver el error. Arréglalo y, después, pulsa Check.

Pruébalo tú mismo

using UnityEngine;

public class LampSwitch : MonoBehaviour
{
    Light bulb;

    void Start()
    {
        bulb = GetComponent<Light>();
    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            bulb.enabled = !bulb.enabled;
        }
    }
}
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Fundamentos de scripting en Unity