
QA 및 디버깅 프로세스를 개선하는 방법을 배우려면 계속 읽어보세요.
Debug.Log 함수에 이미 익숙할 수 있지만, Unity Debug 클래스는 테스트 및 디버깅을 가속화하는 데 도움이 되는 많은 유용한 기능을 지원합니다. 이 페이지에서는 씬 및 게임 뷰에서 기즈모 시각화를 위해 Debug 클래스를 사용하는 방법, 스크립트에서 에디터의 재생 모드를 일시 중지하는 방법, 그리고 더 많은 팁을 설명합니다.
Unity에 익숙하다면, 아마도 에디터에서 생성된 오류, 경고 및 기타 메시지를 표시하기 위해 Console window를 사용했을 것입니다. 또한 Debug 클래스를 사용하여 콘솔에 자신의 메시지를 출력했을 것입니다.
하지만 Debug.Log 메시지에만 국한되지 않습니다. 콘솔 창에 출력 문자열을 생성할 때, 각기 다른 아이콘 유형을 가진 세 가지 유형(오류, 경고 및 메시지) 중 하나를 지정할 수 있습니다.
세 가지 변형은 다음과 같습니다:
콘솔 창을 사용하여 메시지를 필터링할 수 있습니다. 콘솔 창에서 오류 일시 중지를 활성화하면, Debug 클래스를 통해 콘솔에 기록한 오류가 Unity의 재생 모드를 일시 중지시킵니다.
Unity 또는 사용자의 메시지로 콘솔 창에 출력된 모든 내용은 로그 파일에 추가되어 애플리케이션에서 문제가 발생한 위치를 확인할 수 있습니다. 각 운영 체제는 로그 파일을 다른 위치에 저장하므로, 각 시스템의 사양을 확인하려면 문서를 확인하세요.

오류나 예외가 발생하면 콘솔 창에 스택 추적과 함께 오류 메시지가 표시되어 오류가 발생한 원인과 위치를 이해하는 데 도움이 됩니다. Debug.Log을 사용하면 콘솔에 메시지를 보낼 수 있지만, 스택 추적에 표시되는 세부 수준을 구성할 수도 있습니다.
기본적으로 콘솔의 출력은 메시지를 생성한 코드의 줄에 링크되어 있어, 항목이 나타나게 한 줄, 메서드 또는 함수 호출의 순서를 쉽게 식별할 수 있습니다.
선택한 IDE에서 스크립트가 열리지 않으면 파일 > 환경 설정 > 외부 도구로 이동하여 드롭다운에서 “외부 스크립트 편집기”를 선택하세요.
편집기에서 파일 > 빌드 설정… > 플레이어 설정… > 기타 설정을 통해 스택 추적에 표시되는 정보를 구성할 수 있습니다.
각 로그 유형에 대해 다음 옵션이 제공됩니다:
로그가 혼잡해지면 콘솔의 검색 기능을 사용하세요. 검색어를 입력하면 콘솔이 메시지를 필터링하여 일치하는 텍스트가 포함된 메시지만 표시합니다.
콘솔 메뉴 버튼을 클릭하고 메뉴에서 로그 항목 > [X] 줄을 선택하여 목록에서 각 항목의 표시 줄 수를 제어할 수 있습니다. 여기서 [X]는 각 항목에 대해 표시할 줄 수입니다.
C#의 String.Format 메서드는 내장된 형식화된 변수 데이터로 문자열을 생성할 수 있게 해줍니다. Debug 클래스에는 Debug.LogFormat가 있으며, 이는 동일한 구문을 사용합니다.
첫 번째 매개변수는 형식화된 메시지 문자열입니다. 중괄호에 인덱스 값을 포함하면, 이는 해당 ToString 메서드를 사용하여 매개변수 인덱스-1로 대체됩니다. 존재하지 않으면 시스템 문자열 변환이 사용됩니다. 위의 코드 예제에서 14번째 줄, {0}는 origin.ToString()로 대체됩니다.
더 복잡한 예는 다음과 같습니다:
Debug.LogFormat("시작 시 transform.position={0}, transform.rotation={1}", transform.position, transform.rotation);
{0}는 매개변수 1, transform.position으로 대체되고 {1}는 매개변수 2, transform.rotation으로 대체됩니다. 각 경우에 Vector3 및 Quaternion 속성의 ToString 메서드가 사용됩니다. 결과는 다음과 같이 보일 것입니다:
“원점은 (0.00, 0.00, 0.00)
UnityEngine.Debug:LogFormat (string,object[])”
이러한 로그 메서드에 선택적 두 번째 매개변수를 제공하여 메시지가 특정 GameObject와 관련이 있음을 나타낼 수 있습니다:
Debug.LogWarning("I come in peace!", this.gameObject);
형식화된 변수 데이터를 표시할 때 Debug.LogFormat의 경고 및 오류 버전이 있습니다:
콘솔에 Debug.Logformat을 사용하여 float 값을 보내면 기본 표시가 소수점 뒤에 여섯 개의 숫자를 보여줍니다. 사용자 지정 숫자 형식 문자열로 이 동작을 제어할 수 있습니다.
Debug.LogFormat("pi = {0:0.00}", Mathf.PI);
콜론을 사용하여 형식 문자열 0.00은 값의 정수 부분, 소수 구분 기호 및 구분 기호 뒤의 두 숫자를 표시합니다. 마지막 숫자는 다음 값에 따라 익숙한 방법으로 4는 바닥으로, 5는 하늘로 반올림됩니다.
이 예에서 출력은 다음과 같습니다: pi = 3.14
Debug.Assert()는 Debug.Log() 메서드와 유사하지만, 콘솔에 메시지를 기록하는 대신 조건을 테스트하고 조건이 거짓일 경우 오류 메시지를 표시합니다. 개발 중 가정의 유효성을 검사하고 오류를 잡는 데 사용됩니다.
Assertions는 프로그램이 예상치 못한 상태에 들어가지 않도록 확인하는 좋은 방법입니다. if 문 안에 Log를 삽입하는 것과 같습니다. 클래스 속성이 할당되는 것에 의존하는 메서드에서 작업할 때, assertion은 오류를 추적하는 데 도움이 될 수 있습니다.
Debug.Assert()가 호출되면 두 개의 매개변수를 받습니다: 테스트할 조건과 조건이 거짓일 경우 표시할 선택적 메시지입니다. 조건이 참이면 아무 일도 일어나지 않으며 프로그램은 계속 실행됩니다. 조건이 거짓이면 프로그램 실행이 중단되고 오류 메시지가 에디터에 표시됩니다.
void SetColor(Color color)
{
Debug.Assert(material != null, "ChangeColor: material not assigned");
material.SetColor("_Color", color);
}
SetColor를 호출하고 material이 할당되지 않으면 'SetColor: material not assigned'가 콘솔에 표시됩니다.
Debug.Break()는 Unity의 Debug 클래스에서 제공하는 메서드로, 게임 실행을 일시 중지하고 코드의 현재 지점에서 디버거에 들어가는 데 사용됩니다. 게임의 상태를 검사하고 코드를 한 줄씩 실행하여 버그를 찾고 수정할 수 있습니다.
Debug.Break()가 호출되면 게임 실행이 중단되고 디버거 창이 열립니다. 이것은 게임의 상태를 검사하고 필요에 따라 코드를 디버그할 수 있게 해줍니다. 디버거를 사용하여 코드를 단계별로 실행하고, 중단점을 설정하며, 메모리의 변수와 객체를 검사할 수 있습니다.
예를 들어, NPC가 플레이어 캐릭터의 목표 거리 내에 있을 때 게임을 중지하고 싶을 수 있습니다. 게임이 중단되면 검사기에서 상태를 검사할 수 있습니다:
float dist = Vector3.Distance(transform.position, npc.position);
if ( dist < 5) Debug.Break();

Debug.DrawLine과 Debug.DrawRay는 Unity의 Debug 클래스에서 제공하는 두 가지 방법으로, 시각적 디버깅에 사용됩니다. 이들은 충돌 및 레이캐스트와 같은 물리 관련 코드를 테스트하고 시각화하는 데 유용합니다. 두 방법 모두 게임 뷰와 장면 뷰 모두에서 볼 수 있는 색상 선을 그릴 수 있습니다. 예를 들어, Debug.DrawRay를 사용하여 총알의 궤적이나 레이저 빔의 경로를 시각화하고, Debug.DrawLine을 사용하여 콜라이더의 경계나 객체의 움직임을 시각화할 수 있습니다.
Debug.DrawLine은 장면의 두 점 사이에 직선을 그리는 데 사용됩니다:
Debug.DrawLine(transform.position, target.position, Color.white, 0, false);
두 개에서 다섯 개의 매개변수를 사용합니다: 시작점, 끝점, 선택적 색상. 예를 들어, 다음 코드는 시작점과 끝점 사이에 흰색 선을 그립니다:
public static void DrawLine(Vector3 start, Vector3 end, Color color = Color.white, float duration = 0.0f, bool depthTest = true);
매개변수
코드 예제에서, Skeleton GameObject에 부착된 MonoBehaviour 스크립트의 Update 메서드는 위에서 본 이미지를 생성합니다. 선은 gizmos가 활성화된 경우에만 게임 뷰에서 볼 수 있습니다. 게임 뷰 창의 오른쪽 상단에 있는 Gizmo 버튼을 클릭하여 활성화합니다. 선은 씬 뷰에서도 볼 수 있습니다.
DrawLine의 대안은 DrawRay입니다. Debug.DrawRay는 씬에서 지정된 원점에서 시작하여 지정된 방향으로 확장되는 광선을 그리는 데 사용됩니다. 기본적으로 무한 광선입니다. Debug.DrawRay()로 그려진 광선이 충돌체에 닿으면 교차점에서 멈추고 더 이상 진행되지 않습니다. 이 동작은 Unity에서 물체 간의 충돌을 감지하는 데 사용되는 레이캐스트와 동일합니다.
여기서 두 번째 매개변수는 선의 방향과 길이를 정의합니다. 선은 시작에서 시작 + dir까지 그려집니다:
public static void DrawRay(Vector3 시작, Vector3 dir, Color 색상 = Color.white, float 소요 시간 = 0.0f, bool 깊이 테스트 = true);
코드 예제의 매개변수는 다음과 같습니다:
다음은 또 다른 코드 예제입니다:
Vector3 dir = transform.TransformDirection(Vector3.forward) * 3;Debug.DrawRay(transform.position, dir, Color.white, 0, false);
이 코드 예제에서 Skeleton GameObject에 첨부된 MonoBehaviour 스크립트의 Update 메서드는 위 이미지를 생성합니다. 길이가 있는 레이는 근접 테스트를 디버깅하는 데 유용할 수 있습니다. 여기서 레이 길이는 3 세계 단위입니다. 공격이 3 단위에서 시작해야 한다면, 장면에서 3 단위가 얼마나 긴지에 대한 훌륭한 시각적 테스트를 할 수 있습니다.

기즈모는 Unity에서 시각적 디버깅을 위한 강력한 도구입니다. 기즈모를 사용하면 장면 뷰에서 간단한 2D 및 3D 도형, 선 및 텍스트를 그릴 수 있어 게임 세계에서 무슨 일이 일어나고 있는지 쉽게 볼 수 있고 이해할 수 있습니다.
몇 줄의 코드로 장면 뷰에서 간단한 도형과 선을 그릴 수 있습니다. 이로 인해 게임 메커니즘을 빠르게 프로토타입하고 테스트하는 데 이상적인 도구가 됩니다. 실시간으로 그려지므로 코드 변경의 결과를 즉시 볼 수 있고 필요한 변경을 할 수 있습니다.
기즈모는 코드만으로 이해하기 어려운 복잡한 게임 메커니즘을 시각적으로 나타냅니다. 예를 들어, 기즈모를 사용하여 발사체의 경로를 나타내는 선을 그리거나 위 이미지에서 볼 수 있는 트리거 영역의 경계를 시각화할 수 있습니다.
기즈모를 사용하여 다른 팀원이 코드와 게임 메커니즘을 이해하는 데 도움이 되는 시각적 도구를 만드세요.
기즈모는 성능에 미치는 영향이 적으므로 성능을 저하시키지 않고 자유롭게 사용할 수 있습니다.
기즈모 아이콘은 장면 및 게임 뷰의 오른쪽 상단 모서리에 있습니다. 사용자 정의 기즈모를 추가하려면 OnDrawGizmos 콜백을 포함하는 스크립트를 추가해야 합니다. 아래의 코드 예제를 참조하세요. 이 스크립트는 게임 오브젝트의 위치에서 3 세계 단위 앞에 위치한 와이어프레임 큐브를 그립니다. 큐브의 크기는 Vector3 유형의 클래스 속성 vsize에 의해 정의됩니다: public Vector3 vsize = new Vector3(1f, 1f, 1f);
void OnDrawGizmos()
{
// 변환의 위치에 노란색 구를 그립니다.
Gizmos.color = Color.yellow;
Vector3 position = transform.position + transform.TransformDirection(Vector3.forward) * 3;
Gizmos.DrawWireCube(position, vsize);
}
기즈모 드롭다운을 클릭하여 가시성을 제어합니다. OnDrawGizmos 콜백이 있는 모든 스크립트가 나열됩니다.
Gizmo 클래스와 함께 유용한 다른 메서드에 대해 더 알아보려면 문서를 검토하세요.
예외를 던지는 것은 프로그램 실행 중에 오류나 예외 상황이 발생했음을 나타내기 위해 프로그래밍에서 사용되는 기술입니다. 이 메서드를 사용하여 스레드가 더 이상 실행되지 않도록 하여 추가 손상을 방지할 수 있습니다.
Unity에서는 예외를 던지는 것이 다른 프로그래밍 언어와 동일한 방식으로 사용됩니다.
예외가 발생하고 코드에서 잡히지 않으면 프로그램 실행이 일반적으로 중지되고 앱에서 나가 운영 체제로 돌아갑니다. Unity에서는 프로그램 실행이 즉시 중단되고 런타임 환경이 예외를 처리할 수 있는 'catch' 블록을 찾습니다. catch 블록이 발견되지 않으면 프로그램이 종료되고 예외가 콘솔에 기록됩니다.
예외를 던지는 것은 오류 처리 로직을 프로그램의 나머지 로직과 분리할 수 있게 해주므로 더 깔끔한 코드를 작성하는 데 기여할 수 있습니다. 예외를 던짐으로써 호출자에게 문제가 발생했음을 신호할 수 있으며, 반환 값이나 전역 상태에 의존하지 않고 오류를 전달할 수 있습니다.
Unity에서 예외를 던지려면 throw 키워드 다음에 예외 객체를 사용할 수 있습니다. 예를 들어:
if (target == null)
{
throw new System.NullReferenceException("target not set!");
}
편집기에서 코드를 실행하면 발생한 오류를 포착하고 Unity나 앱이 충돌하는 대신 Debug.LogError()를 수행합니다.
Unity에서 예외를 사용하면 오류를 조기에 포착할 수 있습니다. 또한 오류가 발생한 위치와 원인에 대한 더 많은 정보를 제공하여 디버깅을 쉽게 할 수 있습니다.

이 기사에서 Unity 프로젝트의 테스트, 디버깅 및 성능 개선에 대해 더 많이 배워보세요:
이 전자책을 통해 Unity 개발자를 위한 고급 모범 사례 및 지침을 깊이 있게 살펴보세요:
Unity 모범 사례 허브에서 더 많은 고급 리소스를 찾아보세요.