Повысьте уровень своего кода с помощью шаблонов программирования игр


Если у вас есть опыт работы с объектно-ориентированными языками программирования, то вы наверняка слышали о принципах SOLID, паттернах MVP, singleton, factory и observer. Наша новая электронная книга рассказывает о лучших практиках использования этих принципов и паттернов для создания масштабируемой архитектуры игрового кода в вашем проекте Unity.
На каждую проблему, с которой вы столкнулись при разработке программного обеспечения, найдется тысяча разработчиков, которые уже сталкивались с ней. Хотя вы не всегда можете напрямую спросить у них совета, вы можете учиться на их решениях с помощью паттернов проектирования.
Внедряя в проект Unity общие шаблоны проектирования игрового программирования, вы сможете эффективно создавать и поддерживать чистую, организованную и читаемую кодовую базу, что, в свою очередь, создаст прочный фундамент для масштабирования вашей игры, команды разработчиков и бизнеса.
В нашем сообществе мы часто слышим, что научиться внедрять паттерны и принципы проектирования, такие как SOLID и KISS, в повседневную разработку может быть пугающе сложно. Именно поэтому наша бесплатная электронная книга, Повысьте уровень своего кода с помощью паттернов программирования игррассказывает об известных паттернах проектирования и делится практическими примерами их использования в вашем проекте Unity.
Написанная внутренними и внешними экспертами Unity, эта электронная книга - ресурс, который поможет расширить инструментарий разработчика и ускорить успех вашего проекта. Читайте далее, чтобы узнать, что включает в себя руководство.
Паттерны проектирования - это общие решения распространенных проблем, встречающихся в программной инженерии. Это не готовые решения, которые вы можете скопировать и вставить в свой код, а дополнительные инструменты, которые при правильном использовании помогут вам создавать более крупные и масштабируемые приложения.
Последовательно внедряя паттерны в свой проект, вы сможете улучшить читаемость кода и сделать свою кодовую базу чище. Паттерны проектирования не только уменьшают количество рефакторингов и время, затрачиваемое на тестирование, но и ускоряют процессы внедрения и разработки.
Однако каждый паттерн проектирования имеет свои компромиссы, будь то дополнительные структуры, которые нужно поддерживать, или большее количество настроек на начальном этапе. Вам нужно будет провести оценку затрат и выгод, чтобы определить, оправдывает ли преимущество дополнительную работу. Конечно, эта оценка будет зависеть от вашего проекта.
KISS означает "будь проще, глупенький". Цель этого принципа - избежать излишней сложности системы, так как простота помогает повысить уровень принятия и взаимодействия с пользователем.
Обратите внимание, что "просто" не равно "легко". Сделать что-то простым - значит сделать его целенаправленным. Хотя вы можете создать ту же функциональность без шаблонов (и зачастую быстрее), быстрое и простое не обязательно приводит к простоте.
Если вы не уверены, что тот или иной шаблон применим к вашей конкретной проблеме, можете повременить до тех пор, пока не почувствуете, что он подходит более естественно. Не используйте узор, потому что он для вас нов или необычен. Используйте его, когда он вам нужен.
Именно в таком духе и была создана эта электронная книга. Держите руководство под рукой как источник вдохновения для поиска новых способов организации кода, а не как строгий свод правил, которым вы должны следовать.
Теперь перейдем к рассмотрению некоторых ключевых принципов проектирования программного обеспечения.

SOLID - это мнемоническая аббревиатура, обозначающая пять основных принципов проектирования программного обеспечения. Их можно рассматривать как пять основных правил, о которых следует помнить при написании кода, чтобы объектно-ориентированные проекты оставались гибкими и поддерживаемыми.
Принципы SOLID были впервые представлены Робертом К. Мартином в работе " Принципы проектирования и шаблоны проектирования". Впервые опубликованные в 2000 году, описанные принципы применимы и сегодня, в том числе и к написанию сценариев на C# в Unity:
- Единая ответственность гласит, что каждый модуль, класс или функция отвечает за что-то одно и инкапсулирует только эту часть логики.
- Open-closed гласит, что классы должны быть открыты для расширения, но закрыты для модификации; это означает, что вы можете структурировать свои классы для создания нового поведения, не изменяя исходный код.
- Лисковская подстановка гласит, что при использовании наследования производные классы должны быть заменяемы своими базовыми классами.
- Разделение интерфейсов гласит, что ни один клиент не должен быть вынужден зависеть от методов, которые он не использует. Клиенты должны внедрять только то, что им нужно.
- Инверсия зависимостей гласит, что модули высокого уровня не должны импортировать что-либо напрямую из модулей низкого уровня. И то, и другое должно зависеть от абстракций.
В электронной книге мы приводим иллюстрированные примеры каждого принципа с четкими объяснениями их использования в Unity. В некоторых случаях соблюдение SOLID может привести к дополнительной работе на начальном этапе. Возможно, вам придется рефакторить часть функциональности в абстракции или интерфейсы, но это часто окупается долгосрочной экономией.
Эти принципы уже почти два десятилетия доминируют в разработке программного обеспечения на уровне предприятия, поскольку они так хорошо подходят для больших приложений, которые масштабируются. Если вы не знаете, как их использовать, обратитесь к принципу KISS. Будьте проще и не пытайтесь навязать принципы в своих сценариях только ради того, чтобы сделать это. Пусть они органично впишутся в интерьер в силу необходимости.
Если вам интересно узнать больше, посмотрите презентацию SOLID с Unite Austin 2017, которую провел Дэн Сагмиллер из Productive Edge.
В чем разница между принципом проектирования и паттерном проектирования? Один из способов ответить на этот вопрос - рассматривать SOLID как основу или фундаментальный подход к написанию объектно-ориентированного кода. Хотя паттерны проектирования - это решения или инструменты, которые вы можете применить, чтобы избежать повседневных проблем с программным обеспечением, помните, что это не готовые рецепты или, тем более, алгоритмы с конкретными шагами для достижения определенных результатов.
Шаблон дизайна можно представить как чертеж. Это общий план, который оставляет фактическое строительство на ваше усмотрение. Например, две программы могут следовать одному и тому же шаблону, но содержать совершенно разный код.
Когда разработчики сталкиваются с одной и той же проблемой в природе, многие из них неизбежно приходят к похожим решениям. Когда решение повторяется достаточное количество раз, кто-то может "обнаружить" закономерность и официально дать ей название.
Многие из современных паттернов проектирования программного обеспечения берут свое начало в основополагающей работе Design Patterns: Elements of Reusable Object-Oriented Software by Erich Gamma, Richard Helm, Ralph Johnson, and John Vlissides. В этой книге рассматриваются 23 таких паттерна, выявленных в различных повседневных приложениях.
Оригинальных авторов часто называют "Бандой четырех" (GoF), и вы также услышите оригинальные паттерны, названные паттернами GoF. Хотя приведенные примеры в основном относятся к C++ (и Smalltalk), вы можете применить их идеи к любому объектно-ориентированному языку, например C#.
С тех пор как в 1994 году Gang of Four опубликовала книгу Design Patterns , разработчики создали еще десятки объектно-ориентированных паттернов в самых разных областях, включая разработку игр.


Хотя вы можете работать игровым программистом и без изучения паттернов проектирования, их изучение поможет вам стать лучшим разработчиком. В конце концов, паттерны проектирования называются так потому, что они являются общими решениями известных проблем.
Инженеры-программисты постоянно открывают их для себя в процессе разработки. Возможно, вы уже невольно применяете некоторые из этих шаблонов.
Приучите себя искать их. Это может помочь вам:
- Изучайте объектно-ориентированное программирование: Паттерны проектирования - это не секреты, зарытые в эзотерических постах StackOverflow. Это обычные способы преодоления повседневных препятствий в развитии. Они могут проинформировать вас о том, как многие другие разработчики обращались с подобной проблемой - помните, даже если вы не используете паттерны, кто-то другой их использует.
- Поговорите с другими разработчиками: Паттерны могут служить сокращением при общении в команде. Упомяните "шаблон команд" или "пул объектов", и опытные разработчики Unity поймут, что вы пытаетесь реализовать.
- Изучите новые фреймворки:Когда вы импортируете встроенный пакет или что-то из магазина Asset Store, вы неизбежно наткнетесь на один или несколько паттернов, обсуждаемых здесь. Распознавание паттернов проектирования поможет вам понять, как работает новый фреймворк, а также ход мыслей при его создании.
Как уже говорилось ранее, не все шаблоны проектирования применимы к каждому игровому приложению. Не ищите их с помощью молотка Маслоу, иначе вы можете найти только гвозди.
Как и любой другой инструмент, полезность паттерна проектирования зависит от контекста. Каждый из них дает преимущества в определенных ситуациях, а также имеет свои недостатки. Каждое решение при разработке программного обеспечения связано с компромиссами.
Вы генерируете много GameObjects на лету? Влияет ли это на вашу производительность? Может ли реструктуризация вашего кода исправить это? Помните об этих паттернах проектирования, и когда придет время, достаньте их из своего мешка игровых трюков, чтобы решить поставленную задачу.
В дополнение к " Шаблонам проектирования" от Gang of Four , "Шаблоны программирования игр" Роберта Нистрома - еще один выдающийся ресурс, который в настоящее время доступен бесплатно в виде веб-версии. Автор в доступной форме рассказывает о различных программных паттернах.
В нашей новой электронной книге вы сможете погрузиться в разделы, рассказывающие о таких распространенных паттернах проектирования, как фабрика, пул объектов, синглтон, команда, состояние, паттерн наблюдателя, а также модель представления (MVP) и другие. В каждом разделе описывается паттерн, его плюсы и минусы, а также приводится пример его реализации в Unity, чтобы вы могли оптимизировать его использование в своем проекте.
В Unity уже реализовано несколько устоявшихся паттернов для геймдева, что избавляет вас от необходимости писать их самостоятельно. К ним относятся:
- Игровая петля: В основе всех игр лежит бесконечный цикл, который должен функционировать независимо от тактовой частоты, поскольку аппаратное обеспечение, на котором работает игровое приложение, может сильно различаться. Чтобы учесть разную скорость работы компьютеров, разработчикам игр часто приходится использовать фиксированный временной интервал (с заданной частотой кадров в секунду) и переменный, когда движок измеряет, сколько времени прошло с момента предыдущего кадра.
Unity позаботится об этом, так что вам не придется реализовывать это самостоятельно. Вам нужно управлять игровым процессом только с помощью методов MonoBehaviour, таких как Update, LateUpdate и FixedUpdate. - Обновление: В игровом приложении вы часто будете обновлять поведение каждого объекта по одному кадру за раз. Хотя в Unity это можно сделать вручную, класс MonoBehaviour делает это автоматически. Используйте соответствующие методы Update, LateUpdate или FixedUpdate, чтобы изменить ваши GameObjects и компоненты на один тик игровых часов.
- Прототип: Часто требуется скопировать объекты, не затрагивая оригинал. Этот творческий паттерн решает проблему дублирования и клонирования объекта для создания других объектов, похожих на него самого. Таким образом вы избежите определения отдельного класса для порождения каждого типа объектов в вашей игре.
Система Unity Prefab реализует форму прототипирования для GameObjects. Это позволяет дублировать объект шаблона вместе с его компонентами. Переопределите определенные свойства, чтобы создать варианты префабов или вложить префабы внутрь других префабов для создания иерархий. Используйте специальный режим редактирования префабов, чтобы редактировать префабы изолированно или в контексте. - Компонент:Большинство людей, работающих в Unity, знают этот шаблон. Вместо того чтобы создавать большие классы с множеством обязанностей, создайте более мелкие компоненты, которые выполняют одну задачу.
Если вы используете композицию для выбора компонентов, вы можете комбинировать их для создания сложного поведения. Добавьте компоненты Rigidbody и Collider для физики или MeshFilter и MeshRenderer для 3D-геометрии. Каждый GameObjects настолько богат и уникален, насколько богата его коллекция компонентов.

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