Hero background image
Ускорьте и улучшите QA-тестирование с помощью класса Debug в Unity
Эта страница была переведена с использованием машинного перевода. Для просмотра исходной версии, которая является точной и служит источником достоверной информации,

Читайте далее, чтобы узнать, как улучшить процесс контроля качества и отладки с помощью класса Debug в Unity.

Возможно, вы уже знакомы с Debug.Log класс Unity Debug поддерживает множество других удобных функций, которые помогут вам ускорить тестирование и отладку. На этой странице рассказывается, как использовать класс Debug для визуализации гизмо в представлениях Scene и Game, как приостановить режим Play в редакторе из сценария и другие советы.

Ошибки, предупреждения и сообщения

Если у вас есть опыт работы с Unity, то вы наверняка использовали окно Console для отображения ошибок, предупреждений и других сообщений, выдаваемых редактором. Вы также наверняка выводили свои собственные сообщения на консоль, используя класс Debug.

Но вы не ограничиваетесь только сообщением Debug.Log. При создании вывода строк в окно Console вы можете указать один из трех типов (ошибка, предупреждение и сообщение), каждый из которых имеет свой тип значка.

Три варианта:

  • Debug.Log ("Это сообщение журнала.")
  • Debug.LogWarning ("Это предупреждение.")
  • Debug.LogError ("Это сообщение об ошибке.")

Вы можете использовать окно Консоль для фильтрации сообщений в соответствии с вашими предпочтениями. Вы также можете воспользоваться преимуществом включения функции Error Pause в окне Console, поскольку любые ошибки, которые вы записываете в консоль через класс Debug, приводят к приостановке режима Unity Play.

Все, что выводится в окно Console, либо Unity, либо ваши собственные сообщения, добавляется в файл журнала, на который вы можете ссылаться, чтобы увидеть, где возникли проблемы в вашем приложении. Каждая операционная система хранит файлы журналов в разных местах, поэтому ознакомьтесь с документацией, чтобы узнать спецификации для каждой системы.

Параметры трассировки стека можно найти в разделе Настройки проекта > Проигрыватель.
ПАРАМЕТРЫ ТРАССИРОВКИ СТЕКА МОЖНО НАЙТИ В РАЗДЕЛЕ НАСТРОЕК ПРОЕКТА > ПЛЕЕР.
Настройте трассировку стека

Когда возникает ошибка или исключение, в окне Console отображается трассировка стека вместе с сообщением об ошибке, чтобы помочь вам понять, как произошла ошибка и где она возникла. Хотя Debug.Log позволяет отправить сообщение на консоль, вы также можете настроить уровень детализации, отображаемый в трассировке стека.

По умолчанию вывод в Консоли ссылается на строку кода, сгенерировавшего сообщение, что позволяет легко определить строку, метод или последовательность вызовов функций, вызвавших появление записи.

Если скрипт не открывается в выбранной вами IDE, перейдите в меню Файл > Параметры > Внешние инструменты и выберите "Внешний редактор скриптов" из выпадающего списка.

Вы можете настроить информацию, отображаемую в трассировке стека, через File > Build Settings... > Player Settings... > Other Settings в редакторе.

Для каждого типа журнала доступны следующие параметры:

  • Нет: Трассировка стека не будет выводиться в журнал.
  • ScriptOnly: Будет выведена только управляемая трассировка стека. Это вариант по умолчанию, если вы не меняли настройки.
  • Полный: В журнал будет занесена трассировка стека нативного и управляемого приложений.

Воспользуйтесь функцией поиска в консоли, если ваш журнал переполнен. При вводе поискового запроса консоль фильтрует сообщения, отображая только те, которые содержат соответствующий текст.

Контролируйте количество строк каждой записи, отображаемых в списке, нажав кнопку меню Console и выбрав в меню пункт Log Entry > [X] Lines, где [X] - количество строк, отображаемых для каждой записи.

Используйте LogFormat для отображения переменных

Сайт String.Format метод в C# позволяет создать строку со встроенными форматированными переменными данными. Класс Debug имеет Debug.LogFormatв котором используется тот же синтаксис.

Первый параметр - это отформатированная строка сообщения. Если включить значение индекса в фигурные скобки, оно будет заменено на параметр index-1 с помощью метода ToString, если он существует, или преобразования строки System. В приведенном выше примере кода, строка 14, {0} будет заменена на origin.ToString().

Более сложный пример таков:

Debug.LogFormat("At Start transform.position={0}, transform.rotation={1}", transform.position, transform.rotation);

{0} будет заменен параметром 1, transform.position, а {1} будет заменен параметром 2, transform.rotation. В каждом случае будет использоваться метод ToString свойств Vector3 и Quaternion. Результат будет выглядеть следующим образом:

"Начало координат - (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, то по умолчанию на экране будет отображаться шесть чисел, следующих за десятичной точкой. Вы можете управлять этим поведением с помощью пользовательской строки форматирования чисел.

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

При использовании двоеточия строка форматирования 0.00 отображает целую часть значения, десятичный разделитель и два числа, следующих за разделителем. Последнее число округляется до следующего значения по привычному методу 4 до пола, 5 до неба.

В этом примере результат будет следующим: pi = 3,14

Как запускать автоматические тесты для своих игр с помощью Unity Test Framework

Использование Debug.Assert

Debug.Assert() похож на метод Debug.Log(), но вместо того, чтобы выводить сообщение в консоль, он проверяет условие и выводит сообщение об ошибке, если условие ложно. Он используется для проверки предположений и выявления ошибок в процессе разработки.

Утверждения - это отличный способ проверить, что ваша программа не перейдет в неожиданное состояние. Они похожи на вставку Log внутри оператора if. Когда вы работаете над методом, который зависит от назначения свойства класса, утверждение может помочь вам отследить ошибки.

Когда вызывается Debug.Assert(), она принимает два параметра: условие для проверки и необязательное сообщение, которое нужно вывести, если условие ложно. Если условие истинно, ничего не происходит, и программа продолжает выполняться. Если условие ложно, программа прекращает работу и в редакторе появляется сообщение об ошибке.

void SetColor(Color color)

{

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);

Если ( 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);

Он принимает от двух до пяти параметров: начальную точку, конечную точку и необязательный цвет. Например, следующий код нарисует белую линию между точками start и end:

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

Параметры

  • начать: Точка в мировом пространстве, где должна начинаться линия
  • конец: Точка в мировом пространстве, где должна закончиться линия
  • цвет: Цвет линии
  • продолжительность: Время в секундах для отображения строки. 0 отображает строку для одного кадра
  • ГлубинаТест: Должна ли линия быть скрыта объектами переднего плана

В примере метод Update скрипта MonoBehaviour, прикрепленного к объекту Skeleton GameObject, приводит к изображению, показанному выше. Линия видна в режиме просмотра игры только при включенных гизмо. Чтобы включить их, нажмите кнопку Gizmo в правом верхнем углу панели просмотра игры. Линия также видна в режиме просмотра сцены.

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 отображает строку для одного кадра
  • ГлубинаТест: Должна ли линия быть скрыта объектами переднего плана

Вот еще один пример кода:

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

В этом примере кода метод Update скрипта MonoBehaviour, прикрепленного к объекту Skeleton GameObject, приводит к изображению выше. Луч с длиной может быть полезен для отладки тестов на близость. Здесь длина луча равна 3 мировым единицам. Если атака должна начинаться с 3 единиц, то у вас есть отличный визуальный тест на то, как долго 3 единицы находятся в вашей сцене.

Советы по тестированию и обеспечению качества для проектов Unity

Отображение гизмо
ОТОБРАЖЕНИЕ ГИЗМО
Использование гизмосов

Гизмосы - это мощный инструмент для визуальной отладки в Unity. Они позволяют рисовать простые 2D- и 3D-фигуры, линии и текст в режиме просмотра сцены, облегчая восприятие и понимание происходящего в игровом мире.

Вы можете рисовать простые фигуры и линии в представлении Scene с помощью всего нескольких строк кода. Это делает их идеальным инструментом для быстрого создания прототипов и тестирования игровой механики. Они рисуются в режиме реального времени, поэтому вы можете сразу же увидеть результаты изменений в коде и внести необходимые изменения.

Гизмосы визуально отображают сложные игровые механики, которые сложно понять только через код. Например, с помощью Gizmos можно нарисовать линию, показывающую траекторию полета снаряда, или визуализировать границы зоны срабатывания, как показано на изображении выше.

Используйте штуковины для создания наглядных пособий, которые облегчают другим членам команды понимание вашего кода и игровой механики.

Гизмосы практически не влияют на производительность, поэтому вы можете свободно использовать их, не снижая производительности.

Значок гизмо находится в правом верхнем углу представлений "Сцена" и "Игра". Чтобы добавить пользовательское гизмо, необходимо добавить скрипт, включающий обратный вызов OnDrawGizmos, как показано в примере кода ниже. Этот скрипт нарисует каркасный куб, расположенный на 3 мировые единицы вперед от позиции GameObject. Размер куба определяется свойством класса vsize типа Vector3: 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("цель не установлена!");

}

Когда вы запускаете код в редакторе, он перехватывает брошенные ошибки и делает Debug.LogError() вместо того, чтобы аварийно завершить работу Unity или приложения.

Использование исключений в Unity позволяет отлавливать ошибки на ранней стадии. Это также может облегчить отладку, предоставив вам больше информации о том, где возникли ошибки и что их вызвало.

итоговая вкладка
Дополнительные ресурсы
Понравился ли вам этот контент?