За последние несколько месяцев я был одержим поиском того, как писать более чистый и умный код для видеоигр - эта одержимость была вдохновлена ​​сообщением в блоге Джона Кармака о статическом анализе кода и моим опытом разработки игр. около года и поддерживая кодовую базу нестандартного размера для мобильной игры (не говоря уже о не столь секретном нытье, что мой код будет постоянно отстой).

Итак, мой первый шаг к подавлению этой навязчивой идеи - выяснить, как сделать автоматическое тестирование частью моего рабочего процесса, и я подумал, что настройка автономной виртуальной среды 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 и, вероятно, заслуживает еще одного сообщения в блоге)!