이번 포스트에서는 잘못된 컴퍼넌트 참조로 인해 발생하는 오류에 대해 알아보겠습니다.
유니티는 오브젝트를 생성하고 그 오브젝트에 컴퍼넌트를 블록을 끼우듯이 필요한 기능만을 넣어서 사용을 합니다. 예를 들면 캐릭터의 이동에는 물리적인 동작이 필요하여 Rigidbody 컴퍼넌트를 넣어주지만 점수창에는 굳이 물리적인 연산이 필요 없기에 넣지 않습니다.
이렇게 필요한 컴퍼넌트를 오브젝트에 넣은 뒤에 스크립트 내부에서 참조하게 되는데 이 때 발생하는 오류에 대해서 알아보겠습니다.
1. MissingComponentException
1.1 원인

존재하지 않는 컴퍼넌트를 참조하려고 할 때 발생하는 오류입니다. Box라는 오브젝트의 Rigidbody3D 컴퍼넌트에 접근하려 했으나 Box에 Rigidbody3D 컴퍼넌트가 없어서 발생한 오류입니다.

Box 오브젝트에 Transform, Cube, Mesh Renderer, Box Collider, Syntax(Sctript)만 붙어있고 Rigidbody3D는 없습니다.

Syntax(Script)에서는 Rigidbody타입 rb에 Syntax(Script)가 붙어있는 gameObject(Box)에서 Rigidbody3D 컴퍼넌트를 가져와서 넣어줍니다.
그리고 그 rb에 AddForce로 y축에 10의 힘을 한 번 줍니다. 한번만 주는 이유는 Start()안에 있기 때문입니다. 10의 힘은 매우 미미하기에 실행시 중력에 의해서 크게 티가 나지 않습니다.
하지만 이 스크립트가 붙어있는 Box 오브젝트는 Rigidbody3D가 없기에 GetComponent를 할 수 없습니다.
1.2 해결방법
이 스크립트가 붙어있는 Box 오브젝트에 Rigidbody3D 컴퍼넌트를 넣어줍니다.
스크립트 상에서는 Rigidbody는 Rigidbody3D를 Rigidbody2D는 Rigidbody2D를 나타냅니다.

Rigidbody3D를 넣으면 정상적으로 Box 오브젝트에 AddForce로 Y축에 10의 힘을 한 번 가합니다. 위의 GIF에서는 너무 티가 안나서 1000의 힘을 한 번 가했습니다.
2. 타입 불일치

Rigidbody 타입형 변수에 SpriteRenderer 컴퍼넌트를 넣으려고하자 타입 불일치로 인해 나타나는 오류입니다.
2.1 원인

Rigibody타입 rb에 GetComponent로 Rigidbody를 가져와서 값을 넣은 것처럼 컴퍼넌트도 각각 타입이 존재합니다.
하지만 이 타입이 불일치하게 되면 int 변수에 string값을 넣는 것과 마찬가지로 오류가 발생하게 됩니다.
이 스크린샷에서는 Rigidbody 타입 rb에 SpriteRenderer를 넣으려고 했기 때문에 오류가 발생합니다.
2.2 해결방법
타입이 불일치하는 것이기 때문에
컴퍼넌트 타입을 값에 맞게 변경하거나 값을 컴퍼넌트 타입 변수에 맞게 변경해서 일치시킵니다.
전자의 경우 Rigidbody rb = 부분을 SpriteRenderer sr = 로 변경하면 되고
후자의 경우 gameObject.GetComponent<SpriteRenderer>(); 를 gameObject.GetComponent<Rigidbody>();로 변경하면 됩니다.
컴퍼넌트들은 호출할 때 정확한 키워드를 몰라서 오타가 발생하는 경우가 잦습니다. 자동완성이 있다고 하더라도 컴퍼넌트들의 정확한 키워드를 모르기 때문에 잘못쓰는 경우가 많다보니 사용에 주의가 필요합니다.