Приветствую, Хабр! Хотел бы познакомить вас с относительно небольшим проектом, который я сделал c нуля примерно за 150 часов (50 заходов ~3 часа каждый) на Unreal Engine 4. Проект я делал в прямом эфире только на стримах раз в неделю (в общей сложности ушел год), попутно отвечая на вопросы пользователей.

Сам проект не предназначался как коммерческий. Целью я ставил на практике показать всю сложность разработки игр, а именно такие проблемы, как:

  • Планирование и прототипирование проекта
  • Продумывание и реализация архитектуры проекта и отдельных его компонентов
  • Реализация интерфейса пользователя
  • Отладка и исправление ошибок
  • Работа с ассетами и графикой

image

В конце всей серии стримов у нас получился играбельный прототип “Сурвайвл” шутера. Те, у кого стакан наполовину полон, смогут даже назвать это пре-альфой без сюжета.

Если вам интересны подробности проекта, записи стримов, исходники и прочее, читайте далее.

Весь проект был реализован на визуальной системе программирования, под названием “Блупринты”. И конечно многие спецы могут назвать её ребяческой, разработать на ней можно спокойно даже относительно крупный проект. Более того, это можно сделать относительно быстро, как мы уже смогли доказать.

Сразу хочу ответить на вопрос: "Почему Блупринты, а не С++?". Ну во первых, когда я начинал серию, плюсы я почти не знал. Хотя я и сейчас подобный сингл делал бы на БП. Во вторых, БП почти не уступают плюсам в нашем случае, но при этом дают ряд возможностей: Не позволяют наделать множество ошибок, возможных с плюсами, не приходится отвлекаться между БП и С++, понятнее новичкам. Да и они в нашем случае не намного медленнее, учитывая тот факт, что почти вся логика построена на событиях.

Мы так же успели немного поработать над графикой. К сожалению, ассеты делать времени у нас не было, поэтому мы часть оставили пустышками, часть сделали прямо в редакторе из примитивов, а некоторый контент позаимствовали из бесплатных демок Epic Games. Тем не менее, что-то успели сделать и сами, например систему дня и ночи, постобработку для воды и некоторые материалы объектов сцены.

В планы моих стримов так же стояли и проблемы, которые могут возникнуть при разработке. Их я специально решал в прямом эфире, дабы не только показать, с чем могут столкнуться юные разработчики, но и как отлаживать свой код, искать баги и писать свой код так, что бы все это дело можно было делать в два раза быстрее. Конечно опыта в программировании у меня не десятки лет, и это сказывалось на том, какие порой глупые ошибки я делал. Да и уверен, что многие разработчики могут оспорить множество моментов в процессе написания игры.

Естественно, полноценной игрой это вряд ли можно назвать, так как нету ни сюжета, ни цели в игре — только чистая механика. Тем не менее, я считаю, что результатом можно гордится и он вполне отражает то, для чего задумывался весь проект.

Список всего, что мы успели реализовать в нашей игре
Персонаж

  • Управление персонажем
  • Система жизненных показателей (Жизни, броня, стамина, голод, жажда)
  • Переключение вида (от первого лица и от третьего)
  • Моделька (сделали во Fuse, анимации взяли с Mixamo)
  • Настроенные анимации передвижения и использования оружия
  • Универсальное взаимодействие с предметами


Объектная система инвентаря
  • Компонент инвентаря (встраивай в любой объект, куда хочешь)
  • Клеточная система с поддержкой различного размера предметов
  • Размер инвентаря по клеткам на страницу и по весу.
  • Класс предметов, которые можно положить в инвентарь. Предметы хранятся в качестве объектов.
    • Вес, размер, информация, состояние предмета
    • Функционал для стака (когда в одной ячейке много одного предмета)
    • Возможность добавить логику использования предмета
    • Выбрасывание из инвентаря
  • Интерфейс для взаимодействия с инвентарем
  • Интерфейс для обмена между другим компонентом и своим.
  • Drag&Drop манипуляция объектами между инвентарями и внутри одного.
  • Контекстное менюу предметов
  • Подсказки при наведении на предметы в инвентаре и в мире.
  • Список генерируемых предметов при создании объекта с компонентом / начале игры.
  • Список начальных предметов при создании объекта с компонентом / начале игры.
  • Система торговли между другим инвентарем
    • Интерфейс торговли
    • Компонент менеджмента денег (необходим для работы торговли)


Система экипировки
  • Экипировка нескольких типов предметов: Шляпы, Топ, Брюки, Ботинки, Оружие
  • Скелетная синхронизация у Топа, брюк и ботинок. (Шляпы и оружие по сокетам)
  • Удобное окошко для экипировки с поддержкой Drag&Drop
  • Поддержка логики-модификаторов при одевании

Оружие

  • Дальнобойное оружие
    • Перезарядка
    • Использование предметов-патронов из инвентаря
    • Поддержка классов снарядов/пуль
    • Автоогонь/одиночный огонь
    • Отдача с разбросом (свой + от факторов, н.п. бег или приседание)
  • Холодное оружие (с несколькими видами проверок на урон на выбор)
  • Состояние оружия ухудшается при использовании

Система крафта

  • Крафт по рецепту (выбрал рецепт, он скрафтил, аля фоллаут)
  • Крафт по предметам (закинул нужные предметы, он скрафтил, аля майнкрафт)
  • Интерфейс пользователя только для второго типа крафта.

Агрессивные мобы

  • Мобы ближнего боя (если увидят, побегут и начнут бить)
  • Мобы смешанного типа (стреляют, но если достаточно близко, побегут что бы ударить)
  • Дальники оббегают препятствия, если не могут выстрелить.
  • Есть встроенный инвентарь для лута после убийства.
  • Зона спауна
  • Список классов
  • Шанс спауна

NPC

  • Городские NPC, патрулирующие свою зону спауна
  • Уникальные NPC
  • Базовый контроллер расписания для уникальных НПЦ
  • Реакция на урон (убегают или используют имеющееся оружие)
  • Встроенный инвентарь для лута после убийства.
  • Объектная диалоговая система
    • Дерево диалогов
    • Каждый ответ — объект
    • Для каждого ответа можно докинуть любую логику или условие доступности.
    • Интерфейс диалога
    • Несколько готовых классов ответа (запускает торговлю, забирает ресурсы, если есть, выходит из диалога)

Строительство

  • Класс конструкций, которые поддерживают размещение
  • Использование предметов-ресурсов из инвентаря при размещении.
  • Снаппинг на некоторых типах конструкций (н.п. Стены, фундамент, окна)
  • Менюшка с конструкциями
  • Подсвечивание конструкций, на которые хватает ресурсов

Дополнительно

  • Небольшая карта с городом, лесом, водоемами (можно плавать).
  • Система смены дня/ночи
  • Автомобили
    • Вид от первого или третьего. Общее с персом
    • Включение/выключение фар.
    • Встроенный компонент инвентаря (нужно взаимодействовать у багажника)
  • Кое как работающие лестницы вертикального типа.
  • Главное меню
  • Меню паузы
  • Меню с настройками графики


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



> Записи всех 50-ти частей стримов

Содержание по частям
  1. Начинаем и планируем проект. Создаем управление и поведение персонажа.
  2. Начинаем делать систему инвентаря.
  3. Продолжаем делать базу системы инвентаря.
  4. Готовим базу для экипировки и вооружения.
  5. Работа над оружием и использовании патронов.
  6. Делаем автострельбу и прицеливание.
  7. Создаем базовую систему крафта.
  8. Бег, переработка предметов и их износ.
  9. Реализовываем перезарядку для оружия.
  10. Делаем оружие ближнего боя.
  11. Доделываем ближний бой и делаем лестницу по которой можно взбираться.
  12. Делаем интерактивные предметы: Дерево, камень, кусты.
  13. Делаем HUD и начинаем делать интерфейс для инвентаря.
  14. Продолжаем работать над интерфейсом инвентаря. Делаем генерацию ячеек с предметами.
  15. Продолжаем делать генерацию ячеек и поиск места для предмета. Добавляем страницы инвентаря.
  16. Делаем небольшое взаимодействие с предметами в инвентаре и окно подробной информации.
  17. Сделали Drag&Drop перетаскивание предметов по инвентарю и в другой инвентарь.
  18. В этой части речь идет о визуализации крафта.
  19. Создаем окно с выбором количества предметов из стака для переброса в другой инвентарь.
  20. Делаем поддержку разных рецептов крафта, а так же фиксим разные баги у инвентаря.
  21. Создаем систему смены дня и ночи, а так же делаем новую сцену для нашего проекта.
  22. Начинаем создавать AI для агрессивных ботов.
  23. Делаем атаку мобов, а так же реакцию на атаку. Плюс реализуем сбор лута с мертвых мобов.
  24. Делаем зону спауна для нпц. Так же добавляем генерацию случайных предметов в инвентаре.
  25. Обновляемся до 4.13, а так же делаем дальних агрессивных нпц.
  26. Добавляем разные элементы на HUD. Добавляем ручную перезарядку оружия.
  27. Доделываем поддержку скелетной одежды и шапок. Добавляем анимацию для оружия от первого лица.
  28. Делаем интерфейс для работы с нашей системой экипировки.
  29. Начинаем делать торговую систему и компонент менеджмента денег.
  30. Продолжаем делать торговлю, создавая и настраивая компонент торговли.
  31. Делаем отмену торговли, а так же настраиваем анимацию перезарядки.
  32. Создаем транспорт со своим инвентарем, фарами и переключением вида. Создаем фонарик.
  33. Создаем строительство (а точнее систему размещения объектов перед собой).
  34. Делаем интерфейс для строительства, делаем привязку для стен.
  35. Создаем ещё несколько видов конструкций: Палатка, кровать, стул, стол, лампа, дверь. сундук, костер.
  36. Добавляем крышу, окна. Доделываем выравнивание относительно других конструкций.
  37. Делаем небольшое поселение, а так же населяем его NPC, которые так же создаем в этом уроке.
  38. Начинаем делать систему диалогов для наших жителей.
  39. Настраиваем туман и постобработку. Импортируем модель зомби и настраиваем ему анимации.
  40. Доделываем систему диалогов.
  41. Делаем взаимодействие с предметами от третьего лица, а так же модификаторы для брони.
  42. Создаем главное меню, меню паузы и настройки графики. А так же собираем первую сборку игры.
  43. Реализуем расписание для уникальных жителей.А так же что бы городские NPC убегали от атаки.
  44. Добавляем контекстное меню в инвентарь, а так же фиксим некоторые баги нашего инвентаря.
  45. Добавляем отдачу, разброс, анимацию выстрела и возможность ударить для огнестрельного оружия.
  46. Доделаем агрессивных и городских NPC, фиксим разные баги, связанные с ними.
  47. Настраиваем анимации для главного персонажа. Добавляем различную одежду.
  48. Исправляем различные ошибки в нашей игре.
  49. Исправляем различные ошибки крафта, NPC и экипировки в нашей игре.
  50. Немного дорабатываем карту и собираем последний билд.


> Исходники на Git (загрузка ZIP архивом не работает, архив почему-то поврежден.)
> Исходники на ЯДиск (Лицензия та же, что и в исходниках)
> Билд игры

В будущем я и дальше планирую проводить подобные стримы. Например на очереди у нас стрим по мультиплеерному шутеру, а затем стратегия.
Поделиться с друзьями
-->

Комментарии (44)


  1. nikitasius
    25.04.2017 21:25
    +5

    офигеть..!


  1. skyblade
    25.04.2017 21:32

    А какие системные требования у проекта? Я так понимаю, там только под винду всё?


    1. Flakky
      25.04.2017 21:37

      О требованиях я как-то не задумывался, на самом деле. Все же это обучающий проект, а не на продакшн. Но хочу сказать, что если смотреть на всю сцену, фпс может проседать до 20 на GTX770 при фуллхд.

      В последнем стриме мы определили, что источник такого низкого фпс — трава и растительность. Их я взял из демки Kite Demo, в которой ассеты для игр не особо оптимизированы. Хотя если поставить графику на минималки, то повыше будет фпс.

      А собрать билд, думаю, что можно и под линукс и под мак. Если удалить эти тяжелые ассеты и почистить карту, думаю, что и на мобилках заработает.


      1. PapaBubaDiop
        25.04.2017 21:46
        +1

        Проект — чтобы набить руку? А что в планах?


        1. Flakky
          25.04.2017 22:33

          Проект что бы обучить других. А в планах ещё подобные вещи, но с другими жанрами и так же на С++.


          1. havk13
            26.04.2017 12:21

            На канале в youtube, который представлен в статье, будут появляться записи?


            1. Flakky
              26.04.2017 12:22

              Да, конечно. Новые уроки и стримы будут в скором времени.


          1. Psychopompe
            26.04.2017 18:22

            Теперь можно присоединяться к Daggerfall Unity


          1. Natakotenki
            26.04.2017 21:23

            Спасибо за интересный труд!
            Как Вы считаете, удалось достичь цели проекта на данном этапе? Есть ли фидбек от аудитории?


            1. Flakky
              26.04.2017 21:23

              Да, конечно. Мы в целом добились хорошего результата, я считаю. Фидбек от аудитории конечно есть.


  1. alexoron
    25.04.2017 22:00
    +2

    Круто, чо.
    Раньше помнится нечто подобное для Юнити и то на английском было, насколько помню.
    А тут все (почти все) в серии.
    Интересно будет все посмотреть.


  1. RuAge
    25.04.2017 22:33

    Доделал, молоток. Вдохновляешь… =)


  1. 1RIDDLE1
    25.04.2017 22:33
    +2

    Александр, большая робота проделана. Спасибо!

    Теперь ждем не менее интересный Online шутер.


  1. aGgYomfg
    26.04.2017 01:53

    Смотрел записи стримов на youtube, неплохо подаёте. Было бы не плохо если еще делали что то вроде «подведения итогов» в отдельных роликах с ключевыми моментами на 5-10 мин. Успехов.


    1. Flakky
      26.04.2017 12:23

      В стримах мы делаем подведение итогов. В уроках по 20 минут, в целом, это и не нужно, думаю. Хотя иногда говорю все равно по итогам.


  1. cybd
    26.04.2017 08:45
    -1

    Я извиняюсь за заведомо глупый вопрос, а где видео геймплея? Сам не нашел.


    1. Flakky
      26.04.2017 12:24

      Так то видео, что в статье, и демонстрирует то, что есть по геймплею… Или вы о чем?


      1. cybd
        27.04.2017 07:42

        Действительно. А то я включил ролик, посмотрел минуту, не увидел геймплея, перешел на канал ютуба и там потерялся :(


  1. JeriX
    26.04.2017 09:55
    -1

    Оо ничоси! риспекты!

    есть ли планы по созданию обучалок на C++? или может какие другие языки?
    вроде бы в сообществе делали какие-то штуки для поддержки C# через Mono и поддержки Haxe -> C++


    1. Flakky
      26.04.2017 12:28

      Ну от С# смысла мало в анриале, да и поддержки больше нет. Хакс тоже да, встраивали, но и его тоже не вижу смысла. В Анриале есть БП, которые решают 90% проблем быстро, удобно и наглядно. Для остального есть С++, которым, в общем-то, в анриале пользоваться не сложно.

      А уроки по плюсам да. Я недавно начал выкладывать уроки. Но они там эксперементальные пока.


  1. AllexIn
    26.04.2017 11:27
    +1

    Круто.
    Плюсик везде.
    Но утверждение про пользу блюпринтов — они крайне сомнительные.
    Да, для работы «в одного» они Ок. Но расскажите, как вы будете их мерджить в команде? Дифы хоть и есть, но они крайне неудобные. Не говоря уж о том, что блюпринты любят сбрасывать связи если интерфейс какого либо метода изменился.
    То есть у нас просто исчетаез вызов метода. Код продолжает работать! Но часть веток в коде отваливается!
    С++ хотя бы ругается на то, что у нас вызов не соответстует декларации. БП же молча убирает вызов и всё.

    Полагаю вы этих минусов не видите в силу малого знакомства с разработкой в команде.


    1. Flakky
      26.04.2017 12:33

      На самом деле в анриале есть мерджинг БП, если система контроля подключена в самом редакторе. Честно говоря, я никогда не пользовался, так как мы на работе почти никогда не пересекаемся по коду и я даже не подключаю гит в анриале.

      Говорили что да, там есть недоработки. Но тут от себя сказать ничего не могу. По поводу связей согласен с вами :)
      С кодом, конечно, проблем вообще нет)


      1. AllexIn
        26.04.2017 12:36

        С кодом, конечно, проблемы есть.
        Но решения проблем с кодом разрабатываются уже пол века, тем более что все проблемы хорошо известны. А БП инструмент очень новый. Проблем в нём вагон и БР еще очень далек чтобы стать полноценноый заменой коду. Тем более, что непонятно зачем через БП решать задачи для которых есть код.

        Я понимаю Эпиков, которые акцентируются на БП, потому что БП значительно уменьшает порог вхождения, а значит увеличивает пользовательскую базу платящую за ассеты. Но я не понимаю разработчиков, которе выбирают заведомо менее подходящий инструмент.

        UPD: Это не к вам вопрос. Понятно, что вам в стримах как раз нужно охватить максимум аудитории, а это как раз те, кто не осилил разработку кодом и ковыряет что-то в одиночку.
        Это скорее замечание для тех, кто поведется на «БП идеальны». Нет, они не идеальны.


        1. Flakky
          26.04.2017 12:51
          +1

          Тут на самом деле, кому что удобнее. Если по производительности не много теряется, то если удобнее БП, можно взять его. Это как, скажем, руби на рельсах и пхп. Не знаю, удачный ли пример, но все же…

          По сути, это тот же код, просто другой. Очень многие так предвзято к нему относится. Не стоит так. Естественно фундаментальные вещи делаются на С++, но скриптить геймплей можно и на БП.

          У вас в кадре все равно есть запас где-то 15мс из-за ограничений в графике, так что разницы в производительности С++ и Бп попросту не будет. Кадр будет отрисовываться с той же скоростью.
          Более того, сам анриал очень привязан к БП. И очень многое лучше вообще не делать на С++.

          Хотя согласен, что в нашем случае, скажем, компонент инвентаря, базовый класс предметов, контроллеры ИИ и подобное, лучше было бы писать на плюсах. Но поскольку стрим обучающий, да и по производительности мы не теряем, смысла в этом было мало :)


          1. AllexIn
            26.04.2017 13:05
            +1

            Я ни слова про производительность не писал.

            Плюс не стоит путать предвзятость и аргументированную критику. Я не предвзят к БП. У них уже сейчас есть определенная ниша. Но делать на них проекты… Сомнительное решение. Хотя я знаю что даже крупные проекты делаются целиком на БП.
            Мнение основано не на предвзятости, а на личном опыте работы с УЕ в команде.


  1. cy_job
    26.04.2017 12:33

    Отличная работа, спасибо!
    С нетерпением буду ждать стримы по Стратегии.
    Вы большой молодец


    1. Flakky
      26.04.2017 12:33

      Спасибо :)


    1. walkman7
      26.04.2017 20:30

      Вот таких разработчиков бы в Bohemia Interactive.


  1. levindmy
    26.04.2017 12:34
    -2

    было бы еще круче, если прикрутить реальные карты (гугл или яндех), дабы персонаж бегал в якобы реальных локациях.
    или я фантазер?


    1. Flakky
      26.04.2017 12:35
      +1

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


  1. izzholtik
    26.04.2017 13:40

    А кто-нибудь работал с сабжем под линуксом?
    У меня полгода назад редактор, собиравшийся из исходников часа за четыре, стабильно сегфолтился при создании проекта, и я скоропостижно забил.


    1. AllexIn
      26.04.2017 14:49

      А зачем? По своему опыту:
      Основная ОС — Линукс. Но все работы по геймдеву на UE ведутся под виртуалкой на винде.
      Проверять под линукс я даже не дергался, потому что все равно в реальном времени нужно бывает собрать приложение и отправить менеджеру на проверку. А это винда. Да и просто не понятно зачем два рабочих окружения с одним и тем же иметь.


  1. netgoblin
    26.04.2017 16:31

    Таких уроков по разработке «игр» на форумах полно. Написать десяток-другой акторов на блюпринте не сложно. Меня, например, больше интересуют решения таких вопросов как:
    — уровни: переходы между ними, сохранение состояний игрока и мобов, и т.д.
    — кат. сцены (как это организовано?)
    — карта мира, мини-карта (не просто рендер карты сверху, а оптимизированное реалтаймовое отображение кастомных меток ботов/квестов и т.п. на заранее подготовленном изображении карты, а не GetAllActorsOfClass в событии OnTick)
    — система квестов
    — глобальное хранение игровых данных не зависимое от текущего уровня (где хранить такие данные? в GameMode, в Blackboard или еще где?)
    — сохранение/загрузка
    — как организованы pick-up объекты? все доступные объекты раскиданы в мире руками? как настраивать их характеристики? как насчет динамического спауна? а если ММО?
    — как спаунятся противники на удаленном расстоянии от игрока? как сохранить состояние противника при удалении игрока от него и что делать с мобом дальше? а если это орда зомби?

    Это не претензия к автору статьи, а скорее просьба по возможности поделиться более сложной (и интересной) теорией (хотя-бы). Спасибо.


    1. AllexIn
      26.04.2017 16:40

      Аудитории для таких вещей нет.
      Плюс те, кто знает это на ПРО уровне не зарабатывает стримами, а делает проекты.


      1. netgoblin
        26.04.2017 18:04
        +1

        1) Я не думаю, что мне одному это было бы интересно.
        2) У Epic Games есть стримы по разработке игр. Беда лишь в том, что они тоже в основном базовыми принципами делятся. Хотя есть редкие исключения, когда на стримы приходят их гуру.


        1. AllexIn
          26.04.2017 18:05

          Эпики — отдельная тема. И они не на стримах зарабатывают, а на сторе.


    1. Flakky
      26.04.2017 21:29

      Я понимаю. Но не все сразу:) Например миникарту мы постараемся рассмотреть в сетевом шутере. Остальное, думаю, уже потом.


  1. seo1love
    26.04.2017 21:25

    Выглядит как фантастика, респект!


  1. AsKein
    26.04.2017 21:25

    Большое спасибо за работу!


  1. Arios
    26.04.2017 21:25

    Это все очень здорово. Я бы еще хотел узнать о другое стороне создания игр — документация, диз.док., концепт. док. и т.д. Хотя мне это не очень нравиться, но это довольно важная часть игр. Может Вы, когда будете делать стратегию, и этот момент осветите, так скажем от бумаги до целой игры? Конечно, можно найти такие статьи, но на реальном примере было бы интереснее.


  1. HiroX
    26.04.2017 22:52

    Win8.1, скачал, распаковал, запустил, нажал Start game. на Loading все зависло (кроме голоса в скайпе). ctrl+alt+del не помогли, так же как и альт+таб. секунды в скайпе на втором мониторе остановились… перезагрузил по долгому нажатию кнопки включения, второй раз не пробовал.


    1. Flakky
      26.04.2017 22:53

      Ждите дольше. Ассеты достаточно тяжелые, и пока этого всего дела в кеше нету, загрузка может длиться очень долго (зависит от системы).


  1. DroneZzZko
    27.04.2017 13:08

    Траву, например, можно заменить: https://www.unrealengine.com/marketplace/dynamic-grass-system


    1. Flakky
      27.04.2017 13:09

      Можно сделать что угодно :) Но это вы уже для своих проектов сами будете делать.