Engine & platform

Ускорьте работу программистов

THOMAS KROGH-JACOBSEN / UNITY TECHNOLOGIESProduct Marketing Core Tech
Sep 27, 2021|10 Мин
Ускорьте работу программистов
Эта веб-страница была переведена с помощью машинного перевода для вашего удобства. Мы не можем гарантировать точность или надежность переведенного контента. Если у вас есть вопросы о точности переведенного контента, обращайтесь к официальной английской версии веб-страницы.

Недавно мы опубликовали два поста в блоге: "Пять способов ускорить рабочий процесс в редакторе" и "Ускорьте работу художника". Оба поста основаны на нашей электронной книге для профессиональных разработчиков, 70+ советов по повышению производительности с Unity 2020 LTS. В этой третьей и заключительной статье серии мы сосредоточимся на рабочих процессах и функциях, которые помогают программистам успевать больше за меньшее время. Начнем с того, как можно сэкономить время составления при проведении игровых тестов.

Экономия времени компиляции с помощью настроек режима Enter Play

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

Каждый раз, когда вы входите в режим Play в редакторе, Unity выполняет два важных действия:

  • Перезагрузка домена: Unity выполняет резервное копирование, выгрузку и воссоздание состояний сценариев.
  • Перезагрузка сцены: Unity уничтожает сцену и загружает ее снова.

Эти два действия занимают все больше времени по мере усложнения сценариев и сцен.

Если вы не планируете больше вносить изменения в сценарий, воспользуйтесь настройками режима Enter Play Mode (Edit > Project Settings > Editor), чтобы сэкономить время компиляции. Unity дает вам возможность отключить перезагрузку домена, перезагрузку сцены или и то, и другое. Это позволяет ускорить вход и выход из режима Play.

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

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

Сборка - это библиотека кода C#, коллекция типов и ресурсов, которые созданы для совместной работы и образуют логическую единицу функциональности. По умолчанию Unity компилирует почти все ваши игровые скрипты в предопределенную сборку Assembly-CSharp.dll. Это хорошо подходит для небольших проектов, но у него есть и недостатки:

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

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

изображение

Вы можете разделить свой код на несколько сборок, как показано на диаграмме выше. Здесь любые изменения кода в Main не могут повлиять на код в Stuff. Кроме того, поскольку Library не зависит от других сборок, вы можете легко использовать код из Library практически в любом другом проекте.

В разделе "Сборки в .NET" содержится общая информация о сборках в C#. Дополнительные сведения об определении собственных сборок в Unity см. в документации по Unity.

Используйте шаблоны сценариев для настройки новых сценариев

Вы когда-нибудь ловили себя на том, что при создании нового сценария повторяете одни и те же изменения? Инстинктивно ли вы добавляете пространство имен или удаляете функцию события обновления? Сэкономьте несколько нажатий клавиш и создайте единообразие в команде, установив шаблон сценария в предпочтительной для вас точке отсчета.

Каждый раз, когда вы создаете новый скрипт или шейдер, Unity использует шаблон, хранящийся в

%EDITOR_PATH%\Data\Resources\ScriptTemplates:

  • Окна: C:\Program Files\Unity\Editor\Data\Resources\ScriptTemplates
  • Mac: /Applications/Hub/Editor/[version]/Unity/Unity.app/Contents/Resources/ScriptTemplates

По умолчанию используется шаблон MonoBehaviour:

81-C# Script-NewBehaviourScript.cs.txt

Также есть шаблоны для шейдеров, других скриптов поведения и определений сборок.

Для шаблонов сценариев для конкретного проекта создайте папку Assets/ScriptTemplates, а затем скопируйте шаблоны сценариев в эту папку, чтобы отменить настройки по умолчанию.

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

Оригинальный файл 81-C# Script-NewBehaviourScript.cs.txt выглядит следующим образом:

Неизвестный тип блока "codeBlock", укажите для него сериализатор в свойстве `serializers.types`.

Полезно помнить об этих двух ключевых словах:

  • #SCRIPTNAME# указывает на введенное имя файла или имя файла по умолчанию (например, NewBehaviourScript).
  • #NOTRIM# гарантирует, что скобки содержат строку пробелов.

Перезапустите Unity Editor, и ваши изменения должны появляться каждый раз, когда вы создаете пользовательское поведение MonoBehaviour.

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

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

В Unity есть множество атрибутов, которые можно поместить над классом, свойством или функцией, чтобы указать на особое поведение. В C# имена атрибутов заключены в квадратные скобки.

Вот некоторые общие атрибуты, которые вы можете добавить в свои скрипты:

Это лишь небольшой пример многочисленных атрибутов, с которыми вы можете работать. Хотите переименоватьпеременные без потери их значений? Или вызвать какую-то логику без пустого объекта GameObject? Посмотрите полный список атрибутов в Scripting API, чтобы увидеть, что возможно.

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

Нестандартные окна и инспекторы

Одна из самых мощных особенностей Unity - расширяемый редактор. Используйте Набор инструментов пользовательского интерфейса или пакет IMGUI для создания пользовательских интерфейсов редактора, таких как пользовательские окна и инспекторы.

Рабочий процесс UI Toolkit похож на стандартную веб-разработку. Используйте язык разметки UXML, вдохновленный HTML и XML, для определения пользовательских интерфейсов и многократно используемых шаблонов пользовательского интерфейса. Затем примените таблицы стилей Unity (USS), чтобы изменить визуальный стиль и поведение пользовательского интерфейса.

В качестве альтернативы можно использовать немедленный режим, IMGUI, как упоминалось выше. Сначала произойдите от базового класса Editor, а затем используйте атрибут CustomEditor .

Любое из этих решений позволяет создать пользовательский инспектор.

Пользовательский редактор изменяет отображение скрипта MyPlayer в Инспекторе:

изображение

Подробнее о том, как реализовать пользовательские сценарии редактора с помощью UI Toolkit или IMGUI, читайте в разделе Создание пользовательских интерфейсов (UI). Для быстрого знакомства с UI Toolkit посмотрите учебное пособие "Начало работы со сценариями редактора".

Упростите управление активами с помощью Addressables

Система Addressable Asset System упрощает управление активами, составляющими вашу игру. Любой актив, включая сцены, префабы, текстовые активы и так далее, может быть помечен как "адресуемый" и получить уникальное имя. Вы можете вызывать этот псевдоним из любого места.

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

изображение
В этом примере Addressables отслеживает инвентарь Prefabs.

Для начала установите пакет Addressables из менеджера пакетов и добавьте в проект несколько базовых настроек. Каждый актив или префаб в проекте должен иметь возможность быть "адресуемым". Установите флажок под именем актива в Инспекторе, чтобы присвоить ему уникальный адрес по умолчанию.


Изображение
Опция адресации включена с именем адресата по умолчанию

После маркировки соответствующие активы появятся в окне Window > Asset Management > Addressables > Groups.

изображение
В группе Addressables Groups вы можете увидеть пользовательский адрес каждого актива в сочетании с его местоположением.

Для удобства вы можете переименовать каждый адрес в отдельном поле "Адрес" актива или упростить их все сразу.

Изображение
Упростите имена адресатов с помощью одного действия в меню или переименуйте их по отдельности.
изображение
Используйте стандартный сценарий сборки для создания пакета активов Addressable Group.

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

Теперь вы можете использовать свои активы Addressable через Addressables API.

Стоит отметить, что без Addressables для создания префаба в сцене вам пришлось бы выполнить следующие действия:

Неизвестный тип блока "codeBlock", укажите для него сериализатор в свойстве `serializers.types`.

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

Используя Addressables, сделайте следующее:

Неизвестный тип блока "codeBlock", укажите для него сериализатор в свойстве `serializers.types`.

Это загружает актив по его адресной строке, то есть префаб не загружается в память до тех пор, пока не понадобится (когда мы вызовем Adressables.Instantiate внутри CreatedPrefabWithAddress). Кроме того, вы можете использовать Addressables для высокоуровневого подсчета ссылок, чтобы автоматически выгружать пакеты и связанные с ними активы, когда они больше не используются.

Рассказы из окопов оптимизации: Экономия памяти с помощью Addressables показывает пример того, как организовать группы Addressables так, чтобы они были более эффективны с точки зрения использования памяти. Тем временем на сайте Addressables: Введение в концепции Учебное пособие предлагает краткий обзор того, как система Addressable Asset System может работать в вашем проекте.

Работа с живыми играми: Облачная доставка контента с помощью Addressables

Если вы проводите живые игры, то вам стоит рассмотреть возможность использования решения Unity Cloud Content Delivery (CCD) с Addressables. Система Addressables хранит и каталогизирует игровые активы, чтобы их можно было найти и вызвать автоматически. CCD затем передает эти активы непосредственно вашим игрокам, полностью отделенные от вашего кода. Это уменьшает размер сборки и избавляет игроков от необходимости скачивать и устанавливать новые версии игры каждый раз, когда вы выпускаете обновление. Чтобы узнать больше, прочитайте этот блог об интеграции Addressables и Cloud Content Delivery .

Управление компиляцией с помощью директив препроцессора

Функция Platform Dependent Compilation позволяет разделить ваши скрипты для компиляции и выполнения кода для конкретной платформы.

Этот пример использует существующие директивы #define платформы с директивой компилятора #if :

Неизвестный тип блока "codeBlock", укажите для него сериализатор в свойстве `serializers.types`.

Используйте параметр DEVELOPMENT_BUILD #define, чтобы определить, запущен ли ваш скрипт в плеере, который был собран с опцией Development Build.

Вы можете компилировать выборочно для определенных версий Unity и/или скриптовых бэкендов и даже добавлять собственные директивы #define при тестировании в редакторе. Откройте панель Другие настройки, входящую в состав настроек проигрывателя, и перейдите к разделу Сценарий Определить символы.

изображение

Дополнительные сведения о директивах препроцессора Unity см. в разделе Компиляция в зависимости от платформы.

Используйте объекты с поддержкой сценариев (ScriptableObjects)

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

Хотите еще больше? Посмотрите "Улучшение данных с помощью ScriptablesObjects в Unity ", чтобы получить краткое представление, и узнайте, как они могут помочь в управлении сценами в "Достижение лучшего рабочего процесса сцены с помощью ScriptableObjects".

Совет по оптимизации

Для сохранения данных мы рекомендуем использовать бинарные форматы сериализации, такие как MessagePack или Protocol Buffers, а не текстовые, такие как JSON или XML. В обзорах проектов эти форматы двоичной сериализации уменьшают проблемы с памятью и производительностью, связанные с последними.

Используйте предпочитаемую вами IDE

Unity поддерживает следующие интегрированные среды разработки(IDE):

  • Visual Studio: IDE по умолчанию в Windows и macOS
  • Visual Studio Code: Windows, macOS, Linux
  • JetBrains Rider: Windows, macOS, Linux

Интеграции IDE для всех трех этих сред появляются в виде пакетов в менеджере пакетов.

изображение
Интеграции IDE в виде пакетов

При установке Unity на Windows и macOS по умолчанию устанавливается Visual Studio. Если вы хотите использовать другую IDE, просто найдите редактор в Unity > Preferences > External Tools > External Script Editor.

Rider построен на базе ReSharper и включает в себя большинство его функций. Он поддерживает отладку на C# в среде выполнения сценариев .NET 4.6 в Unity (C# 8.0). Дополнительные сведения см. в документации JetBrains по Rider для Unity.

VS Code - это бесплатный оптимизированный редактор кода с поддержкой отладки, выполнения задач и контроля версий. Обратите внимание, что при использовании VS Code для Unity требуется Mono (macOS и Linux), Visual Studio Code C# и Visual Studio Code Debugger for Unity (официально не поддерживается).

У каждой IDE есть свои достоинства. Дополнительные сведения о выборе подходящей IDE см. в разделе Поддержка интегрированной среды разработки (IDE).

Ознакомьтесь с электронной книгой, чтобы получить список быстрых клавиш, которые могут принести пользу вашему проекту, и посмотрите советы и рекомендации Visual Studio для повышения производительности, чтобы узнать, как улучшить рабочий процесс с Visual Studio.

Хотите познакомиться с JetBrains Rider? Ознакомьтесь с разделом "Быстрый скриптинг на C# в Unity с помощью JetBrains Rider" или этими советами по использованию JetBrains Rider в качестве редактора кода.

Отладка в режиме воспроизведения

Unity Debugger позволяет отлаживать код на C#, пока Unity Entity находится в режиме игры. Вы можете установить точки останова в редакторе кода, чтобы проверить состояние кода сценария и его текущих переменных во время выполнения.

Перейдите в правую нижнюю часть строки состояния редактора Unity, чтобы установить режим оптимизации кода на Debug. Вы также можете изменить этот режим при запуске в Edit > Preferences > General > Code Optimization On Startup.

изображение
Режим отладки

В редакторе кода установите точку останова в том месте, где отладчик должен приостановить выполнение. Просто щелкните левой кнопкой мыши по области, где нужно переключить точку останова (или щелкните правой кнопкой мыши, чтобы открыть контекстное меню для других опций). Рядом с номером выделенной строки появится красный кружок (см. рисунок ниже).

изображение
изображение
Переключение точки останова

Выберите Attach to Unity в редакторе кода, а затем запустите проект в редакторе Unity.

изображение
Присоединение отладчика к Unity

В режиме Play приложение приостановится в точке останова, что даст вам время проверить переменные и исследовать любое непредвиденное поведение.

изображение
Отладочные переменные

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

изображение
Элементы управления отладкой: Продолжайте выполнение, переступайте, входите и выходите

Используйте элементы управления Continue Execution, Step Over, Step Into и Step Out для навигации по потоку управления.

изображение
Управление отладкой: Остановить

Нажмите Stop, чтобы прекратить отладку и возобновить выполнение в редакторе.

Вы можете отлаживать код сценария и в Unity Player. Просто убедитесь, что в File > Build Settings перед сборкой проигрывателя включены Development Build и Script Debugging. Установите флажок Wait for Managed Debugger, чтобы ждать отладчика до того, как Player выполнит любой код сценария. Чтобы прикрепить редактор кода к Unity Player, выберите IP-адрес (или имя машины) и порт вашего Player. Затем продолжите работу в Visual Studio с опцией Attach To Unity.

Дополнительные советы по отладке

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

1. Приостановите выполнение с помощью Debug.Break. Это удобно для проверки определенных значений в Инспекторе, когда приложение сложно приостановить вручную.

2. Вы должны быть знакомы с Debug.Log, Debug.LogWarningи Debug.LogError для печати консольных сообщений. Также удобно использовать Debug.Assertкоторый подтверждает условие и при неудаче записывает в журнал ошибку. Заметьте, однако, что это работает только в том случае, если определен символ UNITY_ASSERTIONS. Ведите журнал сообщений, предупреждений и ошибок в консоли.

изображение
Ведите журнал сообщений, предупреждений и ошибок в консоли.

3. При использовании Debug.Logвы можете передать объект в качестве контекста. Если вы нажмете на сообщение в консоли, Unity выделит GameObject в окне Hierarchy.

4. Используйте Rich Text для разметки вашего Debug.Log утверждения. Это поможет вам улучшить отчеты об ошибках в консоли.

5. Unity не отделяет автоматически Debug API протоколирования из сборок, не связанных с разработкой. Оберните вызовы журнала отладки в пользовательские методы и украсьте их атрибутом [Conditional]. Чтобы скомпилировать отладочные журналы все сразу, удалите соответствующий символ Scripting Define Symbol из настроек игрока. Это идентично обертыванию их в блоки препроцессора #if... #endif. Подробнее см. в этом руководстве по общей оптимизации.

6. Проблемы с физикой? Debug.DrawLine и Debug.DrawRay могут помочь вам визуализировать кастинг лучей.

изображение
Debug.DrawLine

1. Если вы хотите, чтобы код выполнялся только при включенной функции Development Build, проверьте, включен ли Debug.isDebugBuild возвращает true.

2. Используйте Application.SetStackTraceLogTypeили эквивалентные флажки в Настройках игрока, чтобы решить, какие сообщения журнала должны включать трассировку стека. Трассировка стека может быть полезной, но она медленная и генерирует мусор.

изображение
Настройте запись журнала консоли в соответствии с вашими предпочтениями

По умолчанию в записи журнала консоли отображается две строки. Для улучшения читаемости можно сократить их до одной строки. Как это сделать, смотрите ниже.

Также можно использовать больше строк для более длинных записей.

изображение
Параметры записи журнала консоли
Настройка состояния компилятора

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

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

Неизвестный тип блока "codeBlock", укажите для него сериализатор в свойстве `serializers.types`.

Контроль версий

Unity имеет интеграцию с двумя системами контроля версий (VCS): Perforce и Plastic SCM. Чтобы установить серверы Perforce или Plastic SCM для проекта Unity, перейдите в раздел Настройки проекта > Редактор. Настройте сервер (и учетные данные пользователя для Perforce) в разделе Контроль версий.

изображение
Настройте проект на использование контроля версий.

Команды на Unity могут бесплатно использовать Plastic SCM Cloud Edition для хранения до 5 ГБ и максимум трех пользователей. Используя Plastic SCM для Unity, вы можете синхронизировать свои изменения с работами товарищей по команде и просматривать историю проекта, не выходя из Unity. О некоторых последних обновлениях Plastic SCM читайте здесь.

Вы также можете использовать внешнюю систему, например Git, включая Git LFS (Large File Support) для более эффективного контроля версий больших активов, таких как графика и звуковые ресурсы. Для дополнительного удобства работы с хостингом GitHub установите плагин GitHub for Unity. Это расширение с открытым исходным кодом позволяет просматривать историю проектов, экспериментировать в ветках, фиксировать изменения и отправлять код на GitHub - и все это в Unity.

Unity поддерживает файл .gitignore. Это поможет вам решить, что должно и что не должно попадать в Git-репозиторий, а затем обеспечить соблюдение этих правил.

изображение
Расширение GitHub для Unity

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

Скачайте новую электронную книгу о продуктивности

Ознакомьтесь с первыми двумя статьями из этой серии: "5 способов ускорить рабочий процесс в редакторе" и "Ускорение рабочего процесса художника". Вы также можете скачать бесплатное руководство70+ советов по повышению производительности с Unity 2020 LTS , в котором все советы собраны в одной практичной электронной книге.

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