유니티 코드 디버깅 (Debugging)
1. 문제 해결
문제 해결에 있어, 에러가 존재하는 스크립트 등에 접근하여 소스 코드를 수정한다. 간단한 수정만으로 대부분의 문제는 쉽게 해결이 가능하다. 하지만 프로그램이 복잡하고 커질수록 문제를 발견하고, 해결하는 게 쉽지 않은 경우들이 있다.
유니티에서 프로그램을 개발할 때, 게임 로직 등의 소스 코드가 잘 작동하는지 확인하는 방법은 프로그램을 에디터 상에서 실행( 게임 플레이 )을 해보면 가능하다. 만약 에러가 존재한다면, 유니티는 해당 에러를 콘솔 창을 통해 알려준다. 개발자는 문제가 되는 부분을 발견하고, 문제를 해결한다.
2. Unity Debug
실행하면 정상적으로 작동하는데, 의도치 않은 결과가 발생하는 경우도 있다. 이러한 문제는 콘솔 창을 통해서 확인되지 않으며, 직접 개발자가 그와 관련된 스크립트를 확인하여 소스 코드를 수정한다. 일반적으로 많이 사용하는 방법이 관련된 소스 코드에 로그를 삽입하여, 데이터를 확인하는 방법이다.
using UnityEngine;
public class DebugExample : MonoBehaviour
{
public RectTransform rectTransform;
float maxXY; // maximum magnitude.
float maxSqrMagnitude;
Ray ray;
// Start is called before the first frame update
void Start()
{
maxXY = rectTransform.GetComponent<RectTransform>().rect.width / 4;
maxSqrMagnitude = Mathf.Pow(maxXY, 2.0f);
Debug.Assert(rectTransform);
Debug.Log("Mag :" + maxXY + "Sqr :" + maxSqrMagnitude);
Debug.LogWarning("Width :" + rectTransform.rect.width);
Debug.LogError("Height :" + rectTransform.rect.height);
}
void Update()
{
ray = Camera.main.ScreenPointToRay(Input.mousePosition);
Debug.DrawRay(ray.origin, ray.direction * 50.0f, Color.green);
Debug.DrawLine(transform.position, transform.position + transform.forward * 3.0f, Color.blue);
}
}
2.1 콘솔 출력
유니티는 소스 코드의 데이터를 콘솔 창에 출력할 수 있도록 하는 Debug 시스템을 제공한다.
Debug의 사용방법은 개발자가 확인하고자 하는 소스 코드 부분에 디버그를 삽입하고 오브젝트, 변수 등을 콘솔 창에 출력하도록 설정한다. Debug의 함수들은 object를 인자로 받는다. 변수, 클래스 등을 사용할 수 있다.
Debug에서 콘솔 창에 출력하는 함수들은 다음과 같다.
- Debug.Log( object message) : 해당 메시지를 콘솔 창에 표시한다. Log() 함수는 흰색 글자를 출력하며, LogWarning()은 노란색, LogError()는 빨간색 글씨로 출력한다.
- Debug.Assert(bool condition) : 참 거짓(true false)을 확인하는 데 사용한다. 예를 들어, 오브젝트를 인자로 전달하는 경우, null일 경우에는 콘솔 창에 에러를 표시한다.
- ...
위에 언급한 함수 이외에도 더 많은 함수들을 제공한다.
2.2 선 그리기
프로그램을 개발할 때, 레이(ray)를 사용하여 물체와의 충돌을 확인하는 로직을 구현한다. 레이는 눈에 보이지 않는다. Debug를 사용하여 씬(Scene) 뷰에서 선을 그려 확인할 수 있다.
Debug.DrawRay(Vector3 start, Vector3 direction)
Debug.DrawLine(Vector3 start, Vector3 end)
2.3 에디터 실행모드 일시정지
에디터 모드는 일시 정지 기능을 제공한다. 개발자가 확인하고자 하는 특정 시점에서 직접 정지 버튼을 누르는 것은 쉽지 않다. Debug를 활용하면, 원하는 시점에 일시 정지가 가능하다.
Debug.Break() : 일시정지
3. 비주얼 스튜디오 디버그 모드( Visual studio Debugging )
비주얼 스튜디오는 강력한 디버깅 모드를 제공하고 있다. 런타임 중의 속성 값들을 확인할 수 있으며,
프로시저 단위, 스크립트의 줄 단위로 프로그램을 제어하고 확인할 수 있다.
※ 다른 프로그램을 사용하는 개발자는 아래 참고 링크를 참고하여 디버깅 모드를 연결하고 사용하면 된다.
비주얼 스튜디오 디버그 모드는 스크립트의 소스 코드 부분에 중단점을 찍고 디버그 모드를 활성화한 후에, 프로그램을 실행하면 된다. 비주얼 스튜디오는 해당 중단 지점이 실행되면 프로그램을 일시 정지한다. 개발자는 변수, 클래스 등의 값을 런타임 중에 확인할 수 있다. 쉽게 찾을 수 없는 오류가 발생할 때 사용하여, 런타임 중에 값들을 직접 확인할 수 있어서 굉장히 유용하다.
3.1 디버그 모드 활성화
비주얼 스튜디오의 디버그 모드 활성화는 Unity에 연결 버튼(녹색 실행 버튼)을 누르면 된다.
디버그 모드를 활성화하기 이전에 아래의 이미지처럼 중단지점을 지정해야 한다.
중단 지점은 숫자(코드라인 번호) 옆의 공백 부분을 클릭하여 설정한다.
3.2 디버그 모드 실행
디버그 모드를 실행하면 비주얼 스튜디오는 다음과 같은 상태가 된다.
디버그 모드에서 사용 가능한 버튼들이 생긴다.
※ 아래 그림의 정지 버튼( ■ )을 누르면 디버그 모드를 해제한다.
3.3 유니티 실행 및 중단 지점 실행
유니티를 실행하고, 중단지점을 지정한 곳의 소스 코드가 실행되도록 한다.
예를 들어, 위의 이미지 코드는 마우스 왼쪽 버튼을 클릭한다. 마우스 클릭이 발생하면 중단 지점으로 설정한 곳의 코드가 실행된다.
해당 중단지점이 실행되면 유니티에서 비주얼 스튜디오로 포커스가 옮겨가며, 런타임 중인 프로그램을 제어할 수 있는 제어 버튼들이 활성화된다. 제어 버튼을 활용하여 값들을 확인하고, 오류를 찾아낸다.
제어 버튼 속성
▶계속(C) : 다음 중단 지점까지 프로그램을 실행한다.
■ : 디버그 모드를 종료한다.
: 한 단계씩 코드를 실행한다. 아래 이미지에서 이 버튼을 누르면 RemoveFocus() 함수 내부로 이동한다.
: 프로시저 단위 코드를 실행한다. 해당 스크립트에서 줄 단위로 코드를 실행한다. 아래 이미지에서 버튼을 누르면, RemoveFocuse();에서 playerAgent.MovetoPoint(raycastHit.point);까지 프로그램을 실행한다
: 프로시저 나가기를 실행한다. 스크립트의 해당 함수를 실행하고 완료 지점으로 이동한다.
3.4 속성 값 확인
디버그 모드에서는 현재 실행중인 프로그램의 런타임 상에서 속성 값들을 직접 확인할 수 있다. 스크립트의 아래쪽 뷰의 변수 값, 인스턴스 값들을 클릭하여 오류를 확인한다.
4. 기타 오류
유니티 프로그램이 실행 중 완전히 정지하는 경우가 있다. 어떠한 키 입력도 받지 않으며, 유니티 프로그램을 강제로 종료해야 하는 경우로, 로직 구성이 잘못되어 유니티 프로그램이 무한 루프에 빠진 경우에 발생한다.
예제 코드
IEnumerator ExampleCorutine()
{
yield return null;
while (true)
{
// yield return null;
}
}
5. 참고
Unity C# code debugging.
https://docs.unity3d.com/kr/2018.4/Manual/ManagedCodeDebugging.html
Unity document Debug class
https://docs.unity3d.com/ScriptReference/Debug.html
Microsoft Visual studio Tools for Unity