Создание игры с нуля — интересный вызов для разработчиков. Однако если вы хотите довести дело до кошмарной сложности, вы также можете создать собственный игровой движок, настроенный специально для вашего проекта. Существует множество подводных камней, поэтому ниже описано, что нужно знать при разработке такого программного обеспечения для проектирования игр и что следует добавить в него.
Итак, вы задумались о создании собственного игрового движка? Потрясающе! Этот вариант имеет много преимуществ перед использованием коммерческих вариантов, таких как Unity или Unreal. В этой статье объясняется, почему вам необходимо разработать собственный двигатель, какие системы следует рассмотреть и как правильно подойти к этому процессу.
Зачем?
Некоторые ключевые вопросы, которые следует задать себе, если вы решили разработать свой собственный двигатель, следующие. Почему вы хотите разработать свой собственный двигатель?
Рациональные причины включают, например
Предположим, вы хотите создать игру с новой технологией, которую не поддерживают другие движки. Или да, но реализация очень сложна и трудна. Это может быть крупномасштабное моделирование (см.Factorio), индивидуальный проект, который не вписывается в готовый шаблон (КастрацияFactorio), что может выглядеть не очень хорошо (Factorio), и многие другие идеи. В таких случаях у вас нет другого выбора, кроме как создать свой собственный движок для проекта.Вам нужно будет оптимизировать рабочий процесс создаваемой игры. Если ваш проект не требует полной функциональности коммерческого движка, вы можете разработать собственный движок, используя соответствующий процессор и функции. Если вы не разрабатываете двигатель для конкретного проекта, стоит подумать, действительно ли вам нужно самодельное решение или достаточно готового решения.
Вы не хотите быть зависимыми от чужой технологии в долгосрочной перспективе. Если вы хотите получить полный контроль над своим проектом, будьте готовы исправлять ошибки самостоятельно (а не ждать, пока их исправят разработчики). Не бойтесь, что следующее обновление сломает игру и сделает ваш пользовательский движок подходящим. Выбор! И вам не придется зависеть от прихотей большого бизнеса.
Хотите узнать, как работает ваш игровой движок? Это отличная причина. На самом деле, это самая веская причина для разработки собственного игрового движка.
И раз уж мы упомянули об этом, вот несколько неудачных причин начать разработку двигателя. Если вы найдете среди них свою, притормозите и подумайте еще раз.
Вы найдете лучший движок, чем Unity или Unreal (или Godot или GameMaker). Ты не сделаешь этого. Хотя можно разработать программное обеспечение под свои нужды (см. предыдущий список), невозможно самостоятельно или с помощью небольшой команды создать универсальный движок, конкурирующий с известными универсальными программами. Особенно с первой попытки.
В противном случае, не считаете ли вы себя "настоящим разработчиком"? Использование готового движка не делает вас худшим разработчиком игр. Именно поэтому они и были изобретены! Это просто инструменты для создания игр. 99% проектов могут быть разработаны с использованием существующего программного обеспечения. Это не жалость. В конце концов, главное — это сама игра!
Если вы хотите таким образом сэкономить время и деньги, забудьте об этом! Создание двигателя с нуля требует много времени, а время = деньги. Использование готового программного обеспечения лучше, чем разработка собственного. В долгосрочной перспективе это может быть выигрышной стратегией, но только если движок станет основой для многих прибыльных проектов и будет намного проще в использовании, чем коммерческий движок. Такое программное обеспечение трудно разработать, особенно в первый раз (и почти невозможно в 3D).
Принимая решение, учитывайте свой опыт и цели. Чем меньше у вас опыта в создании игр, тем сложнее будет разрабатывать движок. Всегда практикуйтесь перед использованием игрового программного обеспечения.
Я начал играть во флеш-игры в 90-х годах, но в то время ни один игровой движок не поддерживал импорт флеш-анимации. Единственным решением было создание собственного программного обеспечения. Гораздо лучше и быстрее поместить swf-файлы в папку resources и использовать анимацию в игре без промежуточных шагов, таких как экспорт в список спрайтов.
Конечно, возможность создания собственного движка во многом зависит от того, насколько большой опыт вы имеете как в создании игр, так и в программировании. Создание программного обеспечения на заказ — хорошая идея. Вам не придется постоянно искать учебники в Google и самостоятельно исправлять возникающие ошибки. В то же время достаточно сделать несколько ошибок, и проект развалится, а вам некуда будет обратиться за советом. Владение собственным двигателем означает полный контроль, но это также означает полную ответственность за продукт.
Игровой движок — это рабочая среда, в которой создается игра. Она состоит из основы, на которой строится проект, и частей, из которых, как из кусочков Lego, состоит сама игра. Это что-то среднее между "игровой логикой" и "скучной технологией". Игровой движок предоставляет вам прямой доступ к взаимодействующим элементам без необходимости переписывать способ условного отображения треугольников в коде игры.
Разные машины требуют разного объема работы. Некоторые просто выводят графику на экран (например.
вспышки, вспышки света, вспышки света, вспышки света, вспышки света), в то время как другие (такие какFactorio), что может выглядеть не очень хорошо (Factorio). Другие являются либо полностью настраиваемыми играми сами по себе, либо ориентированы исключительно на определенный жанр (RPG-ЦукурРен’ПиFactorio), что может выглядеть не очень хорошо (FactorioИгровые движки обычно основаны на простой структуре, такой какSDL
иOpenGLОни включают специальные библиотеки для аудио, видео, физики и математики. При создании двигателя нет необходимости вручную описывать каждую деталь. Почти для всех потенциально полезных опций имеются соответствующие библиотеки.Основные функции двигателя.Это основы, необходимые для начала создания игры.
Инициализация системы.
Это настраивает программу на выполнение после запуска. Открывается окно и загружаются данные. Это (и многое другое!) обрабатывается с помощью простой в использовании стандартной библиотеки SDL.
Управление частотой кадров
Ограничьте частоту кадров для более плавного просмотра и оптимизации производительности.
Существует множество способов реагировать на нажатия клавиш и движения джойстика, которые обычно обрабатываются вышеупомянутыми SDL. Поэтому при использовании для инициализации больше ничего добавлять не нужно. На его основе можно построить мощную и гибкую систему импорта, но на начальном этапе достаточно системы по умолчанию.
Реализация.
Большинство игр (по крайней мере 75%) используют графику, и за нее отвечает движок. 2D-игры могут отображать текстурированные квадраты на экране с минимальным рендерингом. Шейдеры, вершинные изоляторы, рендеринг с изоляторами, сетки и материалы — отличные опции, которые можно добавить позже, если потребуется. Если вы хотите возиться с OpenGL или Vulkan и настраивать рендерер — вперед! Однако нет ничего постыдного в использовании готовых библиотек, таких как
Ogre3D
. Какой из них выбрать, зависит от ваших целей и потребностей, а также от того, какие задачи разработчикам интереснее решать самостоятельно.Математика и другие коммунальные услугиЕсли возможно, и код игры, и машина могут получить доступ к этим библиотекам. Кроме того, другие полезные функции и типы вы найдете в процессе разработки.
СТБ.
— Отличный источник для поиска всевозможных вспомогательных программ, которые могут быть полезны при производстве двигателей.Дополнительные функции.Кроме того, есть ряд вещей, которые лучше всего добавлять в автомат поблизости, когда они действительно необходимы для игры.
Управление играми и сценами
Хотя можно планировать вручную, практичнее предусмотреть систему для работы с отдельными объектами и коллекциями игр. Это один из основных механизмов автомата, так как он управляет логикой игры. Из каких элементов состоят объекты, на какие события они реагируют, как они взаимодействуют, что касается структуры памяти, используется ли ECS? ("Чистый" безошибочный ECS, кстати, подходит только для особых случаев). Эти вопросы должны быть охвачены системой управления объектами и сценами. Существуют готовые библиотеки для таких задач (особенно чистый ECS), но эта структура, как правило, является началом "Сделай сам", так как она оказывает самое сильное влияние на код игры. Использование существующих решений требует постоянных размышлений о том, как структурировать логику игры. Это настройка машины для выражения предполагаемой логики игры.
Звук.
Звуковые эффекты и музыка здесь отдельные, но скрыты под именем. Основные необходимые функции — это запуск и остановка аудио циклов и воспроизведение звуковых эффектов от начала до конца. Звуки не ограничиваются ими, но могут исчезать даже при двух основных вариантах. Недостатком является то, что стандартные звуковые рамки (
fmod
иwwise) являются коммерческими и имеют множество лицензионных ограничений. Однако большинство ресурсов с открытым исходным кодом являются хитрыми (я говорю приветОткрыть). Я использую свои собственные.Фаудио. — простая, удобная основа для создания сложных звуковых механизмов на мой вкус.Загружайте и управляйте файлами.Файлы, снятые со всех игр. Маловероятно, что вы захотите заряжать и декодировать уже добавленные файлы вручную, поэтому вам понадобится система для работы с ними. В будущем в программу загрузки файлов могут быть добавлены другие функции, например, поддержка MODS или динамическая выгрузка. Это не срочно — на начальном этапе вы можете использовать Build -in Manager, но со временем вам понадобится так много файлов, что вам понадобится соответствующая система для управления файлами и ресурсами.
Сетевое взаимодействие.
Теперь онлайновый мультиплеер очень необязателен. Если вы не собираетесь использовать функциональность P2P, не беспокойтесь. Однако очень трудно интегрировать эту систему в машины, не предназначенные для многопользовательской игры. Поэтому, если вы планируете или допускаете добавление многопользовательской игры, подготовьте почву заранее, так как всю систему придется переделывать.
Это основной набор систем, входящих в состав игрового автомата. Другие опции, такие как обнаружение конфликтов, физика, серии, мультфильмы и пользовательский интерфейс, уже являются опциональными. Они включены в большинство машин, потому что они распространены, но не являются необходимыми для сборки игрушек. Конфликтов можно избежать, например, используя вспомогательные математические программы для предсказания алгоритмов игрового кода. Базовая гравитация и ускорение могут быть настроены без физического движка
box2d
Сферы.. Кроме того, полная сериализация не является необходимой, если вы хотите сохранить контрольные точки.Написанный вами двигатель, безусловно, будет иметь меньше систем и функций, чем типичный коммерческий двигатель. Это цель! Unity и Unreal — это огромные монолиты, и отдельные игры используют лишь малую часть предлагаемых возможностей. Добавляйте только то, что нужно для вашей конкретной ситуации, и сосредоточьтесь на том, чтобы сделать инструменты разработки лучше и проще в использовании.Прежде чем приступать к самостоятельной работе, ознакомьтесь с тем, как работают другие игровые движки. Узнайте, какие примеры и алгоритмы они используют, что хорошо, а что раздражает. Попробуйте создать мини-игры на некоторых машинах, чтобы понять, как они работают.
Итак, вы сравниваете и сопоставляете плюсы и минусы, понимаете, чего вы хотите, и, наконец, решаете выбрать двигатель. Так как же вы собираетесь это сделать?
Ключевым моментом является создание игры параллельно с разработкой движка. Это правило, которое нельзя нарушать. Как можно скорее изучите основы и сразу же начинайте строить игру на их основе. Автомат — ничто без игры.
Это необходимо, поскольку функциональность движка должна соответствовать потребностям игры, созданной с его помощью. Если ваш проект не требует сложной анимации, вы не поймете, как создать хорошую систему анимации. Слабые стороны движка проявляются в процессе создания игры. Возможно, вам нужна древовидная система, в которой удаленные объекты не отображаются до тех пор, пока они не окажутся на определенном расстоянии? Я не знаю, и вы не узнаете, пока не создадите игровой уровень, который плохо висит. Тем не менее, проблема может заключаться не в обновлении объектов. Вам нужно проверить.
Не планируйте ненужные объекты. Если пользовательский интерфейс вашей игры — это просто кнопка Play в главном меню, поздравляем! Вам не нужно создавать сложный пользовательский интерфейс. A A A A
Конец близок.
В игре нет физического движка или детектора столкновений. Даже фотоаппарата нет, так как он там не нужен. Вместо сложного редактора для создания карты мира была использована электронная таблица .csv. Он прост в реализации и отлично работает.Детали реализации не описаны. Существует слишком много методов, каждый из которых подходит для конкретной ситуации. Не существует "лучшего варианта рендеринга" или "самого правильного способа управления объектами". Все зависит от игры. Начните с основ и расширяйте по мере необходимости.Что касается языков программирования — выбирайте тот, который вы знаете лучше всего. Разработка самого движка — задача не из легких, а если вы будете разрабатывать его параллельно с изучением C++, то и то, и другое будет вдвойне сложнее. C # идеально подходит для создания двигателей. Он медленнее, чем C ++, но это не так важно. Более медленные языки, такие как Python, могут вызвать проблемы, если в вашей игре много движущихся объектов… Но для некоторых игр этого достаточно. Используйте то, что вам удобно.
И еще одно: вы не добьетесь успеха с первой попытки. Моя первая игра на собственном движке была…
Закрыто.
и это беспорядок (забавно, но она была номинирована на награду за техническое превосходство на фестивале независимых игр 2010 года). Система отображения и информации справлялась со всей игрой двумя руками. Добавление новых объектов было очень трудоемким, с большим количеством кода и редактором анимации, поэтому в итоге у нас получилось около десятка интерактивных объектов. Существовало множество вариаций некоторых из них, которые существенно меняли поведение объектов — это было проще, чем добавлять новые. Таким образом, фары, зеркала и турели по сути одинаковы.Однако с ошибками приходит опыт. Движок Closure был немного плохо написан, но его хватило для запуска игры на PS3. Идея переписать некоторые части движка была привлекательной, но это привело бы к задержке выпуска игры. Вместо этого мы писали заметки о том, что пошло не так, чтобы в следующий раз мы могли объяснить свои ошибки. В частности, о том, что помешало немедленному построению игры. То же самое можно сказать и о The EndisNigh. В его двигателе (который, кстати, намного лучше, чем двигатель Крогера) все еще было много ошибок, через которые я прошел со скрежетом зубов. Как только игра была выпущена, я начал совершенствовать движок, исправлять досадные ошибки и добавлять новые возможности для следующего проекта.И так далее, и так далее. Учитесь, создавайте игру, запускайте ее, а затем начинайте все сначала. Пока двигатель не станет действительно хорошим.
Технические детали интеграции отдельных систем в двигатель не описаны. Это зависит от конкретного случая использования, есть сотни способов — и каждый из них правильный. Решить, что подходит именно вам, — это именно то, что нужно для разработки двигателя, и стоит строить свой проект с учетом этого.
Именно об этом я хотел сказать в этой статье. Возможно, у вас был мотив разработать свой собственный двигатель или вы отошли от этой идеи. Любой из вариантов подходит, если вы знаете, чего хотите.