Hero background image

Ускорьте и улучшите тестирование QA с помощью класса Debug в Unity

Эта веб-страница была переведена с помощью машинного перевода для вашего удобства. Мы не можем гарантировать точность или надежность переведенного контента. Если у вас есть вопросы о точности переведенного контента, обращайтесь к официальной английской версии веб-страницы.

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

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

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

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

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

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

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

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

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

Опции трассировки стека можно найти в Настройках проекта > Игрок.
ОПЦИИ ТРАССИРОВКИ СТЕКА МОЖНО НАЙТИ В НАСТРОЙКАХ ПРОЕКТА > ИГРОК.

Настройте свой стек вызовов

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

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

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

Вы можете настроить информацию, отображаемую в трассировке стека, через Файл > Настройки сборки… > Настройки игрока … > Другие настройки в редакторе.

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

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

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

Контролируйте, сколько строк каждой записи видно в списке, нажав кнопку меню Консоли и выбрав Запись журнала > [X] Строк из меню, где [X] - это количество строк, которые нужно отобразить для каждой записи.

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

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

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

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

Debug.LogFormat("В начале 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[])”

Дополнительные параметры

Вы также можете предоставить необязательный второй параметр для этих методов журнала, чтобы указать, что сообщение связано с определенным GameObject:

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)

Если вы отправите значение типа float в консоль с помощью Debug.Logformat, по умолчанию будет отображаться шесть цифр после десятичной точки. Вы можете контролировать это поведение с помощью пользовательской строки форматирования чисел.

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

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

В этом примере вывод будет: пи = 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() — это метод, предоставляемый классом Debug Unity, который используется для приостановки выполнения вашей игры и входа в отладчик в текущей точке вашего кода. Это позволяет вам проверить состояние вашей игры и пошагово пройти по вашему коду, чтобы найти и исправить ошибки.

Когда вызывается 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 — это два метода, предоставляемых классом Debug Unity, которые используются для визуальной отладки. Они полезны для тестирования и визуализации кода, связанного с физикой, такого как столкновения и лучевые трассировки. Оба метода позволяют рисовать цветную линию, которая видна как в окне Игры, так и в окне Сцены. Например, вы можете использовать Debug.DrawRay для визуализации траектории пули или пути лазерного луча и использовать Debug.DrawLine для визуализации границ коллайдера или движения объекта.

Debug.DrawLine используется для рисования прямой линии между двумя точками в сцене:

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

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

публичный статический метод DrawLine(Vector3 начало, Vector3 конец, Color цвет = Color.white, float продолжительность = 0.0f, bool depthTest = true);

Параметры

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

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

Debug.DrawRay

Альтернативой DrawLine является DrawRay. Debug.DrawRay используется для рисования луча в сцене, начиная с указанного начала и extending в указанном направлении. По умолчанию это бесконечный луч. Когда луч, нарисованный с помощью Debug.DrawRay(), попадает на коллайдер, он останавливается в точке пересечения и не продолжает движение дальше. Это поведение такое же, как у луча в Unity, который используется для обнаружения столкновений между объектами в сцене.

Здесь второй параметр определяет направление и длину линии. Линия будет нарисована от start до start + 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);

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

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

Отображение Gizmo
ОТОБРАЖЕНИЕ GIZMO

Использование Gizmos

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

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

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

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

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

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

}

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

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

финальная вкладка

Дополнительные ресурсы

Ускорьте тестирование QA с помощью класса Debug в Unity | Unity