21 сентября 2017

Инвалид изучает Unity, часть 2.

Продолжаю изучать Unity3D. И это реально больно. Прям везде. Сегодня немного о странностях и костылях, которые приходится прикручивать каждый день.
Лично я предъявляю к Unity высокие требования. Почему? Всё просто:
  • Я перехожу с Flash'а и хочу видеть расширенный набор тулзов. Иначе - зачем оно мне?
  • Да, сейчас много движков позиционируют себя именно как "для создания игр". Unity3D один из них. И хочется, чтобы он и его функционал были заточены под игры.
Конечно, если не цепляться за всё это, а просто говорить "ну ведь можно компилировать и запускать" - то всё ок. Но мы-то хотим видеть нечто большее, чем компилятор, верно?
В комментариях мне много интересного и полезного посоветовали. В тексте это будет красным.

Snap to grid

Редактор Unity вообще странный. Очень сложно двигается и масштабируется. Особенно вложенные объекты. С ними вообще беда. А когда я обнаружил, что нет встроенного "snap to grid", то вообще огорчился. Есть несколько бесплатных ассетов, но они либо очень сырые, либо какие-то монструозно-непонятные. Нашел скрипт на просторах.


И вроде он локально решает базовую проблему по округлению координат до нужного значения... но все равно лагает и иногда отказывается работать до следующего запуска соответствующего окошка. Жуть!
Как оказалось, в Unity есть стандартный snap. Выглядит вот так:


Вроде круто, а вроде и нет snap to object, snap to align и прочее... Но ничего - хотя бы так!

Prefab в prefab'е

Известная проблема с потерей связи с префабом, который затолкнут в другой префаб. И вроде я надеялся избежать подобной ситуации... но для хранения уровней не нашел более удобной системы. Один уровень = один префаб. Уже внутри него лежат префабы-элементы вроде дверей, замков, ключей и стен.
Пришлось покупать ассет Nested prefabs. Брал месяц назад, он стоил $15. Сейчас подорожал до тридцатки. Такие дела... Вроде ассет крутой, да. Но возникает мега-неудобство, связанное с тем, что для выставления любого параметра у ребёнка-префаба приходится городить страшную жуть в виде отдельного override-параметра.


И так для каждого параметра... Очень неестественно и криво. Но приходится жить.

Root-объект

Иерархия объектов на сцене - это отдельный головняк. Нет простого getChild() или childrenCount() и прочего. Ну л-а-а-а-а-дно, небольшой скрипт для этого можно за полчаса написать. Но возникла новая беда. У объектов, которые лежат в корне сцены parent == null. Вот так поворот! Это дико неудобно и бесит. Для того, чтобы пробежаться по объектам из корня, приходится заводить отдельный метод, который таскает их из gameObject.scene.GetRootGameObjects().
Ну как так-то, Unity?? Почему нельзя было сделать Root-объект, отнаследованный от GameObject? Или сделать таким сцену...
О-о-о, а вот тут я реально ошибся. GetChild() и childCount есть. А вот с Root'ом всё так - этого объекта нет, нужно костылить.

Где мой wordwrap?

Идём дальше. У TextMesh нет галочки wordwrap, чтобы буковки не вылезали за определенную область. Ок, ставим из магазина бесплатный TextMesh Pro. Но у него снова проблема - я не могу вытащить строки, на которые этот скрипт бьёт текст. Пришлось wordwrap самому костылить на TextMesh, чтобы знать текст в отдельной строке. Боль.
Да, у Canvas-компонента Text есть Horizontal Overflow и Vertical Overflow. Их минус в том, что узнать, как текст разбит - нельзя. Да и Canvas-компоненты мне как-то "не зашли"... чего сложного этот функционал было перенести в TextMesh? Ну да ладно...

Hex- цвета

Чёт я искал, но не нашел. В итоге пришёл к тому, что всё-таки нельзя штатно спрайту или тексту взять и присвоить вот в таком виде цвет SetFromHex(#05B0F3). Пришлось снова самому костылить скрипт для конвертирования Hex-цветов в Color. Да, это недолго - побил на r-g-b составляющие и вперед. Но ведь именно из таких мелочей и собирается игровой движок, разве нет?
Для преобразования цветов есть статический ColorUtility.TryParseHtmlString. Минус - hex-цвет приходится передавать в виде строки. И весь кайф от использования такого способа задания цветов вообще пропадает.

Альфа у родителей не влияет на детей. 

Представляете?! Меняешь прозрачность у родительского спрайта, а у детей ничего не меняется... Что за ерунда?? Вроде как и понятно, что GameObject не содержит в себе информации о рендере... но трансформацию-то запихнули, а? А может у меня вообще не визуальный какой объект, и компонент-позиция ему не нужна? И ведь менять прозрачность приходится часто - например, диалоговое окно фейдится, и с ним все его кнопки тоже плавно убираются. И вот одним щелчком такого не сделать! А-а-а!
Пока сделал с помощью дополнительного материала, который нужно не забыть положить всем объектам на диалоге. А, если у меня когда будет двойная вложенность подобного?! Тогда такой метод уже не сработает. Видимо скрипт придется городить... В общем, как-то дико все это.
Снова Canvas-объекты и Canvas Group. Такая штуковина передает альфу детям. Но я не хочу использовать канвас... Ок, в следующем проекте попробую эту штуковину! Может, понравится))

Если я где ошибаюсь - поправьте... кстати, у меня таких пунктов много уже набралось. Но пока остановлюсь на этом - мало ли другие проблемы сами разрешатся :)
Всем спасибо за помощь и подсказки! Реально круто!

Сообщения, схожие по тематике:

0 коммент.:

Отправить комментарий