Unity — подводные камни разработки 2D игры
На хабре есть много статей для новичков про Unity, но я не хочу повторяться, а хочу поделиться своим опытом разработки первой игры и, если конкретнее, рассказать о том, обо что я спотыкался. Это даст шанс всем вам, уважаемые разработчики, уберечься в будущем от незапланированной работы и потери времени. Надеюсь данный материал прочтут и разработчики самого Unity, дабы улучшить свой продукт.
Внимание, под катом скриншоты 16+!
Так как большинство из нас люди технические, я разложу всё по полочкам, пунктикам и попытаюсь изложить материал максимально кратко, лаконично и без воды.
Задача
Мне хотелось написать что-то новогоднее, простое как в понимании, так и в управлении. В результате дискуссии с целевой аудиторией (моим ребенком), было решено, что игра будет такой:
- 2D (так как на телефоне удобнее играть именно в 2D игры)
- Управление одним пальцем (максимум иногда двумя)
- Убивалка времени (просто тыкалка, чтобы не напрягать мозг)
- Cистема достижений (чтобы было хоть немного интересно продолжать)
- Мультяшноcть
- Приятная музыка
- Без интернета
- Андроид (легкость установки тестовых apk файлов)
Это всё вылилось в идею «Сатана Санта стреляет по оленям, которые мешают взять его мешок».
И тут всё началось…
1. Сторонние андроид библиотеки
Проблема: я потратил два дня на то, чтобы найти нужные SDK, JDK, NDK и сделать так, чтобы Unity с ними заработал. На моей машине до Unity уже присутствовали sdk из андроид студии, но с ними не завелось, пришлось искать что-то другое, устанавливать, пробовать, опять искать… два дня…
Предложение по улучшению: неплохо было бы, если бы необходимые sdk последних версий устанавливались автоматом при установке Unity, а если кому надо понизить или обновить — тут уж и пускай этот кто-то сам настраивает, ручками.
2. Векторная графика
Проблема: Unity из коробки не понимает SVG. Даже всякие маленькие JS фрэймворки типа Paper.js просто шикарно работают с вектором, а такой слон как Unity — нет.
Решение: установил какой-то бета-пакет, который, вроде как читает SVG, но в итоге — конвертит его в растр. Приемлемо, но стыдно, Unity!
3. 2D платформа
Проблема: как видно на скриншоте, есть земля, и на ней есть снежок. И это еще и Mesh и Polygon Collider. То есть это поверхность, которая взаимодействует с объектами и которую можно изменять в редакторе. Так вот в текущей версии Unity нет стандартных средств, которыми можно такое моделировать.
Решение:
- Можно нарисовать растр с альфой (минус — редактировать это ну совсем неудобно)
- Можно купить плагин, который это делает (минус — тратить деньги)
- Можно написать плагин самому (минус — долго разбираться, долго писать)
Я выбрал долгий, но бесплатный путь ;) Если кому надо такой плагин — пишите, поделюсь, расскажу как пользоваться, мне не жалко :)
Кстати, я смотрел демо новой беты Unity, вроде как появится такая штука из коробки! Спасибо вам за это, друзья!
Да, еще бы добавить панельку для быстрого создания 2D примитивов, кружочков там, квадратиков…, а то их просто нет, ну или надо лезть в ассет-стор, искать.
4. Rotation & Quaternion
Проблема: очень сложная система 3d позиционирования и поворотов, ненужная в 2D играх.
Решение: это просто надо понять и принять, потому что 2D игра — это 3D игра, с координатой Z = 0. Но неплохо было бы упростить эту систему в 2D режиме, товарищи ;)
Я убил кучу времени и чуть не сломал мозг, пытаясь повернуть объект в нужную сторону на нужный угол, относительно другого объекта, когда в другом движке я просто писал player.a = 45; Да и многие очевидные методы в текущей версии — depricated.
5. Дебаг
Проблема: для нас, новичков, возможность дебага доступна только в виде вывода значения переменной в консоль методом print (). Полноценные бряки — удел тех, кто платит. Вот тут поправьте меня, если ошибаюсь, но я никак не смог настроить Visual Studio для дебага, хотя находил видео, в которых видно, что настраивать ничего и не надо, оно всё само должно работать. Сделал вывод, что дебаг доступен в платных версиях.
Решение: я просто использую print ()… и понимаю, что отладка сложного проекта будет решающим фактором приобретения платной версии Unity. Маркетологам компании грустный респект :(
6. Тап и клик, свайп и мув
Проблема: несмотря на удобство встроенной системы пользовательского ввода, не хватает простоты обработки обычных одиночных тапов, кликов и свайпов. Хотелось бы использовать один метод, который вернет координаты одиночного клика/тапа для разных типов устройств: тач и десктопа с мышкой, например.
Решение: пришлось написать свой класс прослоечку и обернуть нужные эвенты.
Пожалуй оставлю еще один комментарий, касательно системы управления. Огромное спасибо разработчикам Unity за универсальный Input, но для тач девайсов хотелось бы универсальных контролов тоже. Например, слайд вверх — забайндить на Jump, визуализировать крестик и кнопочки, как на джойстике, ну и в таком духе. Это можно докупить платными пакетами либо, снова, писать самому, тратя время на велосипеды.
7. Путаница с координатами
Проблема: нельзя объекту присвоить координаты клика и увидеть его в нужном месте, и это немного неочевидно.
Решение: Нужно сперва почитать документацию, разобраться и использовать различные методы для маппинга координат:
WorldToScreenPoint ()
ScreenToViewportPoint ()
transform.TransformPoint ()
и другие…
Объясню, это связано с тем, что расстояние в сцене измеряется в условных единицах, отличных от пикселя и вдобавок объекты имеют систему вложенности, соответственно позиционирование осуществляется относительно родителя.
8. Скудный набор UI контролов
Проблема: из коробки поставляются лишь самые базовые элементы, да и то с некоторыми приходится повозиться.
Решение: Можно довольствоваться малым. Я, например, потратил много времени чтобы заставить скролиться динамический список. Можно купить крутые контролы (минус — тратить деньги).
9. Большой размер APK файла
Проблема: при билде пустого проекта, его размер равен 21.9 MB (23,061,612 bytes)
Решение: нужно экономить на всём. Я пережимал mp3 файлы, сжимал текстурки, старался ничего лишнего не включать в проект. Но при подключении дополнительных пакетов размер нещадно увеличивался, стремясь к сотне.
Google Play просит разработчиков постить приложения < 100Mb. (22 уже сожрано). Есть, конечно механизмы сплита, динамической подгрузки ресурсов, но мы же новички, и цель у нас — научиться основам, воплотить свои заветные мечты, а не бороться с лимитами маркета.
10. Кириллица
Проблема: собрав проект под платформу JS/HTML5 (для тестов), выяснилось, что текстов, написанных по-русски, просто нет.
Решение: необходимо скачать файл шрифта, импортировать его в ассеты и затем указать в настройке каждого текста именно этот импортированный шрифт.
Это как-то совсем странно.
11. Производительность физики
Проблема: Игра жутко начинает тормозить при наличии сложных коллайдеров, при использовании Continuous режима для Collision Detection, когда в одной сцене используется несколько Particle System, короче при использовании всего, что придает эффектность и красоту играм.
Решение: использовать только примитивные коллайдеры Circle и Rectangle, Collision Detection должен быть только Discrete, количество частиц в Particle System нужно выставлять минимально приемлемым. Ну и еще, не допускать моей ошибки и не использовать коллизии внутри системы частиц. Эффект, конечно красивый, как кровь стекает по объектам, но очень ресурсоёмкий.
Естественно, это всё актуально для 2D мобильных игр. Но хотелось бы, чтобы Unity развивался, использовал новые крутые шейдеры и для частиц, и для коллизий, и для всего другого сложного и красивого.
Заключение
Были конечно и другие подводные камни, но это уже мелочи.
Были и неожиданные плюсы, такие как:
- Префабы
- Хорошая документация и комьюнити
- Автоматическое создание полигонного коллайдера по альфаканалу спрайта
- Легкость использования звуковых эффектов
- Очень удобная анимация по ключевым кадрам (c дополнением Anima2D и обратной кинематикой)
Но это совсем другая история…
Что касается сроков выполнения поставленной задачи — меня очень сильно тормознул пункт №3 (разработка плагина для моделирования платформы). Как опытный разработчик, я для себя провел оценку задачи и оценил всё так:
20, 30, 40 (вечеров/выходных ибо днем я занят основной работой), где 20 — оптимистичная, а 40 — пессимистичная оценки. Если бы не пункт №3, то я бы попал в 20–30, но в итоге потратил около двух месяцев. (нет, работал я не каждый вечер, т.е. попал примерно в 40).
Если кому интересно, то скажу, что графику пришлось рисовать самому, спасибо программке Inkscape. Музыку выбирал исключительно с лицензией для свободного использования.
Пару дней пришлось потратить на публикацию в Google Play.
Еще два дня ушло на интеграцию рекламы (вы её, скорее всего, и не увидите, просто очень хотелось попробовать, хотя игрушка и не задумывалась коммерческой)
Да, многое можно было бы еще улучшить, но хотелось повеселить друзей перед новогодними праздниками.
Не поймите меня неправильно, это не пиарный пост. Мне больше всего хочется, чтобы те, кто делает сам движок Unity, обратили внимание на указанные недостатки и, конечно же, устранили их (ну это в идеале). И еще хочется помочь своим братьям по духу не попасть на те же грабли, что и я.
А если я в чем-то ошибаюсь, то не судите строго, поделитесь своими советами в комментариях!