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.
Desafío
IntermedioLa 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;
}
}
}
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
1Tu primer script
Hola, UnityColoca el cuboMuévete en cada fotogramaGira cada segundoDirige con las teclasRepaso: conduce el cubo4Vectores
Sumar vectoresDireccionesEspacio local y globalVelocidad diagonalDistancia entre objetosVector3 es una estructuraRepaso: piloto de dron7Proyecto: Atrapa la estrella
El atrapadorUna estrella fugaz10El ciclo de vida de los scripts
Awake y StartUpdate y LateUpdateOnEnable y OnDisableEl orden del ciclo de vidaRepaso: registrador del ciclo de vida2El Inspector
Campos del InspectorSerializeFieldNúmeros decimales y MathfAtributos del InspectorRepaso: Ascensor5Transformaciones y jerarquía
Padres e hijosEscalaMirar objetosMoverse hacia un puntoRepaso: Luna en órbita8Encontrar cosas
Buscar por nombreEtiquetasBuscar por tipoLas referencias superan a FindEl valor nulo de UnityRepaso: la moneda más cercana11Proyecto: Esquiva los bloques
El corredorBloques que caen6GameObjects y componentes
Referencias en el InspectorObtener un componenteComponentes faltantesAñadir un componenteRequireComponentMostrar y ocultarRepaso: interruptor de luz