누락된 컴포넌트
Coddy Unity 여정의 Unity 스크립팅 기초 섹션에 포함된 레슨. 67개 중 31번째.
요청한 컴포넌트가 오브젝트에 없더라도 GetComponent는 실행을 막지 않습니다. 에디터에서는 null과 같은 것으로 판정되는 대체 객체를 돌려주며, 코드가 이를 처음 사용하는 순간 Unity에서 예외가 발생합니다. 이 공은 Space 키를 누르면 튀어 올라야 하지만, Rigidbody가 추가되어 있지 않습니다:
Rigidbody rb;
void Start()
{
rb = GetComponent<Rigidbody>();
}
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
rb.AddForce(Vector3.up * 300f);
}
}Space 키를 누르면 MissingComponentException: There is no 'Rigidbody' attached to the "Ball" game object, but a script is trying to access it.이 출력됩니다. 메시지에는 누락된 타입과 오브젝트가 표시됩니다. Inspector에서 컴포넌트를 추가하거나, 오브젝트에 의도적으로 컴포넌트가 없을 수 있는 경우에는 먼저 확인하세요. TryGetComponent(out rb)는 컴포넌트가 있으면 true를 반환하고 rb에 값을 넣으며, 없으면 오류 없이 false를 반환합니다(out을 사용하면 메서드가 변수를 통해 값을 돌려줄 수 있습니다):
bool canHop;
void Start()
{
canHop = TryGetComponent(out rb);
}그러면 Update()는 if (canHop)일 때만 공을 밀어 올립니다. 에디터 밖의 빌드된 게임에서는 GetComponent가 일반적인 null을 반환하므로, 같은 실수가 NullReferenceException으로 나타납니다.
챌린지
중급스페이스 키로 가로등을 켜고 끌 수 있지만 Lamp2의 전구는 고장 났습니다. Light가 없어서 스페이스 키를 누르면 MissingComponentException이 발생하며 멈춥니다. 스크립트를 수정하세요:
- Light가 있는 가로등은 스페이스 키로 계속 켜고 끌 수 있습니다.
- Light가 없는 가로등은 Light에 접근하지 않으므로 오류가 발생하지 않습니다.
- 게임이 시작되면 Light가 없는 가로등의 전구 색을
Color.gray로 설정하여 플레이어가 고장 난 것을 알아볼 수 있게 합니다.
Play를 누른 다음 스페이스 키를 눌러 오류를 확인하세요. 수정한 다음 Check를 누르세요.
직접 해보기
using UnityEngine;
public class LampSwitch : MonoBehaviour
{
Light bulb;
void Start()
{
bulb = GetComponent<Light>();
}
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
bulb.enabled = !bulb.enabled;
}
}
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.