Space Rift

28 сентября 2014

Если кому-то вдруг интересно, что я делал этим летом и почему меня не было дома весь июль.

(Я написал бы раньше, но ждал, пока || выложат фоточки с завершающей конференции. Как-то уже два месяца прошло, так что обойдёмся без фоточек.)

Так вот, этим летом я принимал участие в Parallels Summer School. Каждый выбирал себе проект, над которым хочет работать, и на протяжении месяца по восемь часов в день им занимался. Я, конечно, выбрал проект, связанный с Oculus Rift, потому что наш лектор/семинарист по мат. анализу пообещал, что он притащит этот шлем, и мы напишем какую-нибудь игру.

Нет, это не наша игра, это Mirror's Edge, стилистику которого я предлагал повторить в нашей игре, когда мы решали, что мы, собственно, будем делать. Если бы мы были покруче, возможно, мы бы написали мультиплеерный паркур-экшн от первого лица в стиле Mirror's Edge и с крюком как в Teeworlds.

В общем, мы довольно быстро определились, что нужно что-то первого лица, так как иначе "показать весь потенциал" Oculus Rift будет сложно. Кроме того, мы решили, что игра будет мультиплеерной, чтобы не писать ИИ для ботов и не придумывать интересный сценарий. Поскольку шлем у нас был один, было решено, что игра будет также поддерживать и плоскоэкранный режим.

Так как из участников нашего проекта только я ранее писал игры, я выбрал движок (Unity, потому что на нём любой школьник игру слепит; к тому же, для Unity есть пакет с необходимыми ассетами, предоставленный самими разработчиками Oculus Rift) и помогал ребятам его освоить. Кто-то больше работал с редактором, а кто-то писал код, но в целом все внесли довольно большой вклад.

Самую тяжёлую часть — мультиплеер — я взял на себя. У Unity своё мнение по поводу мультиплеера, которое мне не сильно нравится, потому что я привык писать с использованием сокетов, так что мне самому пришлось немного поразбираться. Учитывая то, что никто до этого ни C#, ни Javascript в глаза не видел, кого-то заставлять с этим работать я не мог.

Всего нас было шестеро, причём двое до конца не остались, а один перешёл с другого проекта к нам. Двое занимались дизайном уровней и, позаимствовав пакет текстур Space for Unity, сделали три карты. Они также занимались простыми геймплейными штуками вроде порталов и ограничения игровой зоны. Двое в разное время делали модели кораблей, ракет и декорации, а оставшиеся двое занимались всякой всячиной. В частности, они искали звуки, баловались с эффектами и частицами, учили javascript, а также писали главное меню.

Помимо мультиплеера, я также прикручивал Oculus Rift, писал геймплей, допиливал меню, собирал проект со всех компов на один и состыковывал его части друг с другом. Кроме того, всю 2D-графику, то есть лого, менюшку и игровое GUI, рисовал я.

Первое время тесты были направлены в первую очередь на подключение Oculus Rift. Когда он начал работать как надо, я стал приделывать мультиплеер. Я посмотрел много очень тупых туториалов, авторы которых не понимали, что делают, или понимали это неправильно. Несколько дней я пробовал различные способы, а потом наткнулся на какой-то туториал, в котором мне, наконец, стало понятно, как должен работать мультиплеер в Unity (и что другие туториалы предлагали вообще неправильные решения). Чтобы тестировать работу мультиплеера, нужно было запускать игру на нескольких машинах и смотреть, что и где происходит. Когда я прикрутил самые базовые вещи — перемещение, стрельбу и снятие здоровья (но не смерть) — мы уже запускали игру на нескольких компьютерах и смотрели, как что работает. Постепенно, игра обрастала всё новыми фичами — подоспели первые версии карты и корабля, нашлись звуки и эффекты для лазеров, я сделал команды и респаун.

Далее мы добавили самонаводящиеся ракеты. Идея была в том, что возможности Oculus Rift должны как-то использоваться в игре, и примером такого использования было наведение ракет на цель. Если вражеский корабль находится на определённом расстоянии от игрока, он должен в течении некоторого времени зафиксировать свой взгляд на этом корабле и выстрелить после звукового сигнала. Тогда ракета начинает преследовать противника. Ракету можно выпустить и просто по прямой, если не фиксироваться на цели. Таких ракет в корабле немного и между выстрелами нужно подождать некоторое время.

На своём опыте было выяснено, что найти клавиатуру и мышь с надетым Oculus Rift может быть непросто, поэтому было решено сделать поддержку геймпадов. У нас был PS3-контроллер для PC, который мы и приделали к игре. Кроме того, управление кораблём на клавиатуре было сделано "реалистичное". Оно мне очень не нравится, потому что в нём очень просто запутаться и не так легко играть, но большинство было за него, а прикручивать различные схемы управления не хотелось, поэтому оно осталось в игре одно.

Постепенно были доделаны карты и сделаны две разные модели корабля. Меня также убедили приделать физику для столкновений (хотя столкнуться с чем-либо в игре проблематично, да и обрабатываются они в Unity как-то медленно). Совокупность нескольких причин, в частности, использование float для хранения координат объектов самой Unity, привели к тому, что при движении интерфейс начинал трястись (обычное плоское GUI в Unity рисуется только после всех камер, и передать его на шлем нельзя, поэтому интерфейс отрисовывался на прозрачной плоскости перед камерой, чтобы Oculus Rift искривил изображение с камер как надо). Выпиливать то, что создало проблему, было некогда, поэтому интерфейс переехал с прозрачной плоскости на экранчики в кабине корабля, а курсор и никнеймы стали отрисовываться на шлем вручную с помощью пары костылей.

Тестируя и дорабатывая игру перед финальной конференцией, мы придумали крутое оружие, кардинально меняющее нашу обычную игровую сессию. В основном нам приходилось летать на некотором расстоянии от врагов, ожидая перезарядки ракет и уворачиваясь от ракет противников. Даже после отвязки от оси корабля лазерами попасть было довольно сложно. К тому же, лазеры наносили по 15 урона каждый, а ракеты по 60. Уничтожить корабль противника с лазеров было затруднительно, а ракет приходилось использовать по две, то есть ждать как минимум одну перезарядку. Новое же оружие было интересно тем, что убивало с первого раза. Более того, оно убивало всех (включая сокомандников) в радиусе 300 метров вокруг корабля игрока. При использовании все системы корабля выключаются на 20 секунд, и игрок не может ни двигаться, ни атаковать, ни даже наблюдать интерфейс. Только смотреть по сторонам через стекло кабины. Теперь вместо долгого ожидания перезарядки ракет можно было приблизиться к врагу и сразу же уничтожить его. Обратной стороной является остановка. Если игрок использует оружие невовремя, он может не попасть по врагу. К тому же, он в любом случае становится уязвимым на продолжительное время. Наконец, другие игроки тоже имеют это оружие и зачастую при сближении выигрывает тот, у кого реакция быстрее.

Завершив работу, мы сыграли несколько матчей и придумали план выступления. Кроме коротких рассказов о работе от каждого из участников мы запланировали семиминутный матч между игроками на Mac OS, игроком на Windows, игроком в Oculus Rift с контроллером PS3 и игроком на Windows с проектором.

Первой проблемой оказалась сеть, которой в || не было. Нам удалось договориться с сисадмином, который предоставил нам свитч, кабели и переходники для маков. Кроме того, при подключении произошёл лаг, и ребята с Mac OS не подключились к игре, в результате чего матч был довольно скучным. А ещё в Oculus Rift из-за искривления изображения я отключил отрисовку никнеймов поверх кораблей игроков, поэтому в шлеме играть было очень сложно.

Кажется, всё прошло довольно гладко, многим понравилось и кто-то попросился посмотреть игру в шлеме. Они подтвердили, что управление неудобно, но мы это и так знали. Собственно, мы дослушали доклады остальных участников, получили всякие сувениры от Parallels и разъехались по домам.

По идее, мы будем работать над проектом и дальше. Правда, писал я игру на компе в НГУ и проект хранился только там. Я скинул абсолютно финальную версию на флешку одному из участников команды, и сейчас не существует другой копии проекта. Но у меня есть скомпилированная версия игры, в которую можно поиграть по локалке (например, сделать локалку через интернет с помощью Hamachi и играть).

А в августе я поехал на олимпиадные сборы, и потому тоже почти не был дома.