Всем доброго дня


В этой небольшой статье я расскажу как сделал стартовое меню и миникарту с помощью ассетов из Unreal Engine Marketplace.


Стартовое меню


Стандартный путь для создания меню — виджеты с кнопками, списками и текстовыми полями. Однако их стандартный внешний вид уж слишком прост, а чтобы сделать его симпатичнее нужно приложить немало дизайнерских умений (для создания и расстановки картинок), коими не обладаю. Конечно, не обязательно рисовать всё самому и можно взять из интернета… но надо знать все лицензии, нюансы и маркетплейсы (и сайты со свободными материалами) или сесть это изучать. А лень. Поэтому я решил склепать стартовый мини-уровень с функциональностью меню из доступных (и бесплатных) ассетов из UEM. Получилось так:



в «сырцах»:



  • Недостаточное освещение сделало приятный эффект запуска игры (за счёт автоэкспозиции/Eye Adaptation)
  • Грузовичок взят из Vehicle Variety Pack, ничего не делает пока
  • Основание — плоский landscape минимального размера покрытый M_Ground_Gravel из StarterContent
  • Здание — Factory_03_01_closed из [SCANS] Abandoned Factory Buildings — Day/Night Scene, просто задний фон ака гараж
  • Туалетная кабинка — BP_Portapotty_01 из Construction Site VOL. 1 — Supply and Material Props, при наведении мышкой открывается дверца, при клике — выход из игры. К слову, чтобы дверца не мешала обрабатывать Mouse Hover на самой кабинке, дверце надо сделать Collision Preset: NoCollision
  • MissionMapView — «стартовый» вид на уровень, выставляется в Level Blueprint > Event BeginPlay


  • Висящая на стене карта (ака меню выбора миссий) — комбинация из SpotLight (который зажигается при наведении мышки на карту) и StaticMesh (SM_Tarp_05 из того же Construction Site VOL. 1 в материале которого базовую картинку поменял на снятый референс из Яндекс.Карт, который до этого на ландшафт основного уровня «натягивал»)
  • При клике на карту происходит переключение вида на MissionMapView



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


Миникарта в игре



Миникарту сделал стандартным виджетом на весь экран, где расположен немного прозрачный Image всё с той же картой-референсом. Когда уровень будет готов, надо будет сделать его «фотографию» сверху и поставить на миникарту. В Event Construct этого виджета поверх карты отрисовывается маркер позиции и направления игрока. Обновляется его положение каждый Event Tick, что мне кажется неоптимальным с точки зрения производительности. Хочется переделать и обновлять положение только когда Игрок движется, но вот тут подумал — это ж и так почти всегда для автосимулятора ;)


Так же на миникарте отображаются маркеры, связанные с заданиями и на этом шаге я столкнулся с задачей, текущее решение которой («просто добавь Delay!») кажется мне ужасно некрасивым. Проблема в следующем: размер миникарты может быть любым (в пропорциях от общего размера экрана), поэтому, при добавления маркера на миникарту, надо учесть её размер при пересчёте относительно положения объекта на уровне в положение на миникарте. Однако Widget > GetDesiredSize возвращает нули пока не начнётся Tick! С маркером Игрока эта проблема нивелировалась постоянным пересчётом его положения (он отрисовывался в 0,0, правда через деление на 0, но при первом же Tick вставал на место), а вот положение маркеров статичных объектов я каждый Tick пересчитывать не планировал. На текущий момент это решается путём добавления маркера на миникарту с Delay > Duration=0,4 из BeginPlay (к этому моменту все уже «тикают» и у карты есть размер), но как же это некрасиво!


На этом пока всё. Если кто знает отдельный Event когда все виджеты уже имеют размеры (GetDesiredSize) — буду признателен за помощь. В планах рассказать про все WTF, на которые было потрачено по 4+ часов и про созданную базовую систему миссий. Спасибо.