Unity — подводные камни разработки 2D игры

    На хабре есть много статей для новичков про Unity, но я не хочу повторяться, а хочу поделиться своим опытом разработки первой игры и, если конкретнее, рассказать о том, обо что я спотыкался. Это даст шанс всем вам, уважаемые разработчики, уберечься в будущем от незапланированной работы и потери времени. Надеюсь данный материал прочтут и разработчики самого Unity, дабы улучшить свой продукт.

    image

    Внимание, под катом скриншоты 16+!

    Так как большинство из нас люди технические, я разложу всё по полочкам, пунктикам и попытаюсь изложить материал максимально кратко, лаконично и без воды.

    Задача


    Мне хотелось написать что-то новогоднее, простое как в понимании, так и в управлении. В результате дискуссии с целевой аудиторией (моим ребенком), было решено, что игра будет такой:

    • 2D (так как на телефоне удобнее играть именно в 2D игры)
    • Управление одним пальцем (максимум иногда двумя)
    • Убивалка времени (просто тыкалка, чтобы не напрягать мозг)
    • Cистема достижений (чтобы было хоть немного интересно продолжать)
    • Мультяшноcть
    • Приятная музыка
    • Без интернета
    • Андроид (легкость установки тестовых apk файлов)


    Это всё вылилось в идею "Сатана Санта стреляет по оленям, которые мешают взять его мешок".

    mortal klaus

    И тут всё началось…

    1. Сторонние андроид библиотеки


    Проблема: я потратил два дня на то, чтобы найти нужные SDK, JDK, NDK и сделать так, чтобы Unity с ними заработал. На моей машине до Unity уже присутствовали sdk из андроид студии, но с ними не завелось, пришлось искать что-то другое, устанавливать, пробовать, опять искать… два дня…

    Предложение по улучшению: неплохо было бы, если бы необходимые sdk последних версий устанавливались автоматом при установке Unity, а если кому надо понизить или обновить — тут уж и пускай этот кто-то сам настраивает, ручками.

    image

    2. Векторная графика


    Проблема: Unity из коробки не понимает SVG. Даже всякие маленькие JS фрэймворки типа Paper.js просто шикарно работают с вектором, а такой слон как Unity — нет.

    Решение: установил какой-то бета-пакет, который, вроде как читает SVG, но в итоге — конвертит его в растр. Приемлемо, но стыдно, Unity!

    3. 2D платформа


    image

    Проблема: как видно на скриншоте, есть земля, и на ней есть снежок. И это еще и Mesh и Polygon Collider. То есть это поверхность, которая взаимодействует с объектами и которую можно изменять в редакторе. Так вот в текущей версии Unity нет стандартных средств, которыми можно такое моделировать.

    Решение:
    1. Можно нарисовать растр с альфой (минус — редактировать это ну совсем неудобно)
    2. Можно купить плагин, который это делает (минус — тратить деньги)
    3. Можно написать плагин самому (минус — долго разбираться, долго писать)

    Я выбрал долгий, но бесплатный путь ;) Если кому надо такой плагин — пишите, поделюсь, расскажу как пользоваться, мне не жалко :)

    Кстати, я смотрел демо новой беты Unity, вроде как появится такая штука из коробки! Спасибо вам за это, друзья!

    Да, еще бы добавить панельку для быстрого создания 2D примитивов, кружочков там, квадратиков… а то их просто нет, ну или надо лезть в ассет-стор, искать.

    4. Rotation & Quaternion


    Проблема: очень сложная система 3d позиционирования и поворотов, ненужная в 2D играх.

    Решение: это просто надо понять и принять, потому что 2D игра — это 3D игра, с координатой Z = 0. Но неплохо было бы упростить эту систему в 2D режиме, товарищи ;)

    Я убил кучу времени и чуть не сломал мозг, пытаясь повернуть объект в нужную сторону на нужный угол, относительно другого объекта, когда в другом движке я просто писал player.a = 45; Да и многие очевидные методы в текущей версии — depricated.

    5. Дебаг


    Проблема: для нас, новичков, возможность дебага доступна только в виде вывода значения переменной в консоль методом print(). Полноценные бряки — удел тех, кто платит. Вот тут поправьте меня, если ошибаюсь, но я никак не смог настроить Visual Studio для дебага, хотя находил видео, в которых видно, что настраивать ничего и не надо, оно всё само должно работать. Сделал вывод, что дебаг доступен в платных версиях.

    Решение: я просто использую print()… и понимаю, что отладка сложного проекта будет решающим фактором приобретения платной версии Unity. Маркетологам компании грустный респект :(

    Решено! благодаря подсказке Leopotam я установил дополнительный пакет для студии, появилась кнопка «Attach to Unity debugger».

    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 нужно выставлять минимально приемлемым. Ну и еще, не допускать моей ошибки и не использовать коллизии внутри системы частиц. Эффект, конечно красивый, как кровь стекает по объектам, но очень ресурсоёмкий.

    image

    Естественно, это всё актуально для 2D мобильных игр. Но хотелось бы, чтобы Unity развивался, использовал новые крутые шейдеры и для частиц, и для коллизий, и для всего другого сложного и красивого.

    Заключение


    Были конечно и другие подводные камни, но это уже мелочи. Были и неожиданные плюсы, такие как:

    • Префабы
    • Хорошая документация и комьюнити
    • Автоматическое создание полигонного коллайдера по альфаканалу спрайта
    • Легкость использования звуковых эффектов
    • Очень удобная анимация по ключевым кадрам (c дополнением Anima2D и обратной кинематикой)

    Но это совсем другая история…

    Что касается сроков выполнения поставленной задачи — меня очень сильно тормознул пункт №3 (разработка плагина для моделирования платформы). Как опытный разработчик, я для себя провел оценку задачи и оценил всё так: 20, 30, 40 (вечеров/выходных ибо днем я занят основной работой), где 20 — оптимистичная, а 40 — пессимистичная оценки. Если бы не пункт №3, то я бы попал в 20-30, но в итоге потратил около двух месяцев. (нет, работал я не каждый вечер, т.е. попал примерно в 40).

    Если кому интересно, то скажу, что графику пришлось рисовать самому, спасибо программке Inkscape. Музыку выбирал исключительно с лицензией для свободного использования.

    Пару дней пришлось потратить на публикацию в Google Play.

    Еще два дня ушло на интеграцию рекламы (вы её, скорее всего, и не увидите, просто очень хотелось попробовать, хотя игрушка и не задумывалась коммерческой)

    Да, многое можно было бы еще улучшить, но хотелось повеселить друзей перед новогодними праздниками.

    Не поймите меня неправильно, это не пиарный пост. Мне больше всего хочется, чтобы те, кто делает сам движок Unity, обратили внимание на указанные недостатки и, конечно же, устранили их (ну это в идеале). И еще хочется помочь своим братьям по духу не попасть на те же грабли, что и я.

    А если я в чем-то ошибаюсь, то не судите строго, поделитесь своими советами в комментариях!
    Поделиться публикацией

    Комментарии 41

      +3
      Я надеюсь, юнити никогда не станет таким упрощенным трешем, который захотелось автору статьи. Хочется ущербной простоты без знаний — это на Defold / Godot. Хочется «по-настоящему» — обмазываемся нейтивными библиотеками и пытаемся заставить это все работать на всем зоопарке доступных устройств.
        –2
        Уважаемый Leopotam, цель любого фрэймворка — упростить разработку. Разве нет?
          +3
          Нет, цель фреймворка — предоставить ограниченный функционал, целью которого и было создание фреймворка. И нет, юнити не фреймворк. Я могу расписать по каждому пункту, почему написанное ужасает, стоит?
            +2
            Если честно, то мне было бы очень интересно ваше мнение, возможно я почерпну для себя что-то новое.
              +3
              Проблема: я потратил два дня на то, чтобы найти нужные SDK, JDK, NDK и сделать так, чтобы Unity с ними заработал. На моей машине до Unity уже присутствовали sdk из андроид студии, но с ними не завелось, пришлось искать что-то другое, устанавливать, пробовать, опять искать… два дня…

              Все работает, нужно только в самом SDK доустановить нужный минимальную платформу-таргет — сведения прямо открытым текстом можно взять из ошибок при сборке.
              Вообще про SDK — это не проблема юнити, т.к нельзя докачивать последние версии просто так, какие-то проекты нужно собирать на старых версиях юнити. Юнити может только подсказать где и что взять для сборки под нужную платформу (а там не только android, подо все платформы делать автоматическую закачку самого нового софта?).
              Про NDK немного другая тема. С лета 2019 гугль перестанет принимать билды без поддержки ARM64 (v8), а это значит, что mono в качестве рантайма уже по сути доживает последние месяцы. Актуальным рантаймом является IL2CPP, т.е весь MSIL транслируется в нейтив и именно для этого и нужны нейтивное NDK под android.
                +3
                Проблема: Unity из коробки не понимает SVG. Даже всякие маленькие JS фрэймворки типа Paper.js просто шикарно работают с вектором, а такой слон как Unity — нет.

                Решение: установил какой-то бета-пакет, который, вроде как читает SVG, но в итоге — конвертит его в растр. Приемлемо, но стыдно, Unity!

                Открою большую тайну — gpu вообще не умеет работать ни с чем, кроме растра и 3д геометрии. Любые 2д движки внутри себя все делают в 3д пространстве, хотят они этого или нет. Ну если правда они хотят продемонстрировать достойную скорость работы, софтовый рендер руками никто не отменял. То, что веб-движки умеют в svg и прочее — так они не сами рендерят, а пользуются услугами браузера, который внутри точно так же выполняет растеризацию при изменении векторных данных. Юнити делает это все самостоятельно и изначально дает доступ почти ко всему рендеру, который можно поменять практически под себя в любом месте. Если прямо не хочется растра, а хочется вектора — это можно сделать через геометрию, разумеется без плавных кривых (апроксимировать прямыми до нужной точности) — это уменьшит размер и часто может ускорить работу, но нужно проверять на каждом кейсе.
                  +3
                  Проблема: как видно на скриншоте, есть земля, и на ней есть снежок. И это еще и Mesh и Polygon Collider. То есть это поверхность, которая взаимодействует с объектами и которую можно изменять в редакторе. Так вот в текущей версии Unity нет стандартных средств, которыми можно такое моделировать.

                  Все потому, что 2д пришито сбоку, чтобы увеличить аудиторию. IMHO, это сильно увеличивает количество пассажиров, но сильно уменьшает их качество. Умея в 3д, можно реализовать любое 2д, но все хотят большую красную кнопку с надписью «сделать п#$ато».
                    +1
                    Большое спасибо за столь детальные пояснения, многое становится понятным. Про IL2CPP и ARM64 особенно любопытно.
                    +1
                    Проблема: очень сложная система 3d позиционирования и поворотов, ненужная в 2D играх.

                    Я бы сказал — 2д игры не нужны в юнити, а система позиционирования впоне вменяема даже для ориентации в пространстве экрана. Берем единственный конструктор Quaternion.Euler(0, 0, angle) и практически все проблемы решены.
                      0
                      Я бы сказал — 2д игры не нужны в юнити,

                      Вот это вы зря. Меня например, только 2Д интересует.
                      система позиционирования впоне вменяема даже для ориентации в пространстве экрана

                      Да, здесь я согласен. Вращение в 2Д вполне легко задавать.
                        0
                        Вот это вы зря.

                        Ответ был в стиле предположения
                        сложная система 3d позиционирования и поворотов, ненужная в 2D играх.
                      +2
                      Полноценные бряки — удел тех, кто платит. Вот тут поправьте меня, если ошибаюсь, но я никак не смог настроить Visual Studio для дебага, хотя находил видео, в которых видно, что настраивать ничего и не надо, оно всё само должно работать. Сделал вывод, что дебаг доступен в платных версиях.

                      Отладка полностью бесплатна и зависит от настроек IDE. Для VisualStudio вроде как есть встроенный пакет Unity Tools (они его купили и сделали бесплатным, либо его нужно докачивать) — не могу точно сказать, винду видел 6 лет назад. В Rider есть поддержка дебага, в VSCode аналогично — через бесплатные плагины.
                      Юнити вообще по сути вся бесплатна, начиная с 5.x. Платными остались только облачные сервисы по коллаборации, билду в облаке и т.п штукам, которые можно повторить локально (буди только совместного редактирования не будет, но то очень сомнительная вещь). Да, еще можно будет убрать штатный сплеш юнити. На этом платность заканчивается.
                        0
                        ну это круто, спасибо, сейчас буду искать!
                        +2
                        Проблема: несмотря на удобство встроенной системы пользовательского ввода, не хватает простоты обработки обычных одиночных тапов, кликов и свайпов. Хотелось бы использовать один метод, который вернет координаты одиночного клика/тапа для разных типов устройств: тач и десктопа с мышкой, например.

                        Решение: пришлось написать свой класс прослоечку и обернуть нужные эвенты.


                        Юнити — это multipurpose движок и если делать вещи узкой направленности — он разрастется просто дико. Под каждый девайс придется делать что-то свое и как этим всем придется управлять — хз. Те же джойстики, мыши, стилусы, мультитачи — очень много устройств ввода. Поэтому юнити дает унифицированное апи для получения информации и дальше пользователь сам может решить как он будет обрабатывать все это добро.
                          +2
                          Проблема: нельзя объекту присвоить координаты клика и увидеть его в нужном месте, и это немного неочевидно.

                          Решение: Нужно сперва почитать документацию, разобраться и использовать различные методы для маппинга координат

                          Можно попробовать использовать OnGUI метод для отладки и в нем уже рисовать все, что угодно через GUI.xxx и GUILayout.xxx. Повторяюсь — только для отладки, для игрового функционала крайне не рекомендую использовать.
                            0
                            Вот это вообще топовая и удобная штука, в умелых руках можно шикарный VisualDebug прикрутить.
                            +2
                            Проблема: из коробки поставляются лишь самые базовые элементы, да и то с некоторыми приходится повозиться.

                            Тут как посмотреть. По сути все контролы — это картинка + поведение. Картинку делают артовики под каждый конкретный проект, чтобы получился единый UIKit, поэтому смысла в богатом наборе штатных виджетов как бы и нет. Любой сложный виджет можно сконструировать на базе штатных или даже написать код. Внезапно, все виджеты написаны на шарпе и доступны на битбакете, можно посмотреть как сделано то или иное и подкрутить у себя. Есть даже реп с кастомными виджетами.
                              +2
                              Проблема: при билде пустого проекта, его размер равен 21.9 MB (23,061,612 bytes)

                              Потому что нужно уметь его готовить. Пустой билд под IL2CPP с ".netfw46" и профилем ".net std 2.0" весит меньше 9мб — как когда-то пустой билд с mono рантаймом. Страйпинг неиспользуемого кода делается только при таком конфиге, если выбрать другой профиль, то фокус не получится.
                                0
                                Если не затруднит, можете сделать скиршот настроек, пожалуйста?
                                  +3


                                  Собирать FAT-билды смысла нет: x86-девайсы по статистике на 3 квартал 2018 занимают меньше 1%, а ARM64-железо умеет исполнять ARMv7 код, поэтому одной архитектуры будет достаточно на данный момент.

                                    0
                                    Можно написать небольшой скрипт, который делает 3 билда для разных архитектур. А в новых версиях Unity этот функционал делается выставлением одной галочки.
                                      0

                                      А можно написать скрипт, который делает 20 билдов с разными рандомными настройками, но зачем? Тут посыл был именно в целесообразности — не смысла делать, а самое главное, поддерживать столько вариаций билдов под android, по крайней мере еще полгода.

                                        0
                                          0
                                          Как связана версия ОС (а безопасность привязана исключительно к ней) на конечном устройстве пользователя и архитектура cpu, под который собирается билд? От того, что мы соберем билд под x86 вендор устройства сразу опомнится и выкатит на него android8? В x86 устройствах разочаровались все, за исключением китайцев, клепающих совсем непотребный треш за копейки. ARMv8 станет обязателен только с июля-августа 2019, но подобное железо уже сейчас прекрасно исполняет приложения под ARMv7.
                                +1
                                Проблема: собрав проект под платформу JS/HTML5 (для тестов), выяснилось, что текстов, написанных по-русски, просто нет.

                                Вот тут я совсем не понял юмора. Есть штатный Arial, в котором есть русские глифы и если используем штатные uGui компоненты, то все работает без проблем. Если мы говорим про TextMeshPro, то это вообще отдельная песня — он не умеет в динамический truetype-шрифт и хочет, чтобы все глифы были запечены в sdf-атлас в редакторе. В будущем они планируют приделать поддержку генерации глифов на лету, то нет никаких сроков.
                                  +2
                                  Проблема: Игра жутко начинает тормозить при наличии сложных коллайдеров, при использовании Continuous режима для Collision Detection, когда в одной сцене используется несколько Particle System, короче при использовании всего, что придает эффектность и красоту играм.

                                  А еще можно узнать, что 2д движок физики — это box2d. Теоретически можно попробовать все сделать через physx колайдеры с ненулевой толщиной и попробовать замерить скорость — раньше это 2д-поделие было гораздо медленнее, чем вылизанный 3д-physx.
                                  Вообще, любая физика — это очень тяжело и нужно очень четко настраивать в плане баланса между производительностью и удовлетворительным качеством симуляции.

                                  Системы частиц — сюда же, никакой физики на них быть не должно, такое неприятно даже десктопному железу, не говоря уже про мобилки. С партиклами есть еще одна проблема — это альфаблендинг и overdraw с ним, что очень сильно бьет по скорости рендера. Это чисто специфика мобильного-gpu железа.
                                    0
                                    хм, поэкспериментирую с physx, я всегда был уверен что 2d коллайдер по определению работает быстрее 3d
                                    +1
                                    Ну и вообще нужно понимать, что геймдев — оно такое. Тяп-ляп может слепить каждый, а чтобы оно реально было быстрым, занимало мало места и не вызывало отторжения — это труд.
                                    Еще какие-то вопросы имеются? :)
                                      0
                                      Спасибо, очень интересно было почитать мнение человека, хорошо знающего о чем говорит :)

                                      И да, есть один вопрос, какой движок для 2D порекомендуете именно вы?
                                      Не обязательно простой, можно и с высоким порогом входа.
                                        +2
                                        Если хочется высокой производительности, маленького размера и полного контроля, то только самопал на базе cocos2d, libdgx и т.п в качестве рендера, физику придется брать либо VelcroPhysics (бывший FarseerPhysics), либо Box2D. И так для каждого функционала, который потребуется. Часть новичков сбежала в Godot (но там даже нет gles2 поддержки, т.е хз как оно вообще на мобилках работает), активно пушат сейчас Defold (туда перебежал евангелист юнитехов Олег Придюк, больше о нем не слышал) из-за низкого порога входа. Но я ненастоящий сварщик, 2д мне крайне чуждо, я смотрю только в сторону 3д.
                                        З.Ы. Вот интервью, может будет полезным: app2top.ru/conferences/oleg-pridyuk-defold-imeet-smy-sl-poprobovat-esli-vas-ne-ustraivaet-unity-89171.html
                                          +1
                                          Использование новичком libgdx != высокая производительность. А если бы товарищ verych использовал Defold в своей игре, то статья была бы длиннее раза в два.
                                          Высокая производительность любого движка достигается умением разработчика работать с этим движком.
                              0

                              Отладка брейкпойнтами у меня работает в бесплатной версии, причем и в VS и VS Code, но… только один раз до следующей перезагрузки.

                                0
                                У меня в студии просто нет кнопки «Attach to Unity», есть только «Start», как в обычных проектах.
                                Возможно это как-то настраивается?
                                  +1
                                  К слову, только что был анонс 2018.3: blogs.unity3d.com/ru/2018/12/13/introducing-unity-2018-3
                                  We’ve updated the debugger extension for Visual Studio Code, an open-source, code-optimized editor available on macOS, Windows, and Linux. The Debugger for Unity extension provides debugging support for C# scripts in a lightweight environment, and the latest 2.x version adds various improvements, including support for the Mono 4.x scripting runtime. To get started, follow the setup instructions on the Visual Studio Code site.

                                  If you’re looking for a more integrated and feature-rich C# editing and debugging environment, there’s also Visual Studio and Visual Studio for Mac.


                                  OpenJDK installed with Unity

                                  By default, Unity now installs a Java Development Kit based on OpenJDK, ensuring you always get the correct JDK version.
                                0
                                А сколько ребенку лет? Игра в GP 16+ :)
                                  0
                                  Ну пока в сатану санту верит.
                                    0

                                    В сатану, хочется думать, верят и в возрасте хорошо так 16+...

                                    0
                                    Боюсь сильно меньше :) Но зато есть в дополнение миллион прикольных идей, которые я собираюсь реализовать, например, салютики вместо крови, конфетки вместо мясца, ну и в таком духе.
                                    +1
                                    Проблема: я потратил два дня на то, чтобы найти нужные SDK, JDK, NDK и сделать так, чтобы Unity с ними заработал.

                                    Странно. Буквально месяца полтора назад установил юнити побаловаться, чисто ради теста собрал все под андроид — установка заняла минут 15, из которых минут 10 эти библиотеки скачивались. Причем там и делать ничего не нужно было, я просто тыкнул собрать под андроид, и там юнити уже сама писала чего не хватает и предлагала перейти на сайты, где оставалось всего лишь нажать кнопку «скачать».
                                      0
                                      Проблема: при билде пустого проекта, его размер равен 21.9 MB (23,061,612 bytes)

                                      Замеры компиляции пустого проекта (android):
                                      6.4МБ armv7+il2cpp+stripEngineCode
                                      11.3МБ armv7+il2cpp (без stripEngineCode)
                                      10.4МБ armv7+mono+(strip assemblies)
                                      12.2МБ armv7+mono (без strip assemblies)
                                      Unity 2018.2.8f1 (64-bit)
                                        +4
                                        Статья якобы дает советы, а по сути советы дают автору.
                                        Я не против туториалов и советов, но не стоит писать статью с советами после первой пробы.
                                        Знающие люди не получили новой информации, а новички вряд ли поймут как решать эти проблемы, потому что Вы так и не написали как решить их, а просто пожаловались и предложили вариант как бы Вы хотели чтобы было удобно.
                                        Все проблемы в статье решаемы, если почитать документацию и немного знать математику.
                                        Не нужно ругаться на юнити, при изучении других технологий Вы наверняка тоже тратили время. Это нормально.

                                        Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                        Самое читаемое