Project qt что за игра
Взломанный Project QT
Увлекательная визуальная новелла с элементами ролевой игры, которая порадует всех совершеннолетних поклонников аниме. Ведь здесь на вас ждет большое количество откровенного контента и пикантных сцен.
Геймплей
По сюжету игры на северном полюсе люди проводили экскремент с черной дырой, но что-то пошло не так и из другого измерения на Землю начали вторгаться инопланетные монстры в виде красивых девушек. Поэтому мир начал погружаться в хаос, но группа отважных девушек стала на защиту планеты и решила сразиться со всеми монстрами, что вторглись на планету.
Ваша задача собрать команду красивых девушек и вступить ими в сражение против монстров, чтобы защитить человечество. Каждая девушка обладает своими уникальными качествами, а также имеют свои сильные и слабые стороны. Комбинируйте девушек, чтобы собрать сильную команду, которая сможет противостоять всем монстрам.
Своей отважной командой вы возьмете участь в пошаговых битвах против симпатичных врагов. В каждой битве вы сможете своими девушками наносить различные удары и создавать защитные заклинания.
Особенности игры
В этой игре вы погрузитесь в фантастический мир, в котором вам предстоит собрать команду красивых девушек, чтобы противостоять инопланетным монстрам, что вторглись на Землю.
Опыт разработки аркады под Android на С++ и Qt
Космос сам себя не наложит
Предпосылки
Я, как и многие программисты, выбрал эту профессию, потому что в детстве играл в компьютерные игры и мечтал их разрабатывать. Как только я научился более-менее писать код, который может компилироваться без синтаксических ошибок, я, конечно, стал делать всякие глупые игры, которые показывал всем друзьям и знакомым. Но время шло, и оно заставило заниматься совершенно другими вещами, работать над проектами, которые, мягко говоря, серьезней, чем игры. И так продолжалось последние несколько лет. А изначальные желания никуда не делись, исчезло только свободное время.
Давно хотел сделать какой-нибудь проект под Android, а, как известно, основная масса проектов разрабатывается на Android SDK и Java, а NDK рекомендуют использовать только в “критичных по скорости” местах и не делать на нем все целиком.
Но кому нужны все эти рекомендации и правила, когда есть Qt? Java я не знаю в той степени, которую считаю достаточной для качественной разработки игры, и изучать мне ее не хотелось, зато у меня имеются в запасе знания C++. После нескольких тестовых проектов на Qt под Android я понял, что на нем вполне можно разработать полноценное приложение, да еще и перенести его на другие платформы. Так же, посмотрев видео Shia LaBeouf — Just Do it, стало понятно, что я обречен это сделать.
Итак, я хочу рассказать про опыт разработки игры под Android на Qt 5.5.1 и С++.
Внезапно, захотелось сделать игру про нечто, падающее в пещеру, контуры которой меняются со временем. Первоначально предполагалось сделать двухмерную игру с графикой в рисованном стиле. В дальнейшем все перетекло в трехмерную игру с видом сверху. Был написан генератор пещеры, который позволял создавать слои с контурами. Как рассчитывать столкновения с стенами пещеры и как превратить их в трехмерную модель? Можно было долго думать и выдумать что-нибудь невероятно классное, но я пошел обходным путем и сделал воксельную геометрию мира. Расчет столкновений и вывод на экран стали заметно проще, но ценой того, что игра стала похожа на майнкрафт. Я не растерялся и сделал её еще больше на него похожей, добавив модель персонажа из него же. Так и сформировался вид и концепция игры.
Первая версия генератора пещеры (архивное фото)
Приступая к разработке игры, я не ставил себе цель заработать на ней, как многие, а хотел просто начать свой проект и довести его до конца. Поэтому игра должна быть бесплатная (кто у меня ее купит?), но все-таки с минимальным количеством рекламы.
Графика
Средства
Для реализации игры я выбрал QOpenGLWindow, а пользовательский интерфейс пришлось велосипедить самому.
Обновление кадров было реализовано по сигналу frameSwapped(), который генерируется после swapBuffers. Использование этого сигнала позволяет достичь большей плавности смены кадров, чем при использовании таймеров.
Для расчета анимации мне требовалось посчитать время кадра. Для этого я использовал сначала QTime, что было плохой идеей, так как этот класс считает немонотонное время, а на мобильном устройстве часто происходит корректировка времени, что приводило к попаданию в прошлое или будущее, в зависимости от ухода часов на устройстве. Также разрешение изменения этого класса ограничивается миллисекундами, что недостаточно для плавной анимации при нестабильном фпс.
Поразмыслив и обратившись к документации, я решил использовать класс QElapsedTimer, который старается использовать монотонное время и имеет разрешение до наносекунд.
Текстуры и интерфейс
Для первых версий и отладки текстуры были позаимствованы временно из майнкрафта, как и какой-то скин персонажа. Первая версия интерфейса представляла собой серые квадратные кнопки и была сделана за вечер, а переработка заняла целый месяц.
В качестве дизайнера был выбрал мой друг. Плюсами такого выбора является то, что этому дизайнеру можно доверять, а минусами — то, что он не является дизайнером — он автомеханик.
В дальнейшем мы нарисовали оригинальные текстуры для нескольких уровней и сделали текстуры персонажей.
Процесс рисования “красивого” интерфейса и персонажей оказался довольно длительным. Пока дизайнер пытался выдавить из себя нового персонажа или кнопку, мне ничего не оставалось делать, кроме как продолжать оптимизировать код.
Текстура уровня представляет собой большой атлас всех блоков и вмещает в себя 32 куба со стороной 16 пикселей. При таком подходе при рисовании слоев не требуется постоянно переустанавливать текущую текстуру, а можно рисовать весь уровень, используя вершинные буферы за несколько вызовов.
Проблема возникла в крайних пикселях блоков, которые являются смежными с другими блоками. При округлении текстурных координат стали появляться артефакты в виде полосок на краях блоков. Эту проблему я решил путем добавления каждому блоку окантовки шириной в один пиксель, дублирующую пиксель края блока. Такой своеобразный CLAMP_TO_EDGE.
К сожалению, при таком подходе я не смог использовать mipmap для уровня, т.к. текстурные координаты в вершинном буфере должны учитывать это смещение на один пиксель, а при создании текстуры уменьшенной детализации это смещение становится меньше, и мне бы пришлось использовать различную геометрию уровня в зависимости от степени детализации. Я решил с этим не заморачиваться, т.к. сама текстура уровня всего 256х256 пикселей, и особого выигрыша в производительности билинейная фильтрация не принесла бы, а принесла бы лишь дополнительные сложности в реализации.
Еще хотел заметить, что хотя блоков и всего 32, но в свойствах уровня я задал возможность расставлять блоки повернутыми на 90, 180 и 270 градусов, а также анимацию переключения между текстурой блока, что позволило разнообразить визуальную составляющую игры. Хотя, анимацию я применил только на одном из уровней для создания эффекта вращения вентиляторов.
Шейдеры
В Qt имеются удобные классы для работы с шейдерами. Я использовал QOpenGLShaderProgram. Этот класс позволяет добавлять вершинные и фрагментные шейдеры, компилировать их, линковать, устанавливать uniform и attrubute. Сам по себе класс является просто оберткой над множеством вызовов OpenGL и, соответственно, не является полноценным объектом, в том понимании, что работу класса можно нарушить, используя вызовы GL напрямую между вызовами этого класса.
Удобно то, что класс автоматически добавляет define таким образом, что шейдер ES компилируется нормально и на десктопе и на мобильном устройстве. Это относится в первую очередь к спецификаторам точности, которые на десктопе превращаются в ничто.
Мне пришлось написать отдельные шейдеры для игрового мира, включающие освещение и анимацию некоторых блоков, шейдер для персонажа и шейдеры интерфейса.
Бар хп\щит
Этот бар я решил реализовать шейдером, сначала мне это показалось очень странной идеей, но в конце концов я ее принял как неизбежное и реализовал таким способом:
Итог всего этого — если вы планируете использовать шейдеры в мобильной игре, проверяйте их на самых распространенных моделях графических ускорителей. Если шейдер компилируется и работает у вас на компьютере, это еще не означает, что он будет работать на телефоне вашего соседа. Новый Vulkan API должен решить проблему с различными компиляторами шейдеров и привнеси порядок в этот безумный мир, но это дело будущего, а сегодня имеем то, что имеем.
Звуки
Поиск
Звуки — это вообще отдельная песня. Их можно записать самому, что довольно трудоемко и требует наличия нормального микрофона и слуха (не наш случай). А можно найти желанные звуки в интернете.
Искать звуки желательно с лицензией Creative Commons 0, дабы не указывать авторство для каждого звука, коих может быть несколько десятков. Может показаться, что найти нормальный free звук довольно тяжело, и оно так и есть. Проблема не в том, что их мало, напротив, — их очень много, большинство из которых ужасны. Поиск звука — процесс, в котором надо переслушать очень-очень много звуков и выбрать из них самые подходящие.
Средства
В Qt для вывода звуков существуют классы QSound, QSoundEffect, QAudioOutput и QMediaPlayer. В первых версиях я использовал QSoundEffect для вывода эффектов и QMediaPlayer для вывода звуков. Но, как оказалось, все они не подходят.
Все эти недостатки привели к тому, что после добавления звуков в игру появились ощутимые проседания FPS при воспроизведении звуков и музыки.
Решением стал отказ от этих классов и использованием для звуков библиотеки SFML. Очень простая и легковесная библиотека, похожая на SDL. Удобные классы для работы с графикой, звуком, устройствами ввода. Эта библиотека не умеет работать с mp3 (лицензия, все дела), но зато умеет многое другое. Я использовал для эффектов и музыки формат ogg.
Вывод по звукам
Для использовании в приложении, где звуки являются чем-то необязательным, Qt-шные родные классы подходят. Для разработки игр — совсем нет. Лучше и проще использовать SFML.
Реклама в приложении
Для рекламы я использовал уже готовую реализацию AdMob под Qt — QtAdMob.
Сперва был добавлен только один маленький баннер в меню, но в дальнейшем образовалось межэкранное объявление.
Занятно, что межэкранное объявление, находясь даже в загруженном состоянии, появляется с некоторой задержкой. То есть появилась необходимость блокирования пользовательского интерфейса в момент появления рекламы и восстановление после ее закрытия. При этом, библиотека не позволяла отловить моменты, когда объявление показано и закрыто. Данный функционал библиотеки я допилил в версию под Android. Версию под ios трогать пока не стал, за неимением возможности проверить работоспособность.
Аналитика и статистика
Выкладывая первую версию на Play Market, я понадеялся на статистику в консоли разработчика. Но, как оказалось, статистика активных пользователей завязана на Google Analytics и не работает, пока в приложении не включишь трекер аналитики. А та статистика, что доступна, приходит с задержкой более суток и рассчитывается по тихоокеанскому времени. Такое положение дел не позволяет понять, как же твои действия влияют на скачивания. Поэтому я дополнил класс activity из QtAdMob, который наследуется от QtActivity функциями инициализации аналитики и функциями отправки событий игры. Примеры кода не привожу, т.к. все прекрасно описано в документации.
В события я вынес нажатие всех кнопок интерфейса, возникновение некоторых игровых ситуаций, открытия и разблокировки персонажей с уровнями.
Благодаря сбору всей этой статистики я могу сидеть за ноутбуком и наблюдать в реальном времени, как в Бразилии кто-то запустил игру, не смог пройти первую миссию, вышел и, вероятно, удалил игру.
Еще, если верить статистике,- мы сейчас чемпионы по нашей игре.
Про Google Play
Консоль разработчика сама по себе довольно удобный инструмент, но функционал статистики и рекламы завязан на другие аккаунты.
Чтобы полноценно разрабатывать приложение самому, необходимо как минимум иметь аккаунты AdWords, AdSense, AdMob, Google Analytics. При этом между ними устанавливается связь. Все эти аккаунты — отдельные продукты Google и имеют различную техническую поддержку и настройки. Также стоит заметить, что аккаунт AdMob требует наличия аккаунтов AdWords и AdSense. При этом все эти аккаунты могут быть привязаны в единственном экземпляре к основному аккаунту Gmail. Но, как показала практика, во всем этом можно запутаться с самого начала, потому что ты открываешь один сервис, он тебе предлагает создать новый аккаунт в другом, тот в третьем и так далее.
Я каким-то магическим образом так, что сотрудник техподдержки не смог объяснить произошедшее, создал 2 аккаунта AdWords и привязал их к одной почте, при этом привязав один аккаунт к консоли разработчика, а другой к AdMob (об этом я не знал).
На один аккаунт я закинул 500р, чтобы проверить рекламную кампанию. В попытках разобраться с этим и следуя советам техподдержки, я перенес один из аккаунтов на “левую” почту и закрыл сам себе доступ к нему. Все это привело сначала к неработоспособности обоих аккаунтов с моей почты, затем, при повторных отключениях и подключениях самого себя, работоспособность вернулась. Но, как выяснилось, перестал работать AdMob. Так как AdMob мне был важнее тех 500р, пришлось провести всю эту процедуру заново, попутно молясь о том, чтобы я не потерял доступ вообще ко всему, вернуть работу AdMob. И конечно, те 500р остались висеть на не подключенном аккаунте.
Так что, аккуратнее с этим.
Перевод
В игре
Игровое меню мы перевели на 2 языка — русский и английский. Выбор языка игры осуществляется по системной локали. Если в системе русский язык — то игры на русском, во всех остальных случаях — на английском.
Для осуществления переводов текстовой информации в Qt существует встроенный механизм, приводящийся в исполнения классом
Все строки, которые необходимо перевести, передаются в функцию QObject::tr(), для классов, не являющихся наследниками QObject можно использовать функцию QApplication::translate и для строк, объявленных в массивах макросы QT_TRANSLATE_NOOP, QT_TR_NOOP.
Но это только полдела. Необходимо создать сами переводы, что производится программами lupdate и lrelease. Первая собирает информацию из исходного кода, содержащего эти функции и макросы, и создает Xml файл с информацией для перевода.
Вторая собирает из xml файла бинарный файл qm, который загружается непосредственно в QTranslator.
Мы использовали в качестве переводимых строк что-то вроде тегов, которые затем переводили на английский и русский. Например, “#GameOverText” переводится в “Игра закончена”. Сделано было так, чтобы не было необходимости менять исходный код, чтобы что-то по-другому написать, а затем еще и менять все переводы, т.к. для lupdate это уже другая строчка.
На маркете
В Google Play мы пошли по самому простому пути: написали текст на русском — закинули в гугл-переводчик — перевели на английский, подкорректировали. А затем английский текст перевели на самые распространенные языки тем же самым гугл-переводчиком. Забавно, что один из вариантов описания содержал фразу “Окунись в подземелье с головой”, которая, пройдя весь этот пусть переводов на китайском, означала “Прыжки в пещере на голове”. Мы так и оставили, потому что раз они нам на АлиЭксперессе перлы выдают, так и мы не будем отставать.
Заключение и планы
В заключение хочу сказать, что процесс разработки этой игры был и является одним из самых интересных занятий, принес нам огромное удовольствие и опыт, которым я скромно делюсь в этой статье. Разработка велась в свободное время, после работы и ночью, с августа этого года. Потрачены деньги были только на аккаунт разработчика и пару тысяч на рекламу, так что я не расстроюсь, если нам эта игра принесет чуть менее, чем ничего.
Дальнейшие планы зависят от того, как люди будут реагировать на наше творение. Судя по отзывам, довольно неплохо, но судя по скачиваниям и удалениям, хочется сходить за веревкой в ближайший магазин хозтоваров. Вероятно, игра получилась довольно сложная, и у нас явный недостаток рекламной деятельности
Мы планируем перенести игру под ios, но этому мешает отсутствие яблочной техники и 100$ в год, а так же пугает перспектива общения на эльфийском Objective C.
Я надеюсь, что это не последняя наша игра, есть множество новых идей, которые я буду стараться воплотить в жизнь, учитывая полученный опыт. Эта игра — первый блин, комом он или нет — судить не мне.
Предвосхищаю комментарии по поводу того, что это можно было сделать проще и быстрее, используя готовые движки, привлекая дизайнеров и издателей. Отвечу на это, что мы желали пройти путь джедаев-разработчиков с начала и до конца, своими силами, дабы окунуться в это с головой.
Разработка казуальных игр с помощью Qt Framework
Содержание:
1 Что нужно для выпуска игры?
В этом разделе описано почему
я предлагаю использовать Qt Framework.
Многие хотят разрабатывать игры, но не все попробуют это делать. Совсем незначительная доля программистов завершит работу и выпустит хоть что-то, во что можно играть. На самом деле, после того, как я опубликовал ряд материалов по этой теме на блоге, ко мне начали массово писать в социальных сетях с просьбой «научить» или предложением «разрабатывать игры вместе и учиться». Все они получали от меня очень простую задачу — ссылку на одну из моих заметок с описанием заготовки игры типа этой [13] и предложение разобраться с материалом, слегка доработав пример. Ни один начинающий «Game Developer» с этим не справился.
1.1 Чужой негативный опыт. Как не потратить время впустую?
Тот факт, что десятки человек хотят что-то разрабатывать, но не могут осилить 200 строчек хорошо документированного кода говорит о том, что дальше желания у этих людей никогда не зайдет, т.к. в «дикой природе» такой код вообще редко встречается. Чего же этим людям не хватает?
Чтобы не стать одним из них нужно начать писать побольше кода на том языке программирования, который лучше всего знаешь. Таким языком может быть и Паскаль и Бэйсик. Надо понимать, что на нормальное освоение С++ или Java уйдет уйма времени и эта задача никак не связана с целью «разработки игр».
1.2 Мой личный опыт
Впервые разработкой игр я занялся учась на четвертом курсе — меня попросили написать игру «Питон» с разными доработками. Игру я писал на C++, а графику реализовал с помощью WinAPI. Это была курсовая, сделанная для какого-то двоечника.
Больше разработка игр меня не интересовала, но в 2012 году я случайно устроился работать в фирму, которая только этим и занималась. Пол года я писал игры на их самопальном движке, мне стало скучно, уволился. Кстати, используемый в этой конторе движок был просто ужасным, хотя с его помощью были разработаны десятки игр. Движок позволял управлять анимацией, и привязываться к таймеру. Привязка всегда осуществлялась с сallback-функции, а логика разрабатываемых игр провоцировала вкладывать одну лямбда-функцию в другую десятки раз. Код получался отвратительный.
Уволившись я за пару дней написал аналогичный движок с использованием библиотеки Qt. Написал и понял, что если использовать Qt — то такой движок вообще не нужен, т.к. в этой библиотеке есть на порядок более удобные встроенные механизмы;
В 2014 году я устроился на работу Java-программистом. С разработкой игр это связано не было, но пришлось работать и графическим интерфейсом и отображением информации на географической карте. В это время я смог оценить насколько Qt удобнее Swing и прочих библиотек построения интерфейса для Java. При этом в разработке игр огромное внимание уделяется интерфейсу.
На настоящий момент на google play можно найти две мои поделки — казуальные игрушки. Первая — ремейк старой логической игры «Полный квадрат», результаты я описал в статье «Разработка игры на С++, Qt» [1], «Публикация Qt-приложения для Android» [2]. Вторая — логическая игра на развитие памяти по мотивам школьных графических диктантов: «Разработка игры для развития памяти под Android (C++, Qt)» [3]. Каждый раз после завершения игрушки (да и других поделок) я просматриваю код и выбираю фрагменты, которые можно использовать повторно — описываю их на блоге или на форуме [4].
1.3 Чужой позитивный опыт
На Хабрахабр описано множество хороших мотивирующих статей из которых можно сделать выводы о правильном поведении успешного программиста, вот пара из них:
Вы можете поискать и другие подобные истории, но вы точно не найдете среди историй со счастливым концом такую, где автор поступил в ВУЗ, протупил 4 года, получил диплом и … — написал успешный продукт. Эти статьи мотивируют (и правильно) садиться и писать код вне зависимости от вашего образования. Читать параллельно книжки никто не запрещает.
2 Qt и мобильная разработка
В этом разделе приведены ссылки
на материалы, которые помогут вам выпустить свою первую игру
Вся эта длинная преамбула написана чтобы убедить:
Во многих школах и ВУЗах изучают язык С++ и, нередко, используют библиотеку Qt. Это объяснимо — библиотека гораздо проще, чем даже STL (имею ввиду части, касающиеся контейнеров, файлов и т.п. — то, что обычно изучают студенты). При этом далеко не каждый студент пытается собрать свое приложение для телефона, но оно с большой вероятностью будет работать точно также как десктопе и это удобно. Кстати, с помощью С++ и Qt написан мобильный клиент 2gis [8], а также Telegram [9].
О достоинствах и недостатках разработки с Qt написано много статей, при их чтении важно учитывать, что с каждым новым выпуском библиотеки решается часть проблем. Бегло просмотрев одну из них [10] можно понять, что в Qt не хватает некоторых визуальных элементов, которые, впрочем, можно реализовать вручную. Однако, стоит ли изобретать велосипед, если можно легально взять готовый в чьем-нибудь репозитории?
2.1 Заготовки для мобильной разработки игр с помощью Qt
Ниже приведены ссылки на небольшие заметки, в каждой из которых описано решение какой-либо проблемы — например, разработка элемента управления, которого в Qt не хватало или просто описание механизма, важного для разработки игр:
Вот и конец. Скорее всего список заготовок будет дополняться. Однако, я предлагаю подумать начинающим Game Developer-ам подумать дважды перед тем как начинать писать свои велосипеды или кидаться на изучение новых языков. Если вы не знаете с чего начать — соберите игру типа Сокобана с использованием приведенных выше готовых классов.
С этого урока начинается серия статей о том, как написать игру на Qt. В предыдущей статье было рассказано о системе позиционирования графических элементов QGraphicsItem в графической сцене QGraphicsScene. Был нарисован треугольник и помещён в центр графической сцены, размеры которой были 500 на 500 пикселей. А теперь настало время этот треугольник оживить, а вернее начать им управлять.
Составим техническое задание урока:
Примечание. В данном проекте используется WinAPI, поэтому проект применим для использования в операционной системе Windows, а для Linux и MacOS применим лишь алгоритм, который используется в данном уроке. Поэтому если Вы желаете написать игру под эти ОС, то необходимо будет использовать библиотеки этих ОС для асинхронной обработки нажатия клавиш.
Структура проекта
mainwindow.ui
В дизайнере интерфейсов просто закидываем QGraphicsView в виджет. Больше ничего не требуется.
widget.h
В данном файле всего лишь объявляем графическую сцену, объект треугольника, которым будем управлять, а также таймер, по отсчетам которого будет производиться проверка состояния клавиш клавиатуры, которыми мы будем управлять треугольником на графической сцене.
widget.cpp
В данном файле производится инициализация графической сцены и её размеров, также в графической сцене отрисовываются границы поля, где будет перемещаться треугольник. Но ключевым моментом является инициализация таймера, по обработке сигнала от которого будет производится изменения состояния графической сцены, а также будут изменяться координаты расположения треугольника, при отслеживании состояния клавиш клавиатуры.
triangle.h
Именно в этом файле подключается заголовочный файл windows.h для работы с функционалом
triangle.cpp
Отрисовка треугольника взята из предыдущего урока по позиционированию графических элементов в графической сцене, а вот перерисовка в слоте, который будет обрабатывать сигнал от таймера, а также инициализация первичного поворота объекта уже является новым куском кода.
Примечание
Для того, чтобы проект скомпилировался с комплектом сборки MSVC, добавьте в pro файл проекта следующие строки:
В результате проделанной работы мы сделали первые шаги к тому, чтобы написать игру. А именно научились управлять объектом, то есть нашим героем-треугольником, с которым мы также поработаем в будущих уроках по написанию первой нашей игры.
В видеоуроке даны дополнительные комментарии и объяснения к проекту, а также продемонстрирована работа приложения.
Полный список статей данного цикла:
Видеоурок
Рекомендуем хостинг TIMEWEB
Рекомендуемые статьи по этой тематике
Подписчики
Платёжная система
Отвратительная ошибка на самом деле.
Вы как всегда правы, удалить билд и перезапустить было решением проблемы
Добрый день.
Проблема следующая:
треугольник при перемещении не отрисовывается полностью, кроме того, на графической сцене остаются его следы, но если, например, свернуть приложение и заново его открыть, то треугольник отрисовывется как положено.
Добрый день. Переопределили boundingRect? и переопределили ли его правильно? выглядит так, что либо boundingRect неправильно расчитывается, либо не вызывается update сцены.
Спасибо, не поставил минус в boundingRect
Евгений здравствуйте!Только начинаю разбираться в QT и работаю в Unreal Engine 4(делаю игры и приложения).Можно ли их сравнивать или они для разных задач.И что не сделать в Unreal,что можно сделать в QT.Оба на с++,у обоих есть дизайнеры для интерфейса.В Unreal правда blueprints,а в QT Qml(я так понимаю это его плюс перед Unreal).На Qml можно писать красивый интерфейс,но в Unreal это делать проще?
Они для разных задач.
Делать вёрстку приложения на QML определённо проще, якоря очень хорошая вещь. Когда я пробовал делать простую вёрстку в UE4 для меню, то мне якорей очень сильно не хватало, которые есть в QML.