Как в юнити вывести сообщение в консоль
Перейти к содержимому

Как в юнити вывести сообщение в консоль

  • автор:

Вывести сообщение в консоль (Отладка, дебаг)

Вывести сообщение в консоль можно через метод Debug.Log() .

Debug.Log("Сообщение для отладки"); Debug.LogError("Сообщение с ошибкой");

В результате во вкладке Console будут показываться сообщения.

Unty. Debug.Log

Обновлено: 26 ноября 2021

Комментарии

Авторизуйтесь, чтобы добавлять комментарии

  • Спрайты
  • Префабы
  • Добавить или изменить небо (Skybox)
  • Текстурирование
  • Изменить редактор скриптов по умолчанию
  • Анимировать объект
  • Вывести сообщение в консоль (Отладка, дебаг)
  • Случайное число
  • Поворачивать объект в сторону курсора мыши

Отправка сообщений в окно «Вывод»

Во время выполнения сообщения в окне вывода можно написать с помощью класса Debug или Trace; оба класса входят в библиотеку классов System.Diagnostics. Класс Debug используется, если необходимо выводить сообщение только в отладочной версии программы. Класс Trace используется в том случае, если необходимо выводить сообщение и в отладочной версии программы, и в выпускаемой.

Методы вывода

Классы Trace и Debug предоставляют следующие методы вывода:

  • Различные методы Write , которые выводят сведения без прерывания выполнения программы. Эти методы заменяют метод Debug.Print , который использовался в предыдущих версиях Visual Basic.
  • Методы System.Diagnostics.Debug.Assert и System.Diagnostics.Trace.Assert, которые прерывают выполнение программы и выводят сведения, если заданное условие не выполняется. По умолчанию метод Assert отображает сведения в диалоговом окне. Дополнительные сведения см. в разделе Утверждения в управляемом коде.
  • Методы System.Diagnostics.Debug.Fail и System.Diagnostics.Trace.Fail, которые всегда прерывают выполнение программы и выводят сведения. По умолчанию методы Fail отображают сведения в диалоговом окне.

В окне вывода также могут отображаться сведения о следующем:

  • Загруженные или выгруженные модули отладчика.
  • Вызванные исключения.
  • Завершившиеся процессы.
  • Завершившиеся потоки.

Связанный контент

  • Безопасность отладчика
  • Окно выходных данных
  • Трассировка и инструментирование приложений
  • Типы проектов C#, F# и Visual Basic
  • Отладка управляемого кода

Инди за 0$ на Unity. Часть 1: Консоль

Инди за 0$ на Unity. Часть 1: КонсольИнди за 0$ на Unity. Часть 1: КонсольСтруктура на момент написания статьи. В Shit улетаю ассеты, которые не имеют серьёзной значимости, мусор или неудачные эксперименты. С некоторой периодичностью я её чищу, а перед релизом сношу полностью.

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

Когда UI элементы будут готовы, наступает время кода. Я весь свой код всегда сую в пространство имён Game. Таким образом я всегда знаю какой код мой, какой не мой и избегаю любых конфликтов имён. Для консоли я использую подпространство Game.Console.

Создаём класс Console в пространстве имён Game.Console:

using System.Collections; using System.Collections.Generic; using UnityEngine; using System; namespace Game.Console < public struct Command < public string description; public Delegate function; >public class Console : MonoBehaviour < #region Static public static Console instance = null; static Dictionarycmds = new Dictionary(); public static void RegisterCommand(string name, string desc, Delegate func) < if (cmds.ContainsKey(name)) < Debug.LogError("Command '" + name + "' is already in use"); return; >Command cmd = new Command(); cmd.description = desc; cmd.function = func; cmds.Add(name, cmd); > public static void UnregisterCommand(string name) < if (!cmds.ContainsKey(name)) < Debug.LogError("Command '" + name + "' is not registered yet"); return; >cmds.Remove(name); > #endregion #region Helpers public void PrintHelp() < foreach (string cmdName in cmds.Keys) < Print(cmdName + "\t" + cmds[cmdName].description); >> public void Print(string line) < logTMP.text += line + "\n"; >public void Print(object obj) < Print(obj.ToString()); >public void PrintError(string msg) < Print("Error: » + msg); > #endregion string motd = «Welcome to debug console. Type \»help\» for nothing\n»; public TMPro.TextMeshProUGUI logTMP; public TMPro.TMP_InputField InputField; bool isActive = false; void Start() < if (instance != null) < throw new Exception("Console instance dup detected!"); >instance = this; DontDestroyOnLoad(gameObject); SetState(isActive); Application.logMessageReceived += HandleLog; RegisterCommand(«help», string.Empty, new Action(PrintHelp)); RegisterCommand(«echo», «print arg to console», new Action(Print)); RegisterCommand(«dtf», string.Empty, new Action(() => < Print("Whatsup DTF?"); >)); logTMP.text = motd; > // Временное решение пока не создали InputSystem private void Update() < if (Input.GetKeyDown(KeyCode.Tilde) || Input.GetKeyDown(KeyCode.BackQuote)) < SetState(!isActive); >> // Парсим инпут пользователя и выполняем комманду public void ProcessInput() < if (Input.GetKeyDown(KeyCode.Tilde) || Input.GetKeyDown(KeyCode.BackQuote)) < InputField.text = InputField.text.Substring(0, InputField.text.Length - 1); return; >string rawString = InputField.text; if (rawString.Length < 1) < Focus(); return; >Print(«> » + rawString); InputProcessor processor = new InputProcessor(rawString); processor.Run(); InputField.text = «»; ExecuteCommand(processor.command, processor.arguments); Focus(); > // Метод, который выполняет комманду и отлавливает ошибки public void ExecuteCommand(string cmdName, object[] args) < Command cmd; if (!cmds.TryGetValue(cmdName, out cmd)) < PrintError("Command not found."); return; >try < cmd.function.DynamicInvoke(args); >catch (System.Reflection.TargetParameterCountException ex) < PrintError("Incorrect number of arguments"); >> // Коллбек для перехвата сообщений от встроенного в юнити логгера public void HandleLog(string logString, string stackTrace, LogType type) < Print(logString); >public void SetState(bool state) < isActive = state; foreach (Transform child in transform) child.gameObject.SetActive(isActive); if (isActive) Focus(); >public void Focus() < InputField.ActivateInputField(); >> >

Класс Console имеет ссылку на себя в статической переменной instance. Есть статические методы ReginsterCommand\UnregisterCommand, позволяющие мне регистрировать\удалять команды из любой точки проекта.

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

Обработка ввода

Дальше нам нужно обрабатывать данные, которые пользователь вводит в консоль. По факту мы получаем String который нам нужно распарсить, вырвав оттуда название консольной команды и аргументы для её выполнения. Т.к. мы хотим иметь гибкость при объявлении команд, используя в аргументах комманды не только строки, но и другие объекты, нам нужно в рантайме определять тип аргумента и тайпкастить его строку в нужный тип.

Для этого мы напишем класс InputProcessor

Этот класс принимает в конструкторе строку и при вызове метода Run парсит её. Если что-либо идёт не так, то мы получаем Exception и прерываем выполнение кода.

Т.к. данный класс довольно критический, я решил покрыть его тестами ещё на стадии написания. Благодаря тестам я всегда уверен, что он работает и это греет мне душу, а так же позволяет спать ночами.

Рекомендую сохранить эти тесты и запускать при любом апдейте процессора дабы спать спокойно как я.

Этот тест файл я не рефакторил, рекомендую это сделать при расширении функционала процессора.

Итог

Мы разработали консоль, которая позволяет нам объявлять, удалять команды, парсит, тайпкастит аргументы комманд и перехватывает события встроенного в юнити логгера. Теперь мы можем в любом компоненте объявить комманды, которые будут доступны для вызова в консоли, например:

private void OnEnable() < Console.RegisterCommand("pl_ms", "set player movement speed", new System.Action(SetSpeed)); > private void OnDisable() < Console.UnregisterCommand("pl_ms"); >public void SetSpeed(float val)

Таким незамысловатым способом мы можем отлаживать\тестировать нужный нам функционал и это будет быстрее чем мы будем отрисовывать кастомные InspectorGUI элементы.

Домашнее задание

  • Объявить кастомный exception при ошибке парсинга аргументов в InputProcessor и отлавливать его в Console. Сейчас при фейле консоль ничего не говорит о том, что ей не удалось определить тайп аргумента. Нужно это исправить.
  • Стилизация лога. Все сообщения из встроенного в юнити логгера приходят прямо в консоль как есть. Было бы круто сделать стилизацию по типу лог мессейджа.
  • Тайпкастинг boolean сейчас case-sensitive. Нужно бы это исправить и дополнить тесты.

Что дальше?

В следующей главе мы создадим InputSystem для объявления кастомных экшенов и прослушивания событий по этим экшенам.

Debug.Log

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

Ошибка внесения изменений

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *