За последние несколько месяцев я был одержим поиском того, как писать более чистый и умный код для видеоигр - эта одержимость была вдохновлена сообщением в блоге Джона Кармака о статическом анализе кода и моим опытом разработки игр. около года и поддерживая кодовую базу нестандартного размера для мобильной игры (не говоря уже о не столь секретном нытье, что мой код будет постоянно отстой).
Итак, мой первый шаг к подавлению этой навязчивой идеи - выяснить, как сделать автоматическое тестирование частью моего рабочего процесса, и я подумал, что настройка автономной виртуальной среды Linux, которая может запускать Unity3D, будет хорошим местом для начала (с настройкой сервер непрерывной интеграции как конечная цель). К счастью, Unity Technologies только что выпустила экспериментальный редактор Linux (и по крайней мере один инженер, кажется, регулярно работает над ним).
Для моей экспериментальной установки я установил пустую виртуальную машину Ubuntu 14.04 с Vagrant и загрузил текущую последнюю сборку. Эти начальные шаги довольно просты и включают лишь следующие инструкции (при условии, что вы немного знакомы с Linux и виртуальными машинами).
Есть три проблемы, с которыми вы, вероятно, столкнетесь, и некоторые из них может быть сложно решить с помощью только поиска Google из-за текущего дефицита информации, которую вы можете найти в Интернете о запуске безголового редактора Unity 5 в автономной среде Linux.
1. Установка и зависимости
После того, как вы запустите `dpkg` для распаковки и установки пакета Unity, вы можете столкнуться с чем-то вроде этого:
dpkg: error processing package unity-editor ( — install): dependency problems — leaving unconfigured Processing triggers for mime-support (3.54ubuntu1.1) … Errors were encountered while processing: unity-editor
Это можно решить, просто запустив
sudo apt-get update && sudo apt-get install -f
После этого попробуйте снова установить пакет Unity3D.
2. Запуск Unity3D в режиме -nographics
После того, как вы установили Unity3D («Черт возьми, теперь я наконец могу запустить Unity3D в Linux без использования WINE!… Ой, подождите.»), Пытаясь запустить
/opt/Unity/Editor/Unity -batchmode -nographics
- который сообщает редактору Unity работать в автономном режиме (-batchmode) и не инициализировать графическое устройство вообще (-nographics; дополнительная информация в документации Unity3D) - приведет к этой ошибке:
QXcbConnection: Could not connect to display
К счастью, это сообщение об ошибке делает довольно очевидным, в чем ошибка, но вам может потребоваться дополнительная информация, сделав Unity более подробным, что вы можете сделать, добавив флаг -logFile:
/opt/Unity/Editor/Unity -batchmode -nographics -logFile
Если включены подробные журналы, вы обнаружите, что даже с флагом -nographics, редактор все еще, похоже, ищет отображение:
Forcing GfxDevice: 4 NullGfxDevice: Version: NULL 1.0 [1.0] Renderer: Null Device Vendor: Unity Technologies .... Receiving unhandled NULL exception Launching bug reporter #0 0x007ffc4b6015c0 in _L_unlock_13 #1 0x007ffc4b601a38 in _XimLocalSetICValues #2 0x007ffc4b601a40 in _XimSetICDefaults #3 0x007ffc4b601ab0 in _XimSetICDefaults #4 0x007ffc4b601b20 in _XimLocalCreateIC #5 0x007ffc4b601d50 in XCreateIC #6 0x007ffc4b601e60 in InitX11ToSDL() #7 0x007ffc4b6025f0 in InputInit() #8 0x007ffc4b602600 in InitializeEngineNoGraphics() #9 0x007ffc4b602640 in Application::InitializeProject() #10 0x007ffc4b602be0 in InitializeUnity(void*) #11 0x007ffc4b602c60 in main #12 0x007ffc4b603000 in __libc_start_main #13 0x007ffc4b6030c0 in _start
Это легко решить, запустив Редактор с сервером X11, то есть xvfb. (Пакет xvfb в Ubuntu просто называется xvfb.)
После перезагрузки перезапустите Unity, но на этот раз с добавлением xvfb-run, т.е.
xvfb-run /opt/Unity/Editor/Unity -batchmode -nographics -logFile
Ошибка QXcbConnection теперь должна быть отключена.
3. ALSA / проблемы со звуком
Для этого я обнаружил три возможных решения. Я буду перечислять их от сложных к простейшим, чтобы попытаться зафиксировать свой опыт. :П
3а. ALSA / проблемы со звуком - сложное решение
Вот где это, возможно, становится сложно (и где мой поиск в Google подвел меня, когда я пытался искать вещи, связанные с Unity3D): при попытке запустить редактор с тем же флагом теперь вы получите
ALSA lib confmisc.c:768:(parse_card) cannot find card ‘0’ ALSA lib conf.c:4248:(_snd_config_evaluate) function snd_func_card_driver returned error: No such file or directory ALSA lib confmisc.c:392:(snd_func_concat) error evaluating strings ALSA lib conf.c:4248:(_snd_config_evaluate) function snd_func_concat returned error: No such file or directory ALSA lib confmisc.c:1251:(snd_func_refer) error evaluating name ALSA lib conf.c:4248:(_snd_config_evaluate) function snd_func_refer returned error: No such file or directory ALSA lib conf.c:4727:(snd_config_expand) Evaluate error: No such file or directory ALSA lib pcm.c:2239:(snd_pcm_open_noupdate) Unknown PCM default .... Importing game controller configs m_SoundManager (Filename: /home/builduser/buildslave/unity/build/Runtime/Audio/AudioManager.cpp Line: 2575) Receiving unhandled NULL exception Launching bug reporter Setting up 1 worker threads for Enlighten. #0 0x007ffe6c1fd340 in _L_unlock_13 #1 0x007ffe6c1fd790 in SoundManager::UpdateChannels() Thread -> id: 7fe573343700 -> priority: 1 #2 0x007ffe6c1fd7b0 in SoundManager::Update() #3 0x007ffe6c1fd8a0 in PlayerLoop(bool, bool, IHookEvent*) #4 0x007ffe6c1fda10 in Application::UpdateScene(bool) #5 0x007ffe6c1fda90 in Application::UpdateSceneIfNeeded() #6 0x007ffe6c1fdaa0 in Application::TickTimer() #7 0x007ffe6c1fdbf0 in MainMessageIteration(void*) #8 0x007ffe6c1fdc00 in InitializeUnity(void*) #9 0x007ffe6c1fdc80 in main #10 0x007ffe6c1fe020 in __libc_start_main #11 0x007ffe6c1fe0e0 in _start
Хотя на этот раз сообщения об ошибках менее очевидны, они, по крайней мере, достаточно любезны, чтобы сообщить мне, что теперь у меня проблемы, связанные со звуком Unity3D. Я решил, что это проблема, аналогичная проблеме с графикой, поэтому я искал способы создать фиктивное звуковое устройство (чего, очевидно, не имеет виртуальная машина по умолчанию), что привело меня к сайту ALSA и Тема Reddit .
Во-первых, вам нужно установить snd-dummy, который по сути является фиктивным звуковым драйвером для фиктивного устройства:
sudo apt-get install — reinstall linux-image-extra-`uname -r`
После этого запустите
sudo modprobe snd-dummy
для вставки модуля snd-dummy в ядро и подтверждения его успешной установки. После того, как вы подтвердили установку, откройте / etc / modules с правами root с помощью вашего любимого текстового редактора, например `sudo vi / etc / modules` и добавьте строку` snd-dummy`. Ваш / etc / modules может выглядеть так:
# /etc/modules: kernel modules to load at boot time. # This file contains the names of kernel modules that should be loaded # at boot time, one per line. Lines beginning with “#” are ignored. # Parameters can be specified after the module name. snd-dummy
Затем откройте / etc / group с корневым доступом и добавьте «vagrant» - или любую другую группу, в которой находится ваш текущий пользователь (которую вы можете узнать, введя «groups» в командной строке) - в «audio: x: 29, например.
audio:x:29:ubuntu,vagrant
Наконец, перезагрузите вашу виртуальную машину. Запуск Unity3D с теми же флагами больше не должен приводить к сбоям.
3b. ALSA / проблемы со звуком - действительно простое решение
Прочитав больше, я узнал о PulseAudio, звуковом сервере, который может принимать входные данные от некоторого источника (в нашем случае, редактора Unity3D) и перенаправлять его в приемник (звуковая карта, или другой процесс PulseAudio по сети). Честно говоря, я не уверен, куда PulseAudio перенаправляет звук из редактора, но я предполагаю, что он обеспечивает все, что требуется редактору под капотом (т.е. предотвращает нулевое исключение в SoundManager :: UpdateChannels ()).
Чтобы установить PulseAudio, просто запустите
sudo apt-get install pulseaudio
3c. ALSA / проблемы со звуком - даже более простое решение (из-за чего я чувствую себя глупо * facepalm *)
Простая передача флага `-quit` в / opt / Unity / Editor / Unity по-прежнему будет выводить ошибки, связанные с ALSA, но заставит редактор выйти до того, как SoundManager сможет запуститься. :П
Однако это может вызвать непредвиденные проблемы в будущем, поэтому я рекомендую решения 3a или 3b соответственно.
Заключение
Я надеюсь, что это поможет какому-нибудь бедному человеку, который случайно столкнется с подобными проблемами. : D
Если вам интересно, как работает автоматическое тестирование в Unity, просмотрите сообщения об этом в блоге Unity (часть 1 и часть 2) и загрузите пример. Вы можете запустить тесты в примере, введя
xvfb-run /opt/Unity/Editor/Unity -projectPath PATH_TO_EXAMPLE -batchmode -nographics -executeMethod UnityTest.Batch.RunUnitTests -resultFilePath=results.xml -logFile
Удачной автоматизации и тестирования (я все еще пытаюсь понять это с помощью Unity и, вероятно, заслуживает еще одного сообщения в блоге)!