무엇을 찾고 계신가요?
Hero background image
Unity의 Debug 클래스로 QA 테스트 속도 향상 및 개선
이 페이지는 기계 번역되었습니다. 정확한 정보 출처로 원본 버전을 보려면 우측 링크를 참고하세요.

유니티의 디버그 클래스를 통해 QA 및 디버깅 프로세스를 개선하는 방법을 알아보세요.

이미 익숙하실 수도 있지만 Debug.Log 함수에 이미 익숙하실 수도 있지만, Unity 디버그 클래스는 테스트 및 디버깅 속도를 높이는 데 도움이 되는 다른 많은 편리한 함수를 지원합니다. 이 페이지에서는 씬 및 게임 뷰에서 기즈모 시각화를 위해 디버그 클래스를 사용하는 방법, 스크립트에서 에디터의 플레이 모드를 일시 중지하는 방법 및 기타 팁에 대해 설명합니다.

오류, 경고 및 메시지

Unity를 사용해 본 경험이 있다면 콘솔 창에서 에디터에서 생성된 오류, 경고 및 기타 메시지를 표시하는 데 사용해 본 적이 있을 것입니다. 또한 Debug 클래스를 사용하여 콘솔에 메시지를 직접 출력한 적도 있을 것입니다.

하지만 Debug.Log 메시지에만 국한되지 않습니다. 콘솔 창에 출력 문자열을 만들 때 세 가지 유형(오류, 경고, 메시지) 중 하나를 지정할 수 있으며, 각각 고유한 아이콘 유형이 있습니다.

세 가지 변형이 있습니다:

  • Debug.Log("이것은 로그 메시지입니다.")
  • Debug.LogWarning("이것은 경고 메시지입니다.")
  • Debug.LogError("오류 메시지입니다.")

콘솔 창을 사용하여 기본 설정에 따라 메시지를 필터링할 수 있습니다. 또한 콘솔 창에서 오류 일시 중지를 활성화하면 Debug 클래스를 통해 콘솔에 기록하는 모든 오류로 인해 Unity의 플레이 모드가 일시 중지되므로 이를 활용할 수 있습니다.

콘솔 창에 출력되는 모든 내용은 Unity 또는 사용자의 메시지에 의해 로그 파일에 추가되어 애플리케이션에서 문제가 발생한 위치를 확인할 수 있습니다. 운영 체제마다 로그 파일을 저장하는 위치가 다르므로 각 시스템의 사양은 설명서를 참조하세요.

스택 추적 옵션은 프로젝트 설정 > 플레이어에서 찾을 수 있습니다.
스택 추적 옵션은 프로젝트 설정 > 플레이어에서 찾을 수 있습니다.
스택 추적 구성

오류나 예외가 발생하면 콘솔 창에 오류 메시지와 함께 스택 추적이 표시되어 오류의 발생 경위와 원인을 파악하는 데 도움이 됩니다. Debug.Log를 사용하면 콘솔에 메시지를 보낼 수 있지만 스택 추적에 표시되는 세부 수준을 구성할 수도 있습니다.

기본적으로 콘솔의 출력은 메시지를 생성한 코드 줄에 연결되므로 항목을 표시한 줄, 메서드 또는 함수 호출 순서를 쉽게 식별할 수 있습니다.

선택한 IDE에서 스크립트가 열리지 않으면 파일 > 환경설정 > 외부 도구로 이동하여 드롭다운에서 "외부 스크립트 편집기" 를 선택합니다.

에디터의 파일 > 빌드 설정... > 플레이어 설정... > 기타 설정을 통해 스택 추적에 표시되는 정보를 구성할 수 있습니다.

각 로그 유형에 사용할 수 있는 옵션은 다음과 같습니다:

  • 없음: 로그에 스택 추적이 출력되지 않습니다.
  • 스크립트 전용: 관리되는 스택 추적만 출력됩니다. 설정을 변경하지 않은 경우 이 옵션이 기본값입니다.
  • 가득 찼습니다: 기본 및 관리되는 스택 추적이 기록됩니다.

로그가 혼잡해지면 콘솔의 검색 기능을 활용하세요. 검색어를 입력하면 콘솔이 메시지를 필터링하여 일치하는 텍스트가 포함된 메시지만 표시합니다.

콘솔 메뉴 버튼을 클릭하고 메뉴에서 로그 항목 > [X] 줄을 선택하여 목록에 표시되는 각 항목의 줄 수를 제어합니다. 여기서 [X]는 각 항목에 대해 표시할 줄 수입니다.

LogFormat을 사용하여 변수 표시

문자열의 String.Format 메서드를 사용하면 형식이 지정된 변수 데이터가 포함된 문자열을 만들 수 있습니다. Debug 클래스에는 Debug.LogFormat과 같은 구문을 사용합니다.

첫 번째 매개변수는 형식이 지정된 메시지 문자열입니다. 중괄호 안에 인덱스 값을 포함하면 인덱스 값이 있는 경우 해당 ToString 메서드를 사용하거나 시스템 문자열 변환을 사용하여 매개변수 index-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 및 쿼터니언 프로퍼티의 ToString 메서드가 사용됩니다. 결과는 다음과 같습니다:

"원점은 (0.00, 0.00, 0.00)입니다.

UnityEngine.Debug:LogFormat (string,object[])”

추가 매개 변수

이러한 로그 메서드에 선택적 두 번째 파라미터를 제공하여 메시지가 특정 게임 오브젝트와 연관되어 있음을 나타낼 수도 있습니다:

Debug.LogWarning("나는 평화롭게 왔습니다!", this.gameObject);

형식이 지정된 변수 데이터를 표시할 때 Debug.LogFormat의 경고 및 오류 버전이 있습니다:

  • Debug.LogWarningFormat("Cube.position.x의 값은 {0:0.00}입니다.", transform.position.x)
  • Debug.LogErrorFormat("Cube.position.x의 값은 {0:0.00}입니다.", transform.position.x)

Debug.Logformat을 사용하여 콘솔에 실수 값을 보내면 기본 표시에는 소수점 뒤에 6개의 숫자가 표시됩니다. 사용자 지정 숫자 서식 지정 문자열로 이 동작을 제어할 수 있습니다.

Debug.LogFormat("pi = {0:0.00}", Mathf.PI);

콜론을 사용하면 서식 문자열 0.00에 값의 정수 부분, 소수점 구분 기호, 구분 기호 뒤에 오는 두 개의 숫자가 표시됩니다. 마지막 숫자는 익숙한 방법인 4는 바닥으로, 5는 하늘로 반올림하여 다음 값을 기준으로 반올림합니다.

이 예제에서 출력은 다음과 같습니다: pi = 3.14

Unity 테스트 프레임워크로 게임에 대한 자동화된 테스트를 실행하는 방법

Debug.Assert 사용

Debug.Assert()는 Debug.Log() 메서드와 비슷하지만 콘솔에 메시지를 기록하는 대신 조건을 테스트하고 조건이 거짓인 경우 오류 메시지를 표시합니다. 개발 중에 가정을 검증하고 오류를 발견하는 데 사용됩니다.

어설션은 프로그램이 예기치 않은 상태로 들어가지 않는지 확인하는 좋은 방법입니다. if 문 안에 로그를 삽입하는 것과 같습니다. 클래스 속성이 할당되는 것에 의존하는 메서드에서 작업하는 경우 어설션은 오류를 추적하는 데 도움이 될 수 있습니다.

Debug.Assert()가 호출되면 테스트할 조건과 조건이 거짓일 경우 표시할 선택적 메시지라는 두 가지 매개 변수가 필요합니다. 조건이 참이면 아무 일도 일어나지 않고 프로그램이 계속 실행됩니다. 조건이 거짓이면 프로그램 실행이 중지되고 편집기에 오류 메시지가 표시됩니다.

void SetColor(컬러 색)

{

Debug.Assert(material != null, "ChangeColor: 머티리얼이 할당되지 않았습니다");

material.SetColor("_Color", color);

}

SetColor를 호출했는데 머티리얼이 할당되지 않은 경우 콘솔에 'SetColor: 머티리얼이 할당되지 않음'이 표시됩니다.

Debug.Break 사용

Debug.Break()는 게임 실행을 일시 중지하고 코드의 현재 지점에서 디버거로 진입하는 데 사용되는 Unity의 Debug 클래스에서 제공하는 메서드입니다. 이를 통해 게임 상태를 검사하고 코드를 한 줄씩 살펴보고 버그를 찾아 수정할 수 있습니다.

Debug.Break()가 호출되면 게임 실행이 중지되고 디버거 창이 열립니다. 이를 통해 게임 상태를 검사하고 필요에 따라 코드를 디버깅할 수 있습니다. 디버거를 사용하여 코드를 단계별로 살펴보고, 중단점을 설정하고, 메모리의 변수와 개체를 검사할 수 있습니다.

예를 들어 NPC가 플레이어 캐릭터와 목표 거리 내에 있을 때 게임을 중지하고 싶을 수 있습니다. 게임이 중단되면 인스펙터에서 상태를 확인할 수 있습니다:

float dist = Vector3.Distance(transform.position, npc.position);

if ( dist < 5) Debug.Break();

장면 보기의 Debug.DrawLine
장면 보기에서 DEBUG.DRAWLINE
Debug.DrawLine

Debug.DrawLine과 Debug.DrawRay는 시각적 디버깅에 사용되는 Unity의 Debug 클래스에서 제공하는 두 가지 메서드입니다. 콜리전 및 레이캐스트와 같은 물리 관련 코드를 테스트하고 시각화하는 데 유용합니다. 둘 다 게임 및 장면 보기에 모두 표시되는 색상 선을 그릴 수 있습니다. 예를 들어 총알의 궤적이나 레이저 빔의 경로를 시각화하려면 Debug.DrawRay를 사용하고, 충돌기의 경계나 오브젝트의 움직임을 시각화하려면 Debug.DrawLine을 사용할 수 있습니다.

Debug.DrawLine은 씬의 두 점 사이에 직선을 그리는 데 사용됩니다:

Debug.DrawLine(transform.position, target.position, Color.white, 0, false);

시작점, 끝점, 선택적 색상 등 2~5개의 매개변수가 필요합니다. 예를 들어 다음 코드는 포인트의 시작과 끝 사이에 흰색 선을 그립니다:

public static void DrawLine(Vector3 start, Vector3 end, Color color = Color.white, float duration = 0.0f, bool depthTest = true);

매개변수

  • 시작: 월드 스페이스에서 선이 시작되어야 하는 지점
  • : 월드 스페이스에서 선이 끝나야 하는 지점
  • 색상: 선 색상
  • 기간: 줄을 표시할 시간(초)입니다. 0은 단일 프레임의 라인을 표시합니다.
  • depthTest: 전경 오브젝트에 의해 선이 가려지는 경우

코드 예제에서 스켈레톤 게임 오브젝트에 첨부된 MonoBehaviour 스크립트의 업데이트 메서드는 위에 표시된 이미지를 생성합니다. 이 선은 기즈모가 활성화된 경우에만 게임 보기에서 볼 수 있습니다. 게임 보기 창의 오른쪽 상단에 있는 기즈모 버튼을 클릭하여 활성화합니다. 이 선은 씬 보기에서도 볼 수 있습니다.

Debug.DrawRay

DrawLine의 대안은 DrawRay입니다. Debug.DrawRay는 지정된 원점에서 시작하여 지정된 방향으로 확장되는 광선을 씬에 그리는 데 사용됩니다. 기본적으로 무한 광선입니다. Debug.DrawRay()로 그려진 광선이 충돌기에 부딪히면 교차 지점에서 멈추고 더 이상 계속되지 않습니다. 이 동작은 씬에서 오브젝트 간 충돌을 감지하는 데 사용되는 Unity의 레이캐스트와 동일합니다.

여기서 두 번째 매개변수는 선의 방향과 길이를 정의합니다. 선은 시작에서 시작 + dir로 그려집니다:

public static void DrawRay(Vector3 start, Vector3 dir, Color color = Color.white, float duration = 0.0f, bool depthTest = true);

코드 예제의 매개 변수는 다음과 같습니다:

  • 시작: 월드 스페이스에서 선이 시작되어야 하는 지점
  • dir: 선의 월드 스페이스에서의 방향 및 길이
  • 색상: 선 색상
  • 기간: 라인을 표시하는 시간(초), 0은 단일 프레임의 라인을 표시합니다.
  • depthTest: 전경 오브젝트에 의해 선이 가려지는 경우

다음은 또 다른 코드 예시입니다:

Vector3 dir = transform.TransformDirection(Vector3.forward) * 3;Debug.DrawRay(transform.position, dir, Color.white, 0, false);

이 코드 예제에서 스켈레톤 게임 오브젝트에 첨부된 모노비헤이비어 스크립트의 업데이트 메서드는 위 이미지와 같은 결과를 가져옵니다. 길이가 있는 광선은 근접성 테스트를 디버깅하는 데 유용할 수 있습니다. 여기서 광선 길이는 3월드 단위입니다. 공격이 3 유닛에서 시작되어야 한다면, 씬에서 3 유닛이 얼마나 오래 있는지 시각적으로 테스트할 수 있습니다.

Unity 프로젝트를 위한 테스트 및 품질 보증 팁

기즈모 표시
기즈모 표시
기즈모 사용

기즈모는 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);

}

기즈모 드롭다운을 클릭하여 표시 여부를 제어합니다. 온드로우기즈모 콜백이 있는 모든 스크립트가 나열됩니다.

기즈모 클래스를 사용한 다른 유용한 방법에 대해 자세히 알아보려면 문서를 검토하세요.

예외 던지기

예외를 던지는 것은 프로그램 실행 중에 오류나 예외적인 상황이 발생했음을 나타내기 위해 프로그래밍에서 사용되는 기법입니다. 이 방법을 사용하여 스레드가 더 이상 실행되지 않도록 중지하여 추가 손상을 방지할 수 있습니다.

Unity에서 예외를 던지는 것은 다른 프로그래밍 언어에서와 동일한 방식으로 사용됩니다.

예외가 발생하여 코드에서 잡아서 처리하지 않으면 일반적으로 프로그램 실행이 중지되고 앱에서 운영 체제로 되돌아가게 됩니다. Unity에서는 프로그램 실행이 즉시 중단되고 런타임 환경이 예외를 처리할 수 있는 '캐치' 블록을 찾습니다. 캐치 블록이 발견되지 않으면 프로그램이 종료되고 예외가 콘솔에 기록됩니다.

예외를 던지면 오류 처리 로직과 나머지 프로그램 로직을 분리할 수 있으므로 보다 깔끔한 코드를 작성하는 데 도움이 될 수 있습니다. 예외를 던지면 반환값이나 전역 상태에 의존하여 오류를 전달할 필요 없이 호출자에게 문제가 발생했음을 알릴 수 있습니다.

Unity에서 예외를 던지려면 throw 키워드 뒤에 예외 오브젝트를 사용하면 됩니다. 다음은 한 가지 예입니다:

if (target == null)

{

새로운 System.NullReferenceException("대상이 설정되지 않았습니다!")을 던집니다;

}

에디터에서 코드를 실행하면 Unity나 앱을 크래시하는 대신 던져진 오류를 포착하고 Debug.LogError()를 실행합니다.

Unity에서 예외를 사용하면 오류를 조기에 발견할 수 있습니다. 또한 오류가 발생하는 위치와 원인에 대한 자세한 정보를 제공하여 디버깅을 더 쉽게 할 수 있습니다.

최종 탭
리소스 더 보기
이 콘텐츠가 마음에 드셨나요?