누락된 컴포넌트
Coddy Unity 여정의 Unity 스크립팅 기초 섹션에 포함된 레슨. 85개 중 45번째.
요청한 컴포넌트가 오브젝트에 없더라도 GetComponent는 실행을 멈추지 않습니다. 에디터에서는 null과 같다고 판정되는 대체 객체를 반환하고, 코드에서 이를 처음 사용하는 순간 Unity가 오류를 발생시킵니다. 이 공은 스페이스 키를 누르면 뛰어올라야 하지만, Rigidbody가 추가되어 있지 않습니다:
Rigidbody rb;
void Start()
{
rb = GetComponent<Rigidbody>();
}
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
rb.AddForce(Vector3.up * 300f);
}
}스페이스 키를 누르면 MissingComponentException: There is no 'Rigidbody' attached to the "Ball" game object, but a script is trying to access it.이 출력됩니다. 이 메시지는 누락된 타입과 오브젝트의 이름을 알려 줍니다. 인스펙터에서 컴포넌트를 추가하거나, 오브젝트에 의도적으로 컴포넌트가 없을 수도 있다면 먼저 확인하세요. TryGetComponent(out rb)는 컴포넌트가 있으면 true를 반환하고 rb에 값을 채우며, 없으면 오류 없이 false를 반환합니다(out을 사용하면 메서드가 변수를 통해 값을 돌려줄 수 있습니다):
bool canHop;
void Start()
{
canHop = TryGetComponent(out rb);
}그러면 Update()는 if (canHop)일 때만 공을 밀어 올립니다. 에디터 밖의 빌드된 게임에서는 GetComponent가 일반적인 null을 반환하므로, 같은 실수가 NullReferenceException으로 나타납니다.
챌린지
중급Lamp2에는 Light가 없습니다. Space 키를 눌러도 건너뛰게 하고, 고장 난 상태를 표시하세요.
Start()에서GetComponent줄을hasBulb = TryGetComponent(out bulb);로 바꾸고,bool hasBulb;필드를 추가하세요.hasBulb가 false이면 램프의 색을 바꾸세요:GetComponent<Renderer>().material.color = Color.gray;.Update()에서hasBulb가 true일 때만 전등을 전환하세요.
‘플레이’를 누르고 Space 키를 누르세요. 정상적인 램프는 오류 없이 전환됩니다. 그런 다음 ‘확인’을 누르세요.
직접 해보기
using UnityEngine;
public class LampSwitch : MonoBehaviour
{
Light bulb;
void Start()
{
bulb = GetComponent<Light>();
}
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
bulb.enabled = !bulb.enabled;
}
}
}
Unity 스크립팅 기초의 모든 레슨
직접 연습해 보세요: Unity 플레이그라운드