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

Я не хочу использовать понятие «пост-мортем», поскольку я не хочу списывать со счетов своё каждое возвращение к NothernUI, но я полагаю, что данный текст будет подобием отчета.

Фронт работ и переизбыток функционала

Однозначно наибольшая и худшая проблема NothernUI. Мы не говорим о переизбытке функционала (feature creep), как он представлен в Oblivion Reloaded, но NorthernUI все-таки предлагает слишком много всего в одном моде, что совершенно точно должно было быть разделено на несколько модификаций.

Наибольшее сожаление у меня вызывает поддержка геймпада наряду с другим функционалом в едином DLL, и именно она и стала источником переизбытка функций. Единственная причина почему я имплементировал поддержку геймпада заключалась в том, что Xpadder/AntiMicro не мог удовлетворительно работать в меню игры. Единственный способ плавно управлять переключением между геймплеем и меню был в том, чтобы иметь действительно встроенную поддержку геймпада в игре. К сожалению, я был незнаком с тем, как Windows API работают с DLL. Я выучил С++ и Ассемблер х86, делая SKSE плагины, и SKSE, не как OBSE, предлагает простой механизм отправки сообщений между плагинами, так что я никогда и не нуждался в том, чтобы выучить Windows API. (по сути, когда дело доходит до С++, я учил всё самое сложное и нюансированное в первую очередь, всё самое легкое – в последнюю). Я не знал, как передавать сообщения между плагинами OBSE, так что, как по мне, всё, что нуждалось в доступе к состоянию геймпада, должно было быть частью единого DLL, так что поддержка геймпада встала на первое место. Вот поэтому такие функции как улучшенное движение и контроль камеры оказались в том, что должно было быть просто рескином UI.

Для тех, кому интересно, правильно было бы сделать поддержку геймпада полностью отдельным OBSE DLL и заставить его «экспортировать» функции, которые бы вызывались другими DLL. Тогда любой заинтересованный OBSE DLL мог бы использовать GetModuleHandle и для проверки (check) загружен ли DLL геймпада и для того чтобы получить доступ к экспортированным функциям посредством GetProcAddress. С таком системой такой функционал, как улучшенное движение и поведение камеры, был бы частью еще одного DLL, тем самым всё было бы аккуратно отделено друг от друга.

(Ох, говоря об этом: не находите камеру игры некомфортной и дезориентирующей? Не бесит ли вас, когда камера стрейфится, пытаясь заглянуть в сторону вашего движения, да так, что движение диссинхронизируется с камерой? Достали каждый раз возникающие резкие раскачивания камеры при беге через бордюр? Отключите опцию NorthernUI "Camera Inertia" чтобы убрать «головокружительный» опыт. Я буквально забыл, что сам же это и придумал, и обнаружил это только сегодня, и ё-маё, как же лучше игра воспринимается теперь! Я так благодарен за то, что в Скайриме этой инерции камеры больше нет. Я всё еще оставляю её включенной (но с фиксами), как настройку по умолчанию, поскольку Обливион остается Обливионом и должен быть Обливионом по умолчанию.)

Если бы мне пришло в голову полагаться на этот вид связи с DLL, я мог бы также позволить NorthernUI предоставить API для своего меню параметров: я мог бы определить классы «обработчиков опций» (option handler) с виртуальными функциями-членами и позволить NorthernUI получить указатели (pointers) на их экземпляры (instances). Другие DLL могли бы определить свои собственные под-классы, которые перезаписывали бы эти функции чтобы специфицировать тип виджета опции (чекбокс, слайдер, т.п.), содержать значение, реагировать на изменение значения и тому подобное. Эту идею можно было развить и дальше, позволив другим DLL вставлять вложенные структуры меню (to insert nested menu structures). Если бы я отделил мое улучшенное движение и патчи для камеры каждый в свой собственный DLL, они бы могли использовать такой фреймворк. Это было бы полезно и для многих других DLL-модификаций в Обливионе. (Однажды я таки рассмотрел логистику, позволяющую скриптам добавлять пункты меню в меню параметров, но я не смог придумать хороший дизайн API для них.)

Схемы Управления

NorthernUI включает в себя несколько пред-определенных (pre-defined) схем управлениях и позволяет вам выбрать один из них. Я не думаю, что постарался правильно презентовать эту функциональность, но уж точно на совесть потрудился имплементировать её в игру. Этот подход был вдохновлен играми на подобии Halo, где игрок имеет широкий выбор схем управления, акцентирующих внимание на разных действиях и способностях, таких как иконический Bumper Jumper, предполагающий, что игрок прыгнет и нанесет удар без того, чтобы пришлось убирать для этого пальцы со стиков джойстика. Я хотел предложить несколько хороших схем управления, но также и дать игрокам возможность сделать свои. Насколько помню, в Borderlands 2, напротив, дают немножко уже созданных схем управления, позволяя игроку просто сделать одну свою кастомную, что несколько сужает выбор, но, быть может, интуитивнее того, что создал я.

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

Однорукие схемы управления – вещь, которой я вполне горжусь. Они были вдохновлены прямо и полностью спидраном нескординированного бега в NieR:Automata у Games Done Quick. Я пытался задизайнить каждую схему управления так, чтобы большая часть критически важного для геймплея функционала была доступна легко и быстро, хоть я и не настолько опытен в играх, чтобы бросить им вызов самому. Я едва двумя-то руками управляюсь.

Вызовы Совместимости

Трудности в вопросе совместимости, которые появляются при создании рескина UI, это то, чего я совсем не предусмотрел. Оказалось, что просто куча скриптовых модов опираются на доступ к UI чтобы изменить состояние игры и её функционал, а скриптовые функции, на которые эти моды опираются, впечатляюще хрупки. UI-команды и у OBSE и у MenuQue требуют чтобы элементы UI были доступны по полному пути (fully-qualified path). Это значит, что, измени я структуру элементов (how elements are nested) или измени я название любого элемента, вложенного в эту иерархию, тут же эти команды перестанут работать.

Некоторые из авторов этих модов включали в код автоопределение DarNified UI и использование отличающихся путей к элементам под него. Мне приходит на ум один автор, включивший пути к элементам во вторичный файл как переменную, так что в теории можно было бы легчайше добавить новые пути к нему. Но большая часть авторов едва ли планировали наперед, что новые переделки UI вообще когда-нибудь появятся… а эти авторы исчезли годы и годы назад.  Некоторые такие моды имеют закрытые разрешения (closed permissions), так что создать патчи конкретно под них не представлялось возможным (плюс к тому Обливион включает свои скрипты прямо в файлы ESP, так что патчи совершенно выжгли бы все слоты порядки загрузки).

Я ведь и в Обливион не часто играю, да и никогда не играл. Я взял копию на распродаже год назад и решил поиграть время от времени, отвлекаясь от событий в собственной жизни, помешавших работе над проектами для Скайрима. Так вот и получилось, что мне очень сильно не понравился UI Обливиона, и уж очень мне захотелось его адаптировать под нечто более привычное, что и вылилось в…это. Мой опыт игрока потребовал включения в игру наиболее популярные графические моды и парочку фиксов для стабильности, и понеслась. Те категории модов, которые вмешиваются в работу UI, это именно те категории модов, которые я, как ультра-казуальный игрок (да и, прямо скажем, не игрок вообще), никогда бы не нашел сам по себе, так что я был совершенно ошеломлен размахом несовместимостей.

В итоге я в некоторых случаях отмодифицировал UI так, чтобы у модов, требовавших полного пути к элементам, был-таки доступ, но к невидимым элементам,созданным под них, а после UI бы копировал информацию из них и\или из этих фейковых элементов (dummy elements). В свою очередь это потребовало внимательно прочесть то, что, собственно, эти моды хотели. (Это было действительно тяжело, ведь я не привык к скриптовому языку Обливиона, и мое взаимодействие с ним редко было приятным: неудобно редактировать, неудобно компилировать, а компиляция часто выходит неправильной…). В других случаях было проще и чище просто взять концепцию мода и имплементировать её в NorthernUI самому, как часть его функционала.

Никаких векторов, только растеризация, Финальная Точка

UI Скайрима использует векторную графику по подобию фреймворка Scaleform, который позволяет запускать Adobe Flash прямо внутри игры, что важно. (Примерно половина читателей собирается сказать: «Ого, Беседка точно сделала бы что-то настолько кривое!» Но это касается не только их.) Из-за этого модифицирование UI становится очень недоступным, ведь тебе для модифицирования нужна конкретная версия конкретного софта, созданного конкретно под бизнес и с конкретным ценником для бизнеса, не говоря уже о том, что Scaleform перестали поддерживать пару лет назад. Но, как ни странно, есть одно преимущество: ты получишь все плюшки Adobe Flash, включая векторную графику, которую можно отображать великолепно сглаженными линиями при любом увеличении, а также использовать JavaScript, если нужно нечто подобное.

Напротив, в Обливионе UI использует XML и текстуры DDS. Игра берет этот XML и рендерит элементы внутри себя в 3D, как серию динамически конструированных четырехугольников с нанесенными на них текстурами (quads with textures mapped to them). Это значит, что вся UI графика, включая шрифты, является игровыми текстурами, вот почему различные настройки графики игры влияют и на UI. Это значит, что и FOV, если изменен, полностью разрушает все подогнанные под друг друга элементы UI. Ну то есть, формат файлов для шрифтов Обливиона буквально определяет каждый глиф в размерах (size), выравнивании (alignment) и UV координатах текстуры. Для NorthernUI всё это привело к куче последствий, некоторые из которых были очень и очень непредсказуемыми.

По ходу наистраннейшая проблема, с которой я столкнулся, если к курсору мыши в игре применяется какое-либо сглаживание текстур (что происходит по умолчанию), то каждая текстура пользовательского интерфейса, кроме курсора, в итоге окажется абсолютно испорченной. Представьте себе, что вы уменьшаете изображение вдвое, снова увеличиваете его с помощью ближайшего соседа (nearest-neighbor), а затем невероятно размываете его. Этой проблемы с оригинальным UI игры не обнаружить, поскольку скевоморфический (skeuomorphic) дизайн Бесезды действительно сильно не затрагивается этой проблемой, но, если ты создашь дизайн с чистыми, четкими линиями, всё пойдет по очень плохому сценарию. Пришлось хакнуть часть движка именно для того, чтобы исключить курсор из сглаживания текстур, так что теперь он рендерится с неровными линиями, но все остальное выглядит нормально.

Всё, кроме этого, было лишь проблемами самого дизайна. Растровая графика четко не масштабируется, а поскольку Обливион адаптирует интерфейс к вашему соотношению сторон, интерфейс всегда будет масштабироваться немного больше, чем нужно. Формат шрифтов тоже масштабируется не очень хорошо. Теоретически, можно было создать текстуру шрифта сверхвысокой четкости и затем присвоить глифы маленьким четырехугольникам, позволив и маленьким шрифтам рендериться чётко и чисто даже при ультра-высоких разрешениях экрана. На практике что-то странное творится с UV, так что текстуры шрифтов не обрезываются правильным образом, и буквы искажаются.

Если спросите, чего я больше всего хотел бы сделать, так всё просто: добавить в каком-либо виде поддержку векторной графики прямо в движок. Если можно было бы рендерить SVG и, возможно, настоящий формат шрифтов, то создание высококачественных UI при любом разрешении было бы намного проще реализовать, и тогда было бы намного проще предложить широкий выбор для таких вещей как масштабирование интерфейса и (в частности) размеров шрифтов, последнее было бы прекрасным параметром доступности (accessibility option). NorthernUI как он есть может быть и выглядит для вас хорошо, но, тем не менее,  я не могу не замечать, как рамка компаса (при настройках по умолчанию) заметно жирнее рамок здоровья\магии\усталости, поскольку отмасштабируй ты компас чуть меньше, и его рамка размажется к ядреной матери на большей части разрешений экрана.

В один момент, когда я пытался понять, в чем проблема со сглаживанием текстур, я настолько отчаялся, что я взял, да и создал 3D модель элемента из Скайрима в Блендере, а именно элемент «вверх» в полосках прокрутки (scrollbars), то есть крышку. Обливион позволяет включить NIFы прямо в UI (это и позволяет запускать комплексные анимации, включая мини-игры взлома замков и колесо убеждения),  потому я и решился использовать эту возможность как легкий способ заменить «векторную графику». Но помните, что я сказал прежде: интерфейс рендерится с теми же настройками графики, которые установлены и для мира игры. (Из интерфейса также удаляется большая часть шейдеров при этом, но я легко остановил это безобразие патчем.) Крышка полоски прокрутки, которую я сделал, выглядела бы идеально сглаженным при высоком сглаживании, но, если правильно помню, Обливион использует MSAA, что очень нагружает компьютер. Без сглаживания этот элемент становился искаженным и совершенно непригодным к использованию. Позорище!

Трехмерная крышка в NifSkope, с выделенной серой частью и видимыми краями многоугольника. В основном это был 3D-эквивалент трассировки, но, если не изменяет память, чтобы упростить работу я разрезал диск пополам, чтобы получить закругленное основание.

Вот, как я говорил, я очень горд своей работой над растровой графикой. Я вычленил оригинальные SVG из интерфейса Скайрима как визуальный референс, но Бесезда не позволяет авторам портировать официальные ассеты между играми, так что у графики NorthernUI пикселизированные мной вручную элементы с помощью GIMP. Я перерисовал почти всё и очень горд полученным результатом. Первые попытки просто старались походить на Скайрим, но там было много нюансов в том, как устроены рамки и линии, на что я обратил внимание во вторую очередь. Я пишу это не для того, чтобы кичиться и хвастаться. Скорее речь идет об удаче в том, что удалось сделать так хорошо, смекаете? Я давно не работал с подобным типом пиксель арта, да и программирование мне намного ближе, так что весь полученный опыт с артом уже выветрился из головы.

Исходное изображение угла блока слева при масштабе 200 % и текущее изображение угла блока справа при обычном масштабе. Обратите внимание на особенности линий справа, имитирующих оригинальную векторную графику в Skyrim.

Исходное изображение компаса слева при масштабе 300% и текущее изображение компаса справа при обычном масштабе. Обратите внимание, что новая графика более соответствует образцу (on-model), как с точки зрения пропорций и углов, так и с точки зрения того, где узел перекрывается.

Переделка ассетов в высоком разрешении была наилучшим решением, которое я только мог принять в работе над этим модом. Больше пикселей – больше пространства для работы, буквально. Это и помогло в том, чтобы получить правильные ракурсы и сохранить наименьшие детали. Помогло то, что мне не нужно было быть абсолютно точным. Если вы внимательно посмотрите на новую крышку компаса, вы, вероятно, увидите некоторые неровные края и некачественное сглаживание; поскольку Обливион всегда хотя бы немного масштабирует пользовательский интерфейс, «идеальное» сглаживание часто выглядит в игре хуже, а слишком грубые или резкие края будут размазаны ровно настолько, чтобы их сгладить. Это означает, что мне не нужно было имитировать до пикселя векторную графику Skyrim; этого было достаточно, чтобы на 90% соответствовать образцу.

Горячие Клавиши

Много людей просило поддержку горячих клавиш (hotkeys) на геймпадах Xbox, отчего ответ на это медленного сдвинулся от «надеюсь, что скоро» к «возможно, позже» и, наконец, к «скорее всего нет», если быть честным. Я углубился в некоторые проекты по Скайриму (пока пишу эти строки я делаю альтернативу Creation Kit, сделанную с нуля*) и я боюсь, что, отбросив эти проекты на слишком долгое время, я уже никогда к ним не вернусь. Я посматривал на систему горячих клавиш в Обливионе время от времени, но она выглядит…странноватой. Возможно, сейчас-то я выучился достаточно чтобы понимать всё это несколько более полно, но как я уже сказал – другие проекты! Из того, что я наблюдаю в комментариях, вы все сами нашли свои пути компенсировать это зияние в функциональности. Хотя бы так.

Я могу по крайней мере объяснить кое-что из того, что знаю, чтобы легче было искать.

Самое странное по теме горячих клавиш заключается в том, что Бесезда не хранит одну единственную вещь (заклинание) по ключу (store one single item per key). Под капотом они хранят список (list) предметов (или заклинаний) по ключу, но при этом они, как кажется, позаботились о том, чтобы список содержал только один предмет. Там еще около полдесятка полностью не-определенных переменных в движке, которые связаны с системой горячих клавиш, некоторые из которых, кажется, являются таймерами. Мое главное опасение касается того, что я не хочу даже пытаться имплементировать доступ к горячим клавишам на геймпаде, когда я едва понимаю как эта система работает на банальных клавиатуре и мыши. Я должен сперва понять, зачем Бесезда использует список, и что это за переменные, а времени копаться в этом глубоко у меня нет.

* Это проект DovahKit, о котором с 2021 года ни слуху, ни духу. Но на сайте автора он до сих пор упоминается. – АrtSH.

Что ж, это было всё на сегодня

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

Я никогда не ожидал того, что NorthernUI получит столько внимания. Как создатель контента, я «свой» в Скайриме, так что, когда я опубликовал NorthernUI, я считал Обливион мертвой игрой и никак не предполагал, что он сорвет трехзначное количество «одобрений». Вы меня убедили, что я не прав, за очень короткое время: те из вас, кто прилип к The Elder Scrolls IV, невероятно преданны этой игре. Я пытаюсь не отвечать на сообщения, если только они не содержат реквесты или чего-то подобного, поскольку я чувствую себя неловко, когда дело идет о похвале. Просто половина моих комментариев посвящена похвале мода и благодарности мне, и это выглядит нескромно.

Однако я действительно читаю каждый комментарий, и меня впечатлило такое количество людей, которые до сих пор любят Обливион, и после всего этого времени говорят мне, как мой мод помог им вернуться к старой классике. Игры – не моя сцена, сказать по правде, но коль люди говорят, что я помог им вернуть ту самую магию, то это даже трудно осмыслить. Я рад, что даже при всех недостатках, NorthernUI смог помочь классической игре продолжать жить – и слегка модернизировать её для тех, кто этого хотел.

Переводчик: ArtSH
Автор: DavidJCobb
Источник: Перейти
1

Комментарии

Авторизуйтесь, чтобы оставить новый комментарий. Или зарегистрируйтесь.