Отправка на конкретное место в скрипте при нажатии в редакторе Unity

193
23 августа 2018, 20:00

В редакторе Unity есть удобные Debug.Log логи. Помимо того что они выводят сообщение в консоль, при клике на это сообщение тебя перенаправляет прямо в нужное место в скрипте - место, откуда был вызван этот дебаг. Но если хочется как то обернуть этот метод и добавить туда время события, например так

public static void LogError(this object obj, string message)
{     
        message += DateTime.Now.ToString();
        Debug.LogError(message);
}

То любой клик по такому дебагу в консоли перенаправляет нас на этот самый метод, на нашу "Обертку". Как сделать так, чтобы можно было дополнять метод Debug.Log и при этом сохранялась функциональность перенаправления на нужную строчку скрипта?

Answer 1

Есть пара решений для вашего вопроса:

  1. Использовать ассет Console Enhanced (free/pro)
  2. Написать своё собственное окно консоли.

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

Приведу пример реализации:

 public static void Log(object obj, string msg) {
    // берёт стактрейс вызова
    string stackTrace = UnityEngine.StackTraceUtility.ExtractStackTrace();
    // разделяем стактрейс на строки. символ '\n' олицетворяет переход на новую строку
    string[] row = stackTrace.Split('\n'); // метод Split('символ') разделяет строку на массив строк
    // берем трейс который вызвал данный метод Log. 
    // данное число "1" можно менять, в зависимости какой хотите скрипт выбрать их стактрейса
    // если полноценное консольное окно  делать, то тут уже через цикл пускать
    string trace = row[1]; //строка будет выглядеть так: "tester:ShowWarning() (at Assets\Scripts\tester.cs:26)"
    // далее попытаемся взять конкретный скрипт и открыть в редакторе скриптов
    // отрезаем всё лишнее, используя пробел между символами
    string filePathAndLine = trace.Split(' ')[2]; // строка будет выглядеть так: "Assets\Scripts\tester.cs:26)"
    // избавляемся от двоеточия
    string filePath = filePathAndLine.Split(':')[0];// строка будет выглядеть так: "Assets\Scripts\tester.cs"
    //  попутно записываем номер строки
    string lineString = filePathAndLine.Split(':')[1]; // строка будет выглядеть так: "26)" // затем необходимо удалить скобку
    // удаляем скобку. Можно было использовать Remove, но это всё зависит от вашего усмотрения
    string line = lineString.Split(')')[0];
    // парсим строку в число
    int lineNumber = int.Parse(line); 
    //загружаем объект чтобы потом его использовать
    UnityEngine.Object file = UnityEditor.AssetDatabase.LoadAssetAtPath<Object>(filePath);
    // берём в фокус скрипт (словно кликнули на него мышкой)
    UnityEditor.Selection.activeObject = file; // не обязательно
    // подсвечиваем объект желтым 
    UnityEditor.EditorGUIUtility.PingObject(file);// не обязательно
    // открываем скрипт в редакторе скриптов на определённом номере строки
    UnityEditor.AssetDatabase.OpenAsset(file, lineNumber);
}

Надеюсь вам поможет данный ответ, Удачи!

READ ALSO
Как получить данные из DataGrid WPF

Как получить данные из DataGrid WPF

Как получить все данные из DataGridА так же как удалить строку

245
Из string в byte[] (C#)

Из string в byte[] (C#)

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

244
DoubleAnimation WPF

DoubleAnimation WPF

Подскажите пожалуйста, как мне установить высоту при начальной загрузки таблицы DataGrid с использованием DoubleAnimation, чтобы она не уходила за рамки...

211
php JSON. где-то глупая ошибка

php JSON. где-то глупая ошибка

Задача: Есть JSON файл такого типа:

202