디버깅(Debug 또는 Debugging)이란 프로그래밍을 하면서 오류를 찾고 오류를 수정하는 과정을 말한다. 개발자는 개발보다 디버깅 하는 시간이 더 많다는 말이 있을 정도로 디버깅은 매우매우 중요하다.
Unity에서 디버깅하는 방법을 알아보자.
디버깅이 필요하다는 뜻은 오류가 발생했다는 뜻이다. 오류문을 잘 읽어보면 오류가 발생한 이유와 장소를 친절히 설명해주고 있다. 내 오류는 NullReferenceException: Object reference not set to an instance of an object UI_Button.Start ()
(at Assets/Scripts/UI/UI_Button.cs:39) 이다. 즉, null의 값을 가질 수 없는 object에 null이 들어갔다는 뜻이다.
오류가 일어난 곳도 설명해주고 있다. UI_Button의 39번째 줄이 문제다. 그곳으로 가보자.
오류가 일어난 부분은 ScoreText의 내용을 Hello로 바꿔주는 부분이었다. 이것만 봐서는 뭐가 문젠지 누구도 알 수 없다. 이럴 때 필요한 게 바로 디버깅이다.
1. 자세히 뜯어볼 문장 좌측 빈칸을 클릭한다.
저 점은 중단점이다. 이제 프로그램을 실행하면 모든 내용이 실행되는 것이 아니라 중단점 직전까지만 실행된다. 즉, 오류가 발생하기 직전에 프로그램이 멈추게 된다. 그러면 우리는 프로그램을 아주 조금씩 실행시키면서 오류가 발생한 부분이 어딘지 알게 된다.
2. 상단에 있는 Unity에 연결을 눌러준다.
3. 유니티 창으로 돌아가 플레이 버튼을 눌러준다.
디버깅 할 준비가 끝났다. 이제 F10 또는 F11을 눌러서 잠시 중단된 프로그램을 아주 조금씩 움직여줄 차례다.
F10을 누르면 내가 중단점을 누른 스크립트에서만 프로그램이 실행된다. 내가 만약 다른 스크립트에 있는 함수를 끌어와서 사용했다고 하더라도 다른 스크립트로는 이동하지 않고 오직 중단점이 있는 스크립트의 프로그램만 볼 수 있다.
F11을 누르면 내가 중단점을 누른 스크립트 안에 있는 모든 내용을 전부 뜯어보게 된다. 다른 스크립트에 있는 함수를 사용했다면 그 스크립트로 이동해서 다시 프로그램을 조금씩 뜯어보게 된다. 뿐만 아니라 기본적으로 제공되는 함수도 그 안으로 파고들어 프로그램을 찬찬히 살펴볼 수 있다.
나는 기본 제공 함수의 경우가 아니라면 거의 무조건 F11을 눌러서 이동한다.
F11을 한 번 눌러 GetText 함수가 있는 다른 스크립트로 넘어왔다. 호출 스택을 보면 처음 중단점이 있는 파일로부터 얼마나 깊게 들어와있는지 알 수 있다. F11을 한 번 더 눌러보자.
같은 파일 내에 있는 Get함수가 있는 곳으로 왔다.
33번째 줄은 정상적으로 작동했다. 하단을 보면 objects가 null로 잘 들어가는 것을 확인할 수 있다. 여기까지는 오류가 없다는 뜻이다.
38번째 줄까지 오니 뭔가 이상하다는 걸 알 수 있었다. objects[0]과 objects[1]의 값이 null로 표시되는 것이다. 정확한 문제 원인을 알았으면 이제는 구글링을 해보면 된다. 이렇게 저렇게 검색하고 바꿔보고... 나 자신과의 싸움이다...
내 문제는 너무너무 간단했다... 시간을 들인 게 아까울 정도로 간단했다... 내가 쓰는 Unity 버전에서는 UI->Text를 사용할 때 일반 Text가 없고 TMP만을 사용할 수 있었다. TMP를 사용할 때는 당연히 반환형식을 Text가 아닌 TextMeshProUGUI로 해줘야 한다. ㅋㅋㅋㅋ...
'공부 > Unity' 카테고리의 다른 글
[Unity] Mathf란 (0) | 2022.05.02 |
---|---|
[Unity] ArgumentException 오류 (0) | 2022.05.02 |
[Unity] UseGravity, IsKinematic, IsTrigger 실습 (0) | 2022.05.02 |
[Unity] OnCollisionEnter와 OnTriggerEnter (0) | 2022.05.02 |
[Unity] 오일러 각(eulerAngles)과 쿼터니언(quaternion) (0) | 2022.05.02 |