Краткое содержание:
Вступление
C++
UI
Анимации
Механизмы
В следующем выпуске
Вступление
Привет, друзья! В этом цикле статей я максимально подробно буду рассказывать о процессе разработки игры на UE – SuperIndustry. Вы сможете на моем примере познать процесс разработки 3D игры на UE. Вкратце про игру: Представьте гибрид Oxygen not included и Satisfactory, в далеком будущем и на специфичной экзо планете. В игре будет глубокий сюжет, который будет повествоваться через своеобразный дневник. Главная цель – улететь с планеты (остановиться на достигнутом) или же продолжить общение с высшим Существом и узнать, что будет дальше.
![](https://webcf.waybackmachine.org/web/20230121215138/https://habrastorage.org/getpro/habr/upload_files/cb4/a07/95d/cb4a0795da9fd188aec294a574bfdf36.png)
C++
Создавать игры на UE можно 3 способами: только BP (блюпринты) – перетаскивать “квадратики”, только С++ - писать все кодом, BP&C++ - часть логики реализовывать на блюпринтах и часть на С++. Я выбрал 3 вариант, т. к. полностью на BP проект уже выпущен, писать всю логику на С++ слишком долго и очень сложно. Для меня BP&C++ - идеальный вариант.
Прошел месяц со старта обучения. Основы чистого С++ дались мне не очень трудно (Знание Python многократно облегчило изучение нового языка), настало время изучения плюсов в рамках анрила. И началось…
![](https://webcf.waybackmachine.org/web/20230121215138/https://habrastorage.org/getpro/habr/upload_files/06d/e71/6c4/06de716c4a902513b41bede4d3645b36.jpg)
UI
Между началом изучения анриловских плюсов и первой написанной строчкой кода прошла ~неделя. Я банально не понимал, куда писать код! Изначально мне казалось, что анриловский C++ - отдельный язык с синтаксисом С++, но очень скоро я понял, что все не так уж и страшно.
![](https://webcf.waybackmachine.org/web/20230121215138/https://habrastorage.org/getpro/habr/upload_files/cd6/08e/09b/cd608e09bd18192add45bfcecd787ec8.png)
Первым делом я решил реализовать вывод информации о механизме при наведении на него, а именно его название и текущий запас энергии. Это заняло достаточно много времени, т. к. я еще не понимал, как и куда писать код. Работает это так: n раз в секунду из камеры игрока вылетает луч, если он врезается в механизм (наследник C++ класса “mechanism”), то запрашивается информация о механизме и появляется вот такое окошко.
![](https://webcf.waybackmachine.org/web/20230121215138/https://habrastorage.org/getpro/habr/upload_files/b96/ae8/74a/b96ae874ae07564e8c1bc2e0a3ee0c4f.png)
![](https://webcf.waybackmachine.org/web/20230121215138/https://habrastorage.org/getpro/habr/upload_files/8c3/b69/a42/8c3b69a42ad0a7588160bd3dcf957002.gif)
Недолго думая, я решил, что название механизма будет показываться на русском языке, вот что из этого вышло
![](https://webcf.waybackmachine.org/web/20230121215138/https://habrastorage.org/getpro/habr/upload_files/a04/5cc/94f/a045cc94f3a0fab90a2ec563c5ae9d11.png)
Помучавшись пару вечеров, я понял, что название на английском тоже смотрится неплохо =D
![](https://webcf.waybackmachine.org/web/20230121215138/https://habrastorage.org/getpro/habr/upload_files/dec/6ef/280/dec6ef280e2b6e27f7ec34cc9741e9e3.gif)
P.S. Про полосы в левой нижней части гифки в следующем выпуске.
Вслед за сообщением с информацией механизма я решил сделать UI самого механизма.
За 1 вечер я набросал вот такой интерфейс для кислородного наполнителя:
![Набросок UI Набросок UI](https://webcf.waybackmachine.org/web/20230121215138/https://habrastorage.org/getpro/habr/upload_files/8ce/dc7/c4b/8cedc7c4bb3106a610c589ef67d92157.png)
Настало время переводить это в анрил =D
Перед тем, как создавать UI механизмов, нужно понять, как его выводить. Чтобы вывести UI, нужно его инициализировать. Чтобы инициализировать, нужно найти класс блюпринта UI.
![](https://webcf.waybackmachine.org/web/20230121215138/https://habrastorage.org/getpro/habr/upload_files/37c/c89/3cf/37cc893cf7c4da6064f4702cd265fa51.jpg)
Спустя несколько вечеров… У меня получилось вывести UI созданный не через C++. (P.S. Если прописывать интерфейс кодом, что крайне непросто, то его гораздо легче выводить на экран. Из за простоты я создавал UI через редактор интерфейсов - UMG)
![Это был непростой вызов =D Это был непростой вызов =D](https://webcf.waybackmachine.org/web/20230121215138/https://habrastorage.org/getpro/habr/upload_files/7b8/e52/423/7b8e524231f0762b9dce7053cace0249.png)
Еще, при открытии UI механизма было бы неплохо ограничивать игрока в передвижении и осмотре. *Спустя несколько вечеров*. Наконец, мне удалось реализовать эту «простую» фичу. Чего я только не пробовал: удалять компонент движения, расширять логику движений, изменять текущее состояние (падение, плавание, ходьба). Решением стало изменения способа ввода (игра/UI), но на этом проблемы не закончились… Если войти в UI механизма с зажатой кнопкой передвижения, то при выходе персонаж продолжал двигаться, даже когда кнопка не нажата. На форуме я нашел решение.
![](https://webcf.waybackmachine.org/web/20230121215138/https://habrastorage.org/getpro/habr/upload_files/015/6d0/773/0156d07732bc833872b732cea2ba7259.png)
Только после этого, все стало работать как надо. Или не совсем...
Через случайный промежуток времени после запуска, UI переставал открываться. Сопровождалось это все вылетом с ошибкой «EXCEPTION_ACCESS_VIOLATION reading address 0x0000000000000000». Такого рода ошибки вылезают из за обращения к нулевому указателю. В моем случае проблема была в том, что сборщик мусора удалял переменные с UI. Решилось это тем, что я обернул все переменные, которые хоть как то относятся к UI в UPROPERTY().
Наконец, UI готов. Итоговая версия слегка отличается от прототипа.
![](https://webcf.waybackmachine.org/web/20230121215138/https://habrastorage.org/getpro/habr/upload_files/6bb/7f5/e1c/6bb7f5e1c59bf2fb20f518eb15b9896e.gif)
В правой части скорее всего будут настройки для автоматизации, но об этом пока говорить еще слишком рано. Все механизмы в качестве энергии будут использовать SEP (Superindustry Energy Points).
![UI солнечной панели UI солнечной панели](https://webcf.waybackmachine.org/web/20230121215138/https://habrastorage.org/getpro/habr/upload_files/09d/dfd/162/09ddfd16288459f75e27e26663ba88bd.png)
Остался UI для карьера. Здесь все немного сложнее. В UI карьера присутствует инвентарь. Для его реализации нужно довольно много времени. По этому UI карьера будет реализован в следующем выпуске.
![Набросок из Photoshop Набросок из Photoshop](https://webcf.waybackmachine.org/web/20230121215138/https://habrastorage.org/getpro/habr/upload_files/673/137/e85/673137e856e851b1a9003e569734f621.png)
Анимации
Настало время “оживить” нашего астронавта. Для этого мы еще в предыдущем выпуске нашли необходимые анимации. Начнем с бега. Для того, чтобы проигрывать анимацию бега, нужно сначала прописать логику бега.
![](https://webcf.waybackmachine.org/web/20230121215138/https://habrastorage.org/getpro/habr/upload_files/111/e0f/957/111e0f9573faa6bd716d3dab1e1fba6f.png)
В этом отрывке кода выполняется привязка функций к событиям. Например: при активации события "Turn Right / Left Mouse" (а это событие активируется, когда игрок шевелит мышкой) вызывается функция движения камерой. По этому принципу я привязал функцию бега к новому событию.
![Шаг Шаг](https://webcf.waybackmachine.org/web/20230121215138/https://habrastorage.org/getpro/habr/upload_files/1a9/2af/3dc/1a92af3dca6fc303d6acbddd48ab8c8c.gif)
![Бег Бег](https://webcf.waybackmachine.org/web/20230121215138/https://habrastorage.org/getpro/habr/upload_files/6fb/71b/022/6fb71b0228fe9e460ba56e07028e2a7b.gif)
![Ёж Соник Ёж Соник](https://webcf.waybackmachine.org/web/20230121215138/https://habrastorage.org/getpro/habr/upload_files/ba0/0e6/b85/ba00e6b8545a8e4aa29d2243839236a1.gif)
Во время редактирования файла персонажа, я нашел переменную, отвечающую за скорость поворота персонажа. И тут я решил немного “окирпичить” персонажа:
![Очень маленькое значение Очень маленькое значение](https://webcf.waybackmachine.org/web/20230121215138/https://habrastorage.org/getpro/habr/upload_files/053/9e7/954/0539e7954a7c976c3d070dc6b079bf39.gif)
XDDD
![Новое значение Новое значение](https://webcf.waybackmachine.org/web/20230121215138/https://habrastorage.org/getpro/habr/upload_files/e0b/ebe/21c/e0bebe21cfd0595c12be994339fb089b.gif)
Вернемся к анимациям. Добавлять анимации совсем не сложно, это не заняло много времени.
Анимации ходьбы, бега и простоя:
![](https://webcf.waybackmachine.org/web/20230121215138/https://habrastorage.org/getpro/habr/upload_files/934/f32/b4f/934f32b4ff7ef92c2b92faea0ec1a1e1.gif)
Анимация ходьбы, ускоренная в 40 раз выглядит забавно:
![](https://webcf.waybackmachine.org/web/20230121215138/https://habrastorage.org/getpro/habr/upload_files/9f9/672/17e/9f967217ea9c7491bd26586c64e32f49.gif)
Осталось добавить прыжок. С ним пришлось помучаться. Логика прыжка присутствует по умолчанию, очень сложно оказалось найти нормальные анимации. На Mixamo я еле как нашел анимацию начала прыжка, нахождения в воздухе и конца прыжка. Просидев половину вечера, мне удалось связать все это вместе.
![](https://webcf.waybackmachine.org/web/20230121215138/https://habrastorage.org/getpro/habr/upload_files/781/a66/90c/781a6690ca4a2815332b20b7976a19aa.gif)
Удовлетворительный результат.
С анимациями движения все.
Механизмы
Карманная дрель. Добывает ресурсы под собой:
![](https://webcf.waybackmachine.org/web/20230121215138/https://habrastorage.org/getpro/habr/upload_files/0f8/55c/cbb/0f855ccbbde9e068c59f1add5b7ed8ef.png)
Из небольших изменений – я изменил коллизию полого фундамента. Раньше нельзя было провалиться в “дырку”. После изменения коллизии это стало возможным.
![](https://webcf.waybackmachine.org/web/20230121215138/https://habrastorage.org/getpro/habr/upload_files/143/906/010/143906010937284c875d1e9a5d5ef1a1.gif)
В следующем выпуске
Каким будет сюжет, использование* нейросети, взаимодействие между механизмами
![Протагонист Син Протагонист Син](https://webcf.waybackmachine.org/web/20230121215138/https://habrastorage.org/getpro/habr/upload_files/9fc/923/e5b/9fc923e5bb4e8f3413ddca0b7fbf9da0.png)