Версии
Вы можете установить разные версии редактора в разные каталоги. Тем не менее, убедитесь что вы делаете резервные копии проектов, т. они могут обновиться до более новых версий, и вы не сможете открыть их в более старых версиях Unity. Для дальнейшей информации см. установка нескольких версий.
Лицензии дополнений подходят только для версий Unity c такой же основной версией, например 3. х и 4. Если вы обновите Unity внутри основной версии, например с 4. 0 до 4. 1, то дополнения останутся.
Активация
Интернет активация — предпочитаемый метод генерирования вашей лицензии Unity. Но если у вас возникают проблемы, следуйте следующим шагам:
- Отключите ваш компьютер от сети, иначе у вы можете получить ошибку “tx_id_invalid”.
- Выберите пункт Manual Activation.
- Нажмите на Save License Request.
- Выберите доступную папку для сохранения, например папку Downloads.
- В поле файла нажмите Browse и выберите сохранённый licence request file.
- Выберите необходимый тип лицензии для Unity и заполните запрашиваемую информацию.
- Нажмите Download License и сохраните файл.
- Вернитесь в Unity и выберите Manual Activation если придётся.
- Кликните на Read License и выберите загруженный файл лицензии.
Не удаётся запустить
Если при запуске Unity сразу же падает, то в первую очередь убедитесь, что ваш компьютер соответствует минимальным системным требованиям. И не забудьте обновить аудио драйвера и драйвера видеокарты.
- Содержимое пакета Unity.app
- /Library/Application Support/Unity
- ~/Library/Logs/Unity
Некоторые пользователи испытывали затруднения, когда использовали жёсткие диски, форматированные с не нативными разделами и использовали определённые программы для переноса данных между устройствами хранения.
Шрифты
Повреждённые шрифты могут вызвать падение Unity. Вы можете найти повреждённые файлы при помощи следующих шагов:
- Откройте каталог с шрифтами на вашем компьютере, расположенный в папке “Windows”.
- Выберите “Details” (Таблица) в меню “View” (Вид).
- Проверьте пункт “Size (Размер)” на наличие шрифтов с размером “0”, указывающий на проблемный файл.
- Удалите повреждённые файлы и переустановите их.
- Запустите приложение Font Book.
- Выберите все шрифты.
- Откройте меню “File” (Файл) и выберите “Valiadte Fonts” (Проверить шрифты). Проблемные шрифты будут помечены как нерабочие.
- Удалите повреждённые файлы и переустановите их.
- Ресурсы системы могут быть ограничены, например, при работе в виртуальной машине. Используйте Диспетчер задач, чтобы найти процессы потребляющие много памяти.
Испорченный проект или установка Unity
Unity может попытаться открыть повреждённый проект, это также касается и стандартного тестового проекта. В таком случае переименуйте или переместите папку проекта. После того, как Unity нормально запустится, вы можете вернуть папку проекта в исходное состояние, если захотите.
В случае повреждения копии Unity, вам может понадобится переустановить Unity — смотрите инструкции ниже.
В Windows могут возникнуть проблемы, вроде ошибок при установке, повреждения регистра, конфликты и т. Например, ошибка 0xC0000005 означает, что программа попыталась получить доступ к той памяти, к которой не должна. Если вы недавно устанавливали новое оборудование или драйвера, то попробуйте извлечь и заменить оборудование, чтобы узнать, не из-за него ли появляется проблема. Используйте программы для диагностики и проверьте информацию в центре помощи операционной системы.
Производительность и падения
Если редактор работает медленно или падает, в частности на стадии сборки, это может происходить из-за того, что все доступные системные ресурсы уже используются. Закройте все другие приложения при сборке проекта. Почистите систему используя специализированные утилиты и сверьтесь с диспетчером задач (Windows) или Activity Monitor (MacOS), чтобы проверить, нет ли в системе процессов, использующих очень много ресурсов, например, памяти. Иногда антивирусы могут замедлять или даже блокировать файловую систему в процессе сканирования.
Утрата проекта
Есть много различных факторов, способных уничтожить проект. Вам следует постоянно делать резервные копии ваших проектов для предотвращения несчастных случаев. В MacOS, активируйте TimeMachine используя внешний жёсткий диск, используемый только для этой цели. После утери вы можете попробовать использовать какую-нибудь утилиту для восстановления файлов, но иногда файлы оказываются невосстановимыми.
Переустановка
Следуйте этим шагам для переустановки редактора:
- Удалите Unity. Если вы используете MacOS, перетащите приложение Unity в корзину.
- Удалите следующие файлы, если они есть:
Windows:
- Windows:
- MacOS:
/Library/Application Support/Unity/
- /Library/Application Support/Unity/
Диспетчер пакетов отображает индикаторы ошибок в окне диспетчера пакетов при возникновении проблем:
- Сообщения об ошибках, которые появляются в строке состояния, указывают на то, что диспетчер пакетов обнаружил проблему, не связанную с конкретным пакетом. Например, если диспетчер пакетов не может получить доступ к серверу реестра пакетов, он отображает это сообщение в строке состояния:
Сообщение об ошибке сети
Если ваша сеть не может подключиться к серверу реестра пакетов, возможно, это связано с проблемой подключения к сети. Когда вы или ваш системный администратор исправляете сетевую ошибку, строка состояния очищается.Если ваше сетевое соединение работает, но вы не вошли в свою учетную запись Unity, диспетчер пакетов не не отображать пакеты Asset Store. При попытке использовать контекст My Assets диспетчер пакетов отображает ошибку в строке состояния:Вышел из учетной записи Unity
- Проблемы, связанные с пакетомЕсли при загрузке или установке определенного пакета возникает проблема (например, при определении версий пакета для загрузки), значок ошибки () отображается в списке пакетов рядом со скомпрометированным пакетом (A). Чтобы выяснить, в чем проблема, откройте представление сведений о скомпрометированном пакете и просмотрите подробное сообщение об ошибке (B):
Сообщение об ошибке зависимости
Package Manager missing or window doesn’t open
Окно диспетчера пакетов может быть перемещено за пределы экрана или скрыто другим окном. Когда это происходит, похоже, что окно диспетчера пакетов не открылось. В этом случае вы можете попытаться сбросить макет окна (Window > Layouts > Default) и снова открыть окно диспетчера пакетов.
Если окно диспетчера пакетов по-прежнему не отображается, проверьте окно консоли Unityокно редактора Unity, в котором отображаются ошибки, предупреждения и другие сообщения, созданные Unity или вашими собственными сценариями. Подробнее
См. в Словарь:
Это сообщение об ошибке указывает на то, что ваш файл manifest. json имеет неверный формат. Он также сообщает вам номер строки, в которой диспетчеру пакетов не удалось проанализировать файл, чтобы вы могли исправить ошибку JSON. Существует ряд онлайн-валидаторов, которые вы можете использовать, чтобы попытаться решить проблему. Как только вы сохраните исправленный файл, Unity перезагрузит окно диспетчера пакетов.
Если вы выполнили обновление с ранней версии редактора Unity, могут возникнуть другие проблемы с вашим манифестом пакетаКаждый пакет имеет манифест, который предоставляет информацию о пакете диспетчеру пакетов. Манифест содержит такую информацию, как имя пакета, его версия, описание для пользователей, зависимости от других пакетов (если есть) и другие подробности. Дополнительная информация
См. в файле Словарь:
- В версии 2019.3 ваш файл manifest.json не должен содержать никаких ссылок на пакет com.unity.package-manager-ui. Вы можете либо сбросить конфигурацию пакета вашего проекта, либо удалить следующую строку из списка зависимостей манифеста:
«com.unity.package-manager-ui»: «2.1.1»,
- Проверьте, есть ли в вашем манифесте проектакаждый проект Unity манифест проекта , который действует как точка входа для диспетчера пакетов. Этот файл должен находиться в каталоге /Packages. Диспетчер пакетов использует его для настройки многих вещей, включая список зависимостей для этого проекта, а также любой репозиторий пакетов для запроса пакетов. Дополнительная информация
См. Словарь функция «exclude» в качестве пакетной версии. Это устаревшее значение для зависимостей
См. в свойстве Словарь. Если вы найдете такие строки, удалите всю строку. Диспетчер пакетов устанавливает только те пакеты, которые явно включены в ваш проект как зависимость, поэтому после удаления этой записи диспетчер пакетов игнорирует пакет и не устанавливает его.
Если диспетчер пакетов по-прежнему не загружается, следуйте инструкциям в разделах Нераспознанные пакеты и Сброс конфигурации пакета вашего проекта.
Problems after upgrading Unity to new version
При обновлении проекта до более новой версии Unity диспетчер пакетов автоматически обновляет несовместимые пакеты до более новых совместимых версий. Однако, если ваш пакет не компилируется, диспетчер пакетов отображает сообщения об ошибках в консоли.
Чтобы исправить эти сообщения, прочтите сообщения об ошибках и устраните все возможные проблемы. Например, в пакете может отсутствовать зависимость от другого пакета или версии. В этом случае вы можете попробовать установить пакет самостоятельно.
Вы также можете попробовать следующую последовательность решений, пока не найдете то, что работает:
- Создайте резервную копию и удалите папку Packages в своем проекте.
- Создайте резервную копию, а затем удалите исходные коды пакетов в папке Packages вашего проекта, оставив только файл manifest.json. Затем попробуйте перезагрузить проект.
- В крайнем случае вы можете сбросить свой проект до пакета по умолчаниюUnity автоматически предварительно устанавливает выбранное количество пакетов по умолчанию (например, Analytics Library, Unity Timeline и т. д.) при создании нового проекта. Он отличается от встроенного пакета тем, что его не нужно устанавливать, и отличается от встроенного пакета тем, что расширяет возможности Unity, а не позволяет включать или отключить их.
Просмотрите в конфигурации Словарь и добавляйте обратно пакеты по одному, пока не заработает.
Resetting your project’s package configuration
Если в проекте слишком много проблем с пакетами, вы можете сбросить проект до конфигурации пакетов по умолчанию для редакторской версии Unity. Эта операция сбрасывает все пакеты в вашем проекте. Это может не устранить источник проблемы, но может помочь вам понять, в чем проблема.
Примечание. Вы не можете отменить сброс конфигурации пакета, поэтому сначала создайте резервную копию файла manifest. json или убедитесь, что ваш проект находится под управлением исходного кода. Вы также можете принять дополнительные меры предосторожности, клонировать свой проект и протестировать операцию на клоне, прежде чем продолжить.
Чтобы вернуться к конфигурации пакета по умолчанию, выберите Reset Packages to defaults в меню Help.
Resetting a clone of your project
Вы также можете протестировать возврат к пакетам по умолчанию, прежде чем вносить окончательные изменения:
- Клонируйте свой проект, скопировав папку проекта и переименовав ее, чтобы ее было легко найти (например, если ваш проект называется MyProject, вы можно использовать что-то вроде clone_MyProject).
- Загрузите новый клонированный проект.
- В меню «Help» выберите Reset Packages to defaults.В зависимости от размера вашего проекта это может занять несколько минут.
- Убедитесь, что он успешно сбросил пакеты. Если это так, вы можете безопасно выполнить операцию в исходном проекте.
Package installation fails
Если вы пытаетесь установить новый пакет из реестра, и он не работает, это может быть связано с проблемами с правами доступа.
У вас должны быть полные права доступа к папке кеша:
Это может быть проблема с сетью. Проверьте настройки брандмауэра и прокси-сервера.
Иногда учреждения, такие как школы, государственные учреждения или защищенные сетью рабочие места, настраивают прокси-серверы для управления трафиком между сетью и Интернетом и используют собственные сертификаты сервера, которые не распознаются Unity или диспетчером пакетов. Поговорите со своим сетевым администратором.
Packages not recognized
Если вы видите много ошибок компиляции, это может означать, что Unity не распознает пакеты в вашем существующем проекте. В этом случае вам может не хватать компонента. NET.
- Загрузите и установите Visual Studio 2017 версии 15.9.0 или выше с рабочей нагрузкой .NET Core cross-platform development workload, выбранной в разделе Other Toolsets.
- Загрузите и установите компонент .NET SDK v2.2.101.
- Загрузите и установите компонент .NET SDK v2.2.101.
- Установите все рекомендуемые обновления в Visual Studio
- Используйте homebrew для приготовления и установки mono:
brew update
brew install mono # optional
brew upgrade mono - При необходимости удалите папку Library/obj/temp в своем проекте и перезапустите Unity.
- Если вы по-прежнему испытываете трудности, попробуйте также перезагрузить компьютер.
No ‘git’ executable was found
Если вы попытаетесь установить пакет с URL-адреса git, появится сообщение, похожее на это:
Command not found
Если вы пытаетесь загрузить пакет, использующий Git LFS (большое файловое хранилище), вы можете увидеть следующее сообщение об ошибке:
Error when executing git command. git-lfs filter-process: command not found.
Это указывает на то, что Git LFS, вероятно, не установлен на вашем компьютере. Чтобы убедиться, вы можете проверить это в командной строке:
git lfs —version
Если вы видите что-то подобное, Git LFS установлен:
git-lfs/2. 0 (GitHub; darwin amd64; go 1
В противном случае вы можете установить его, выполнив Bitbucket GitHub.
Repository not found
Если указать несуществующее расположение, в Консоли Unity появится сообщение, похожее на это:
Проверьте правописание. Чтобы убедиться, что вы используете правильный URL-адрес, перейдите на страницу репозитория и скопируйте URL-адрес из кнопки «Клонировать»:
Где скопировать URL на GitHub (A) и GitLab (B)
Нажмите кнопку справа от URL-адреса на GitHub (A) или GitLab (B), чтобы скопировать URL-адрес в буфер обмена.
Если расположение репозитория верное, может быть другая проблема с URL-адресом:
Terminal prompts disabled
Если вы пытаетесь установить пакет из частного репозитория, для которого требуется аутентификация, в консоли Unity появится сообщение, похожее на это:
Решения для HTTPS
- Используйте диспетчер учетных данных (Git Credential-Manager для Windows или OSXKeyChain). Менеджеры учетных данных обрабатывают отправку пароля без использования терминала или командной строки.
- Используйте git-credential-Storage из терминала или командная строка. Затем запустите Hub с того же терминала, чтобы у Unity был доступ к кэшированным или сохраненным учетным данным.
- Вместо этого используйте SSH для аутентификации. Если вы настроили свой SSH-ключ без парольной фразы, диспетчеру пакетов не нужно его расшифровывать для аутентификации на сервере Git. Если вы решите использовать парольную фразу для дополнительной безопасности, вы все равно можете обойти проблему аутентификации, используя ssh-agent в любой из macOS или Windows.
Решения для SSH
Если вы используете протокол SSH для установки пакета по URL-адресу Git, вы можете получить ошибку аутентификации от Git. Обычно это происходит, когда вы настраиваете закрытый ключ SSH на локальном компьютере, который защищен парольной фразой.
Решение этой проблемы заключается в настройке агента SSH, который может разблокировать ваш ключ SSH для аутентификации в диспетчере пакетов от вашего имени. Следуйте инструкциям в разделе, соответствующем вашей операционной системе:
- Настройка OpenSSH для Windows
- Добавление ключей SSH в агент SSH для macOS
Настройка OpenSSH для Windows
Собственная версия OpenSSH для Windows ssh-agent работает лучше, чем версия, доступная по умолчанию с Git для Windows. Эта процедура объясняет, как настроить клиент OpenSSH и добавить свой ключ в его ssh-агент. Если вы используете Git для Windows, вы также можете отдать приоритет собственному Windows OpenSSH над агентом Git для Windows SSH:
- Убедитесь, что клиент OpenSSH установлен, выполнив поиск в окне настроек Windows Optional features (Start > Settings, затем найдите «Optional features»). Это относится к Windows 10+.
- Проверьте переменную среды %PATH%, чтобы убедиться, что отображается собственное расположение Windows OpenSSH (например, C:WINDOWSSystem32 OpenSSH).Примечание. Если вы уже используете Git для Windows, убедитесь, что собственное расположение Windows OpenSSH указано перед расположением Git для Windows SSH в вашем %PATH% переменная. Это гарантирует, что Windows использует собственный агент Windows OpenSSH вместо агента Git для Windows SSH.
- # Import the key
ssh-add
Чтобы использовать другой ключ, вы можете указать его в качестве аргумента:# Set the ssh-agent service to start automatically and manually start it now
ssh-add Если вы не можете вспомнить название своего ключа, вы можете попросить агента перечислить их:ssh-add -l
Добавление ключей SSH в агент SSH для macOS
Используйте следующую команду, чтобы добавить ключи SSH в ssh-agent, работающий на вашей macOS. система:
ssh-add -K ~/. ssh/
После выполнения этой команды терминал запрашивает пароль для разблокировки ключа SSH, а затем добавляет его в цепочку ключей macOS. Однако после перезагрузки системы все ключи, хранящиеся в ssh-agent, сбрасываются.
Чтобы предотвратить повторный ввод пароля после перезагрузки системы, откройте файл ~/. ssh/config (или создайте его, если вы его не найдете) и добавьте следующее:
Host *
UseKeychain yes
AddKeysToAgent yes
IdentityFile ~/. ssh/
Перезагрузите компьютер, чтобы применить эти изменения.
Can’t update Git version
Если вы пытаетесь обновить свою зависимость Git, диспетчер пакетов получает зависимости Git непосредственно из репозитория Git, а не из реестр пакетов. Зависимости Git используют ссылку URL-адреса Git вместо версии, и нет никаких гарантий относительно качества, стабильности, достоверности пакета или даже того, соответствует ли версия, указанная в его файле package. json. Правила семантического управления версиями в отношении официально опубликованных выпусков этого пакета. Дополнительная информация
Посмотрите в Словарь более новую версию из репозитория, но она не работает, вероятно, это связано с тем, что ваша зависимость от Git заблокирована. Если вы хотите обновить свою зависимость Git до более новой версии из репозитория, используйте кнопку Добавить пакет из URL-адреса git и введите URL-адрес Git. Дополнительные сведения см. в разделе Заблокированные зависимости Git.
‘Failed to parse Http response’ in My Assets context
Если вы видите следующее сообщение в окне консоли при попытке загрузить пакет Asset Store, возможно, возникла проблема с кешем Asset Store:
Чтобы решить эту проблему, удалите все загруженные ресурсы из каталога пакетов Asset Store, а затем повторите попытку загрузки ресурсов.
Предупреждение. Если ваш проект содержит много данных об объектах, повторная загрузка может занять много времени и трафика.
Missing ‘My Registries’ in the Package Manager window
Не все поставщики реестра совместимы с диспетчером пакетов Unity. Если добавленный вами сервер реестра пакетов не реализует конечные точки /-/v1/search или /-/all, ваш реестр с заданной областью не совместим с диспетчером пакетов Unity и не отображается в контексте My Registries в окне диспетчера пакетов.
Во время сборки, если возникает много ошибок, связанных с отсутствующим поведением, UnityLinker может по ошибке удалить компонент, который, по его мнению, не указан. Часто это происходит из-за слишком агрессивного уровня зачистки. Например, если у вас есть префабтип актива, который позволяет хранить GameObject вместе с компонентами и свойствами. Префаб действует как шаблон, из которого вы можете создавать новые экземпляры объектов на сцене. Подробнее
См. в Словарь в AssetBundle, который ссылается на компонент SpriteShape в пакете 2D SpriteShape. , объект может отсутствовать и вызывать предупреждения компилятора.
Чтобы исправить это, вы можете либо понизить уровень разделения для UnityLinker, либо объявить сборки пакета в файле link. xml, чтобы предотвратить их удаление:
Дополнительную информацию об уровнях удаления и UnityLinker см. в разделе Управляемое удаление кода.
Большое количество ошибок с библиотеками после обновления
2020, 01:38. Показов 670. Ответов 2
Здравствуйте! Я новичок в разработке игр на Unity и случайно переключился, но на новую демо версию движка 2020 года. Я даже не догадывался, какие могут из-за этого возникнуть проблемы) После того, как я попытался собрать и запустить свою игру на обновлённом движке, компилятор мне выдал чуть больше 200 ошибок! В интернете я ничего не нашёл, пытался откатить проект обратно на версию 2019 года. Я сделал это, но компилятор все равно выдаёт 16 ошибок (ну хоть не 200+). В основном это ошибки CS1061, одна CS0117, и почти все они связаны с «collab». Есть также 2 предупреждения DC0032. Я оставил скриншоты некоторых из них (чтобы полностью открыть скрин нажмите пкм на картинку -> открыть в новой вкладке). Очень надеюсь на вашу помощь)
P. папку librery я уже пробовал удалять
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
DOTS
Кадр из презентации DOTS. На картинке изображен спальный район Москвы через 20 лет.
В данный момент Unity активно переходит на новый стек технологий под названием DOTS. Транзит сопровождается лозунгом «Производительность по умолчанию» и идеей того, что С# может быть таким же быстрым как C++ у UnrealEngine и других движков. Главные фронтмены данного действа это Entities, Jobs и Burst.
Теория
Если вы уже знаете, что из себя представляет пакет DOTS, тогда можете смело переходить к пункту Имплементация.
Entities представляет из себя реализацию популярного в игровой индустрии паттерна ECS. ECS это паттерн, где код делится на сущности к которым добавляются компоненты с данными, состоянием компонентов у сущностей управляют системы, которые эффективно перебирают сущности с нужными им компонентами и изменяют данные компонентов по надобности.
К примеру, у вас игра — шутер, в которой снаряд это сущность с компонентом Bullet в котором хранятся данные о расположении снаряда. Есть система движения снарядов, которая перебирает все сущности с компонентом Bullet и двигает их вперед, а есть система рендера снарядов, которая перебирает все сущности со снарядом Bullet и рендерит их.
Реализаций ECS есть великое множество, но в основном, используют следующие способы оптимизации перебора сущностей:
- Хранение компонентов эффективно в памяти в соответствии с архетипом существа к которому они привязаны. Архетип это уникальное сочетание компонентов у существа. В случае Unity, компоненты хранятся в чанках по 16кб в соответствии с архетипом. Выходит, что чанки с компонентами хранятся друг за другом в памяти.
- Распараллеливание обработки существ системой. Тут всё очевидно, двигать 50 тысяч снарядов в каком-то шутере быстрее в 32х потоках одновременно. От программиста не требуется особых телодвижений для управления многопоточностью, потенциально ECS может эффективно управлять потоками самостоятельно. В Unity роль управления потоками делегирована фреймворку Jobs.
Такой паттерн хорошо подходит сложным играм, в которых есть очень много сущностей которые надо очень часто перебирать (к примеру ММО). Вдобавок, ECS управляет зависимостями, позволяя игре становиться все больше и больше без последствий. Но есть и обратная сторона медали, ECS плохо подходит играм, в которых мало сущностей и их не надо часто перебирать (например 99% мобильного рынка).
Jobs это реализация безопасной мультипоточности путем создания экземпляра «работы». Работу можно запланировать, получить ее обработчик и выполнить ее. Также работу можно запланировать после другой работы, или вместе с другими работами. Таким образом создаются целые цепи последовательных задач. Сами задачи выполняются сразу в нескольких потоках. Например, вам надо умножить все числа массива А с вместительностью в 100 элементов и положить их в массив B. Это можно сделать в десяти потоках, в каждом из них задача будет обрабатывать по 10 элементов.
Burst это компилятор, который транслирует IL байткод в оптимизированный нативный код с помощью LLVM. В основном, используется для компиляции работ с Jobs.
Имплементация
Теперь, когда вы понимаете что из себя представляет новый стек технологий теоретически, можно поговорить об имплементации. А она, как всегда, не выдержала столкновения с реальностью.
Начнем с того, как же команда Unity хочет сделать C# таким же быстрым, как C++, а именно:
- Создали новый компилятор для Работ с векторизацией и intrinsics (разве что без блекджека).
- Создали нессылочные альтернативы массиву, списку, очереди и т.д которые дружат с Burst’ом. Особенность в том, что эти контейнеры надо аллоцировать и после их жизненного цикла освобождать, иначе утечка. Причем, аллоцировать надо не абы как, а с правильными лейблами (Persistent/Temp/TempJob).
- Ввели в использование указатели на списки и указатели на функции. Также вам может понадобиться использовать Malloc, MemMove, MemCpy и подобные brand-new функции.
Я думаю, вы уже поняли к чему я клоню. Они решили, что лучший способ сделать сишарп таким же быстрым как и плюсы, это сделать из сишарпа плюсы! *занавес, бурные овации, публика в шоке*
Ладно указатели, ладно Dispose у контейнеров, но когда вы начали писать новый компилятор для языка, можно же было что-то заподозрить! Пытаться уже третий год реализовать стек технологий на языке, который не подходит вашему стеку, и при этом переделывать* язык, это же сумасшествие!
Ещё один пример несовместимости DOTS и C# это Jobs с Работой IJobChunk и производными. Для того, чтобы проитерировать 3 компонента c помощью IJobChunk, вам надо 43 строки кода. Ситуацию могли бы спасти макросы, но они в C# предательски отсутствуют!
Следующая проблема нового стека Unity это недостаток многих функций, которые, иногда, могут вам пригодиться в создании игры, например:
- Звук. Версия пакета для звука 0.1.0-preview17 и за 3 года он так и не обновлялся.
- Интерфейс. Тут всё проще, пакета для интерфейса с поддержкой Entities просто нет.
- 2д. Существует com.unity.2d.entities, но он создан для Project Tiny и работает в общем-то только с ним, о Project Tiny тоже позже.
- Анимации. Пакет тоже существует, версия 0.9.0-preview.6, в теории использование возможно, на практике не очень.
- Всё элементы движка, которые не требуют очевидного отдельного пакета. Свет, камера, партиклы и т.д, всеми ими нельзя управлять через Entities, что угодно делайте. Можете создавать псевдо-сущность с компонентом, к примеру, камеры, и отдельной системой в главном потоке синхронизировать поля между MonoBehaviour камерой и вашей псевдо-камерой, можете другие костыли городить. За 3 года решения от Unity так и нет.
*под переделыванием языка я подразумеваю минимизирование использования ссылочных объектов и, как следствие, кучи путем создания кастомных аллокаторов, компиляторов которые не поддерживают кучу и т.
Проблемы
Предположим, что отсутствующие пакеты можно дописать, а текущую имплементацию можно ещё починить (в конце концов, можно переписать Roslyn!). Но проблемы самой DOTS как концепции, быстро решить не выйдет.
DOTS по умолчанию сложен. ECS требует полного понимания, как он работает, программисту надо знать на что влияет Read/Write доступ к компонентам, что такое Sync point и как сократить их количество, зачем нужен ECB, WriteGroup, гибридные компоненты и многое, многое другое. Также есть Jobs со своими контейнерами на указателях и такой же морокой с Read/Write доступом, Burst с миллиардом приспособлений для оптимизиации и примерами в документации из ассемблера.
Такая сложность явно не идёт на руку движку, одна из основных преимуществ которого простота. Unity занял свое место на рынке как «движок для дизайнеров, а не программистов», на нём делают Cuphead, Ori, Hollow Knight и другие игры которые не Factorio по сложности исполнения и требуемой оптимизации. У Unity занят рынок мобильных игр, маленьких кросс-платформенных инди игр, игр уровня «мы с парнями другие движки не знали, пришлось на этом пилить» (таким образом получаются Rust и Tarkov), в общем, идиллия. ААА игры не будут делать на Unity даже с полностью реализованным DOTS, ведь для них уже пишут отдельные движки на основе опенсоурса (UE) или вообще с нуля, а сложные инди игры делают энтузиасты на своих микро-движках, фреймворках или на том же UE.
В общем, плюсы от перехода на DOTS неочевидны, а минусы из-за нехватки ресурсов компании на поддержку и развития старых решений из уже уходящей эры MonoBehaviour присутствуют.
Project Tiny
В дополнение к выше написанному, хочу упомянуть Project Tiny. Это этакий набор мини-фреймворков для DOTS, которые должны помочь в разработке «Instant games» или, если выражаться русским языком, сделанные за 2 недели Егором из 9Б гипер казуальные игры типа тривряд. Также для Project Tiny команда Unity написала новую среду выполнения DOTS Runtime, вот вам документация (кстати в гугл доках, такого я не видел). Опять пересказывать то, что они пытаются переделать C#, смысла я не вижу, просто обозначу, что факт существования данного набора пакетов подтверждает то, что они хотят именно переделать движок с новым стеком DOTS, что в свою очередь, делает проблемы, описанные выше, ещё более значимыми.
Unity, но без DOTS
Скриншот редактора Unity. Если вы думаете, что автор не умеет удобно расставлять окна — вы правы.
Под данным заголовком я хочу описать проблемы как старого архитектурного решения Unity, так и самого Unity как движка.
MonoBehaviour
Начнем с основного старого архитектурного решения — MonoBehaviour. Mono потому что на C#, раньше ещё был, к примеру, JSBehaviour, но все языки кроме C# в Unity бесславно умерли, так и остался один единственный MonoBehaviour.
Если кратко излагаться, MonoBehaviour представляет из себя базовый класс для скриптов в Unity, унаследованные от него классы можно добавить на любой объект в сцене как компоненты, а публичные поля таких классов красивенько отображаются в редакторе. Код пишется в методах со спец. именем, которые ядро движка на С++ вызывает самостоятельно, такие методы называются Messages, их у MonoBehaviour целая куча, от обычных Start и Update до OnCollisionEnter и OnApplicationQuit.
Такое решение довольно простое в понимании и не требует вообще никаких навыков у программиста, у вас все под рукой. Для больших проектов это, естественно, никуда не годится. Тут нет какой-то внятной архитектуры, у вас логика приложения находится сразу же в структуре с данными (компоненте). MonoBehaviour почти не предоставляет никаких абстракций, не дает инструмента для управления зависимостями, методы для поиска объектов с MonoBehvaiour на сцене де факто антипаттерн из-за производительности, методы для вызова Message-методов у других MonoBehaviour ещё больше антипаттерн из-за ещё худшей производительности.
В принципе создание чего-то сложнее тривряд с активным использованием MonoBehaviour не рекомендуется, а поскольку модульность в старом Unity отсутствует как понятие, просто убрать пакет с MonoBehaviour и написать что-то свое вы, конечно, не можете. Так и живут разработчики под Unity с гайдлайнами по оптимизации, в которых рекомендуют не использовать половину функций движка.
Команда Unity давным давно забила на попытки хоть как-то развить эту систему и пофиксить проблемы с производительностью.
Разработчики Unity не умеют в UI. За 16 лет они не смогли создать пакет для адекватного интерфейса с xml/css/js и имплементировать редактор своего движка на нем. Для игр они сделали какой-то хлам с Canvas-ом и перетаскиванием панелей по иерархии сцены, а для редактора они предоставили что-то невообразимо ужасное с IMGUI на C# и рефлексией.
Спустя 16 лет они поняли, что шутки про использование штатного пакета для интерфейса Unity на форумах больше не смешные, и решили сделать новый пакет для интерфейса — UIElements (UIToolkit), с xml и css, но без js. Новый пакет для интерфейса непригоден для работы из-за отсутствия функционала у стилей. В нем нет анимаций, нет масок, нет полей для настроек выставления фона (только background-color и background-image), нет настроек шрифта и теней. Можете сравнить набор свойств у обычного CSS, и USS Unity.
Можно было бы сказать, что реализовать полный набор функций CSS движка довольно сложно, но вот Valve создали свой фреймворк Panorama с JS’ом, анимациями, масками, фоном, партиклами, сценами и многим другим. Благодаря ему, у игр Valve одни из самых лучших интерфейсов в индустрии. Понятно, что сравнивать Valve с Unity не совсем корректно, но это пример успешной реализации xml/css/js интерфейса в движке.
Декларируемая универсальность
Уже не совсем техническая, но огромная проблема Unity прошлого, настоящего и будущего. Unity старается быть универсальным, но игровой движок по природе своей не может быть универсальным. Нельзя сделать движок, который одинаково подходил бы сандбокс игре с процедурной генерацией мира, кооперативному FPS шутеру и мобильному кликеру. У разных игр разные требования к архитектуре движка, и если ваш движок это не каркас для плагинов как vim, то сделать его одинаково подходящим для всех не выйдет.
В случае с Unity это выливается в то, что ни одно отдельно взятое общее решение движка просто не подходит вашей конкретной проблеме. Как итог, вы постепенно отказываетесь от предоставленных движком решений и пишете свои, от чего попросту теряете время.
Этой проблеме, по сравнению с остальными, выделено не так много места в статье, но она фундаментальна. Именно эта проблема, скорее всего, потратит тонну вашего времени и похоронит проект, или уже похоронила. Если разработчики Unity сразу бы решили, для каких игр они делают свой движок, этой статьи бы не было.
Другое
Руководствуясь больше долгом о написании всех недочетов Unity, чем здравым смыслом, хочу отметить ещё немного мелких проблем которые не заслуживают отдельного параграфа, но заслуживают упоминание:
- Стилистика кода у биндингов Unity с префиксами m_, чрезмерным использованием internal и бесполезными комментариями наподобие «x — Left coordinate, y — Top coordinate». Пример.
- Существование авто-сериалайзера Unity который работает хуже чем любой другой из существующих в мире, я думаю что сериалайзер на конвейерах в Factorio работал бы лучше, и как минимум, поддерживал бы сериализацию словаря.
- Перезагрузка всех ресурсов с надписью «Hold on» после каждой правки кода. Команда Unity клянется что ничего не могут с этим сделать, но это нетерпимо.
- В Unity до сих пор нет поддержки C# 9, я просто напомню, что последняя версия уже C# 10. Поддержку #9 давно добавили.
- Асинхронные юнит тесты обещали, но конечно, не сделали. Приходиться создавать костыли.
Конец
- Unity. Не смотря на все минусы перечисленные выше, скорее всего для простых игр он вам подойдет.
- Godot. Сам не пробовал, по ощущениям Unity v2, но опенсоурс и не будет требовать от вас деньги и ставить свой логотип в начале.
- GameMaker: Studio. Создан для 2д игр, на нем сделали Undertale. Без подписки минимум за 10$ делать ничего не хочет.
- Microsoft XNA. Не движок, но фреймворк для создания игр на C#, больше не поддерживается (но есть форки). На нем создают довольно много разных инди игр и по сей день, одна из самых популярных это Stardew Valley.
Для средних или больших игр с 3д графикой
- Amethyst. Движок на Rust, пока без своего редактора, естественно опенсоурс. Разработка движка прекращена.
- Bevy. Конкурент предыдущего движка, можете попробовать оба.
Как было раньше и какие проблемы это повлекло
Раньше наш пайплайн сборки приложения выглядел следующим образом. В качестве сервера CI мы использовали TeamCity от JetBrains: на War Robots тогда было выделено 22 агента, которые могли выполнять скрипты сборки. Они располагались на четырех физических компьютерах-нодах. Конфигурации нод приблизительно похожи, средняя тачка имела следующие характеристики:
- OS: Windows;
- ЦП: AMD Ryzen Threadripper 1950X 16-Core Processor 3,40 ГГц;
- RAM: 128 ГБ;
- Диски: SSD не менее 1ТБ на одного агента и не более двух агентов на один диск;
Для сервера Unity Cache V1 мы использовали:
- RAM: 24 ГБ;
- Диск: 150 ГБ.
Дополнительно был установлен Mac mini для сборок на iOS. Более подробно о старом пайплайне можно прочитать здесь.
Агенты у нас запущены как служба, работающая фоново независимо от пользователя, а не как отдельное приложение. Сделано это для возможности более гибкого менеджмента непосредственно самих агентов. Кроме того, таким образом можно выделить для каждого агента отдельного юзера со своими правами и реестром. Это оказалось удобно, но породило проблему, которую оказалось не так-то просто диагностировать.
Заключалась она в том, что во время сборки Unity неожиданно начинала крешиться без особых опознавательных логов. Но небольшой ресерч в Интернете помог определить, что проблема связана с desktop heap, или кучей рабочего стола на Windows.
В чем дело? У Windows есть неочевидная настройка: чем больше запущено процессов одновременно, тем быстрее происходит переполнение кучи. И поскольку у нас параллельно запускается несколько Unity для сборки билдов, это очень сильно влияло на скорость переполнения.
Экспериментально увеличив значение HKEY_LOCAL_MACHINESystemCurrentControlSetControlSession ManagerSubSystemsWindows, креши удалось локализовать. Но с этим стоит быть аккуратнее: Microsoft не рекомендует выделять на кучу памяти больше, чем 20480 КБ:
Если вы выделяете слишком много памяти на кучи рабочего стола, может возникнуть отрицательная производительность. Поэтому мы не рекомендуем устанавливать значение более 20480 КБ.
Больше пресетов графики — дольше собирается билд. Что делать?
Как уже говорилось выше, по итогу время сборки билда выросло критически: с 40-100 минут до 3-4 часов с периодическими зависаниями импорта до 10 часов. Связано это с тем, что мы разделили текущий пресет качества графики и добавили новые. Если изначально у нас был только один пресет — Legacy, то теперь их стало четыре: Legacy, ULD (Ultra-Low Definition), LD (Low Definition) и HD (High Definition).
Разница между пресетами, слева направо: ULD, LD, HD:
В первую очередь мы решили начать искать проблему внутри кода и стали разбираться с нашими обработчиками событий преимпорта ассетов.
Экран импортера ассетов
У нас используется самописный инструмент, который позволяет применять различные настройки графики, ориентированные на маску путей ассетов. Благодаря этому во время импорта можно применять настройки к текстурам как на единичные ассеты, так и сразу на целую папку, и на выбранные директории проекта.
Кроме того, изначально у нас были дополнительные самописные импортеры, которые работали с разными типами ассетов. Преимущественно они писались для работы с шейдерами и материалами.
В какой-то момент мы поняли, что время сборки сильно растет, и для определения причины начали смотреть логи редактора и сборки. В тех логах фигурировали следующие строки:
Они не говорят ни о чем плохом — лишь показывают, что система начала хешировать ассеты для последующих действий над ними. В нашем случае проблема была в том, что такое сообщение появлялось в логе после импорта каждого пятого-десятого ассета. Полный рехеш одного ассета выполняется за минуту, так что время импорта взлетело до небес. Обычно такое происходит, когда что-то в коде вызывает AssetDatabase. Refresh() — именно из-за него перехватчики других событий зацикливаются, и Unity приходится пересчитывать весь ассет полностью.
Мы нашли все такие места — которых, конечно, оказалось немало, ведь эта функциональность нужна многим плагинам, — и обложили их трейсами. Затем мы нашли, где происходили рефреши — это оказалась подписка на AssetPostprocessor. OnPostprocessAllAssets. Так мы выяснили, что комбинация нашего скрипта и GPGSUpgrader (Google Play third-party файл) дает тот самый эффект увеличения времени сборки.
Следующим нашим шагом была оптимизация текущего кэш-сервера Unity.
Мало кэш-серверов = большие нагрузки
Когда мы создаем проект в Unity, нельзя просто добавить в него ассет — Unity переформатирует его в собственные форматы отдельно для iOS и Android. Для хранения таких файлов и существует кэш-сервер, откуда можно запросить уже собранные и переформатированные ассеты, и их не нужно заново пересчитывать. Если ассеты на сервере не хранятся — в таком случае происходит их пересчет, и он занимает какое-то время.
Для справки приведем немного цифр нашей конфигурации проекта:
- Размер репозитория — более 150 ГБ;
- Количество файлов в проекте — более 170 000, из них большая часть — ассеты.
На момент старта работы над War Robots Remastered у нас было использовано три кэш-сервера на весь проект: один использовался разработчиками, остальные — для нашего окружения CI и Dev/Release.
Проблема заключалась в том, что проект имеет очень большое количество мелких файлов, так что сервер не выдерживал нагрузки и просто не успевал их вовремя раздавать. Редко возникали ошибки сети, гораздо чаще — ошибки типа «Disk I/O is overloaded» из-за огромного количества обращений к диску. Из-за этого — те самые зависания на 5-7 часов, вызванные тем, что при невозможности кэш-сервера отдать файлы клиентам Unity начинала полный импорт проекта.
В результате мы пришли к тому, чтобы увеличить число кэш-серверов для CI для перераспределения нагрузки на дисках. Таким образом, 22 агента мы развели на сеть серверов — по три на каждую платформу: Android-Dev, iOS-Dev, Win-Dev, Android-Release, iOS-Release, Win-Release, — что значительно улучшило ситуацию. Также мы провели 10-гигабитную сеть до агентов. В результате проблемы сети перестали появляться, а количество ошибок I/O значительно снизилось.
Но все же время импорта оставляло желать лучшего. В среднем сам импорт с кэш-сервера достигал полутора часов, и мы решили провести эксперимент с новой версией кэш-сервера — Unity Accelerator.
На момент начала наших экспериментов у нас использовалась версия Unity 2018. 4, которая не позволяла использовать Asset Database V2 — а он был необходим для того, чтобы использовать Unity Accelerator, поскольку формат хранения ассетов в нем был несовместим с версией Unity Cache Server V1. Параллельно нам пришлось обновлять версию Unity до 2019. 22f1 — тогда-то и получилось совершить переход на новый кэш-сервер, который пошел проекту только на пользу. Теперь импорт с платформы iOS с очисткой папки Library выглядел следующим образом:
Таким образом, Unity Accelerator оказался вполне рабочим вариантом: время импорта у него приемлемое, но прогрев не происходит за 1 прогон, и необходимо несколько итераций для наполнения кэшей.
Так, решив проблему с импортом, мы стали разбираться дальше.
А что с бандлами?
Следующим шагом оптимизации времени стала непосредственно сборка бандлов в проекте.
Мы используем разделение качеств для разных типов девайсов (подробнее о том, как это устроено у нас в проекте, можно почитать здесь). Отсюда следует, что практически весь контент у нас разбит на паки качеств, в которых уже лежат необходимые бандлы с ассетами.
Мы выявили сразу две проблемы:
- Проблема переиспользования бандлов из прошлых сборок;
- Проблема однопоточных сборок бандлов.
Первая проблема исходит из того, что мы собираем достаточно большое количество билдов в день: около 60, в дни релиза — еще больше. Как правило, контент в них не сильно меняется: в основном программисты проверяют свою работу либо тестируют новые фичи. Все билды в процессе сборки бандлов выкладывают во внешнее хранилище.
Таким образом, решением стала возможность перед сборкой указать билд в хранилище, из которого можно забрать уже готовые бандлы, а также в полуавтоматическом режиме забирать бандлы из последней успешно собранной конфигурации с такой же ветки. А организация локального кэширования бандлов сразу на нодах агентов позволила нам отказаться от сборки бандлов в конкретном билде, сразу забирая уже готовые.
Но, к сожалению, в данном подходе присутствует человеческий фактор, когда программист должен сам решить, менялся у него контент или нет. Это накладывает существенные ограничения в виде ошибок сборки, когда может отсутствовать или измениться контент.
Вторая проблема заключается в том, что для каждого пресета качества Unity собирала бандлы последовательно, друг за другом, так что на сборку всех четырех пресетов качеств уходило более часа.
Чтобы этого избежать и снизить время сборки, мы стали действовать по следующей схеме:
- После импорта проекта мы генерим дополнительные Unity-проекты для каждого необходимого качества, где с помощью symlink линкуем папку Library для каждого сгенерированного проекта. Но будьте аккуратнее: внутри библиотеки есть динамические папки, которые создаются во время сборки. Например, может пересчитываться кэш шейдеров или папка с packages, что может привести к проблемам в параллельных сборках. Соответственно, линковать нужно только статический контент и саму базу.
- В отдельных процессах запускаем одновременно несколько экземпляров Unity и в каждом собираем отдельное качество.
- Результат от каждой сборки мы перемещаем в родительский проект.
Таким образом, мы смогли распараллелить время сборки бандлов в рамках одной ноды.
- Откройте каталог со шрифтами на вашем компьютере, расположенный в папке “Windows”.
- Выберите пункт “Details” в меню “View”.
- Проверьте, нет ли шрифтов с параметром “Size” равным “0”, что указывало бы на проблемный файл.
- Удалите повреждённые файлы и переустановите их.
- Запустите приложение Font Book.
- Выберите все шрифты.
- Откройте меню “File” и выберите пункт “Valiadte Fonts”. Проблемные шрифты будут помечены как нерабочие.
- Удалите повреждённые файлы и переустановите их.
- Ресурсы системы могут быть ограничены, например, при работе в виртуальной машине. Используйте Диспетчер задач, чтобы найти процессы потребляющие много памяти.
- Удалите Unity. Если вы используете MacOS, перетащите приложение Unity в корзину.
- MacOS:
/Library/Application Support/Unity/
- /Library/Application Support/Unity/