Полное руководство для начинающих по разработке игр в Unity

Unity - отличный инструмент для создания прототипов всего, от игр до интерактивных визуализаций. В этой статье мы рассмотрим все, что вам нужно знать, чтобы начать использовать Unity.

Во-первых, немного обо мне: я любитель Unity, разработчик 3D-моделирования и графический дизайнер, который работал с Unity и Blender более 5 лет. Сейчас я студент факультета финансовой математики Дублинского университетского колледжа и иногда занимаюсь графическим дизайном-фрилансером, веб-прототипированием и созданием прототипов игр.

Введение

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

Почему Unity?

Если вы хотите делать игры

Когда дело доходит до разработки инди-игр, вариантов действительно очень мало. Если вы хотите создавать игры, есть три основных варианта: Unreal, Unity или GameMaker.

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

В Unity есть множество очень успешных игр, таких как Escape from Tarkov (FPS), Monument Valley (Puzzler) и This War of Mine (Стратегия / Выживание).

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

Если вы хотите прототипировать пользовательский опыт

Поскольку Unity - это всего лишь движок с кучей физики, анимации и 3D-рендеринга в реальном времени, это также отличное место для создания полноценных интерактивных прототипов для исследований UX.

Unity полностью поддерживает VR и AR и, следовательно, может стать отличным инструментом для изучения архитектуры, автоматизации и моделирования с помощью клиентов.

Разделы к этой статье

  • Почему Unity?
  • Окно редактора Unity
  • Объекты Unity Game
  • Встроенные компоненты Unity
  • Создание пользовательских компонентов
  • Структура моноповедения
  • Управление игровыми объектами
  • Raycasting
  • Обнаружение столкновений
  • Расширенные возможности
  • Совет новичкам
  • Хорошие ресурсы и сообщества
  • Вывод

Окно редактора Unity

Окно редактора разделено на несколько разделов. Мы рассмотрим это очень кратко, так как будем постоянно к нему обращаться на протяжении всей статьи. Если вы уже знакомы с этим, пропустите мимо!

Просмотр сцены: позволяет размещать и перемещать игровые объекты в сцене. Просмотр игры: предварительный просмотр того, как игрок будет видеть сцену с помощью камеры. Инспектор: предоставление сведений о выбранном GameObject в сцене. Assets / Project: здесь хранятся все префабы, текстуры, модели, скрипты и т. Д. Иерархия: позволяет вложение и структурирование игровых объектов внутри сцены.

Теперь мы готовы начать!

Объекты Unity Game

Что такое GameObjects

GameObjects - это основной строительный блок всего игрового движка Unity. Название почти выдает это:

Все, что вы размещаете в сцене в Unity, должно быть заключено в «игровой объект».

Если у вас есть опыт веб-дизайна, вы можете думать о GameObjects как о элементах! Чрезвычайно скучные контейнеры, но они легко расширяемы для создания сложной функциональности или визуальных эффектов.

Буквально все, от эффектов частиц, камер, игроков, элементов пользовательского интерфейса,… (список продолжается) - это GameObject.

Создание иерархии

Как и в веб-разработке, GameObject также является контейнером. Точно так же, как вы вкладываете объекты для создания разнообразных и желаемых макетов или абстракций, вы можете сделать то же самое с игровыми объектами.

Логика вложения игровых объектов во многом такая же, как и при веб-разработке, я приведу несколько примеров ...

Беспорядок и эффективность

Веб-аналогия: у вас есть много похожих элементов, которые могут динамически генерироваться "на лету" в ответ на взаимодействие с пользователем, и вы хотите, чтобы они оставались аккуратными. Unity Translation: вы создаете клон Minecraft и у вас есть множество блоков в сцене, вам нужно добавлять и удалять «куски» блоков из сцены по соображениям производительности. Таким образом, их родительство с пустым GameObject для каждого блока имеет смысл, поскольку удаление родительского блока удаляет все дочерние блоки.

Позиционирование

Веб-аналогия: вы хотите сохранить положение содержимого, содержащегося «относительно» контейнера, а не веб-страницы. Unity Translation: вы создали группу дронов-помощников, которые парят над игроком. На самом деле вы бы не стали писать код, чтобы они гонялись за игроком, поэтому вместо этого вы создаете их как дочерние элементы игрового объекта player.

Встроенные компоненты Unity

Компонентная модель актера

Сами по себе GameObjects довольно бесполезны - как мы видели, они в значительной степени просто контейнеры. Чтобы добавить к ним функциональность, мы должны добавить компоненты, которые по сути представляют собой сценарии, написанные на C # или Javascript.

Unity работает на основе модели компонентов акторов, проще говоря, GameObjects - это актеры, а компоненты - ваши скрипты.

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

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

Ключевые встроенные компоненты

Думаю, пришло время привести несколько примеров встроенных компонентов, предоставляемых движком Unity Games.

  • MeshFilter: позволяет назначать материалы для 3D-сетки GameObject.
  • MeshRender: позволяет назначать материалы 3D-сетке.
  • [Коробка | Mesh] Collider: позволяет обнаруживать GameObject во время столкновений.
  • Rigidbody: позволяет реалистичному физическому моделированию воздействовать на GameObjects с 3D-сетками и запускать события обнаружения на коллайдерах боксов.
  • Свет: освещает части вашей сцены
  • Камера: определяет область просмотра игрока, которая будет прикреплена к GameObject.
  • Различные компоненты холста пользовательского интерфейса для отображения графического интерфейса пользователя

Их еще много, но это основные, с которыми вам нужно ознакомиться. Один совет заключается в том, что вы можете получить доступ ко всем документам по ним через руководство по Unity и справочник по сценариям в автономном режиме, где бы вы ни находились:

Создание пользовательских компонентов

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

Чтобы начать создание компонентов, перейдите в нужный GameObject> Добавить компонент> введите имя вашего нового компонента в строке поиска> новый скрипт (c #).

В качестве общей рекомендации я бы не советовал использовать Javascript в Unity. Он не обновлялся со всеми замечательными вещами, которые поставлялись с ES6, и большая часть более продвинутых вещей основана на материалах C #, перенесенных на Javascript ... По моему опыту, это просто становится одним гигантским обходным решением.

Структура моноповедения

Ключевые функции

Все компоненты наследуются от класса MonoBehaviour. Он включает в себя несколько стандартных методов, главное:

  • void Start () вызывается всякий раз, когда объект, содержащий скрипт, создается в сцене. Это полезно в любое время, когда мы хотим выполнить некоторый код инициализации, например. установить экипировку игрока после того, как он появится в матче.
  • void Update (), который вызывается каждый кадр. Именно здесь будет выполняться основная часть кода, включающего пользовательский ввод, обновляющего различные свойства, такие как движение игрока в сцене.

Переменные инспектора

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

Другой пример, в котором мы можем захотеть сделать это, - это создание компонента пользовательского интерфейса, который отслеживает движения мыши пользователя и помещает курсор в область просмотра. Здесь мы могли бы захотеть контролировать чувствительность курсора к движениям (если пользователь использовал джойстик или геймпад против компьютерной мыши). Таким образом, имеет смысл сделать эти переменные легко изменяемыми как в режиме редактирования, так и экспериментировать с ними во время выполнения.

Мы можем сделать это легко, просто объявив их как общедоступные переменные в теле компонента.

Принятие пользовательского ввода

Конечно, мы хотим, чтобы наша игра реагировала на ввод пользователя. Наиболее распространенные способы сделать это - использовать следующие методы в функции Update () компонента (или в любом другом месте):

  • Input.GetKey (KeyCode.W) Возвращает True W, удерживается клавиша W
  • Input.GetKeyDown (KeyCode.W) Возвращает True при первом нажатии клавиши W.
  • Input.GetAxis («По вертикали»), Input.GetAxis («По горизонтали») Возвращает значение между -1,1 движения мыши при вводе.

Управление игровыми объектами

Когда у нас есть пользовательский ввод, мы хотим, чтобы GameObject в нашей сцене реагировал. Мы можем рассмотреть несколько типов ответов:

  • Перевод, вращение, масштаб
  • Создать новые GameObjects
  • Отправка сообщений существующим GameObject / компонентам

Трансформации

Все GameObjects имеют свойство transform, которое позволяет выполнять различные полезные манипуляции с текущим игровым объектом.

Вышеупомянутые методы достаточно понятны , просто обратите внимание, что мы используем gameObject в нижнем регистре для ссылки на GameObject, которому принадлежит этот конкретный экземпляр компонента.

В общем, рекомендуется использовать локальное [Положение, Вращение], а не глобальное положение / поворот объекта. Обычно это упрощает перемещение объектов разумным образом, поскольку ось локального пространства будет ориентирована и центрирована на родительском объекте, а не на мировом начале координат и направлениях x, y, z.

Если вам нужно преобразовать между локальным и мировым пространством (что часто бывает), вы можете использовать следующее:

Как вы понимаете, за этим стоит довольно простая линейная алгебра, на которую намекает «Обратный» в имени метода.

Создание новых игровых объектов

Поскольку GameObjects - это практически все в вашей сцене, вы можете иметь возможность генерировать их на лету. Например, если у вашего игрока есть какая-то пусковая установка для снарядов, вы можете захотеть создать снаряды на лету, у которых есть собственная инкапсулированная логика для полета, нанесения урона и т. Д.

Сначала нам нужно ввести понятие префаба . Мы можем создать их, просто перетащив любой GameObject в иерархии сцены в папку с ресурсами.

По сути, здесь хранится шаблон объекта, который только что был в нашей сцене, со всеми теми же конфигурациями.

Когда у нас есть эти сборные компоненты, мы можем назначить их переменным инспектора (как мы говорили ранее) для любого компонента в сцене, чтобы мы могли создавать новые GameObject, как указано в сборке, в любое время.

Затем мы можем выполнить «создание» префаба и манипулировать им в желаемом месте на сцене и установить необходимые родительские отношения.

Доступ к другим игровым объектам и компонентам

Часто нам нужно общаться с другими GameObject, а также с их компонентами. Если у вас есть ссылка на игровой объект, это довольно просто.

ComponentName comp = some_game_object.GetComponent ();

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

Доступ через переменную инспектора

Это самый простой способ. Просто создайте общедоступную переменную для GameObject, как мы продемонстрировали ранее с префабами, и вручную перетащите ее на компонент через инспектор. Затем перейдите к переменной, как указано выше.

Доступ через теги

Мы можем пометить GameObjects или prefabs через инспектор, а затем использовать функции поиска игровых объектов, чтобы найти ссылки на них.

Это просто делается, как показано ниже.

GameObject some_game_object = GameObject.FindGameObjectWithTag («Кирпич»);

Доступ через преобразование

Если мы хотим получить доступ к компонентам в каком-либо родительском объекте, мы можем легко сделать это с помощью атрибута transform.

ComponentName comp = gameObject.transform.parent.GetComponent ();

Доступ через SendMessage

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

gameObject.SendMessage («Имя метода», параметры); // Рассылка messagegameObject.SendMessageUpwards («MethodName», params); // Получено только компонентами, вложенными выше.

Raycasting

Возможно, вы слышали об этом раньше, когда люди сравнивали игры FPS, основанные на «физике» или «на основе лучей». Raycasting по сути похож на лазерную указку, которая, когда она входит в контакт с «коллайдером» или «твердым телом», возвращает «попадание» и передает детали объекта.

Есть два сценария, в которых это может пригодиться (вероятно, их гораздо больше):

  1. Если вы разрабатываете систему оружия для игры, вы можете использовать raycasting для обнаружения попаданий и даже настроить длину луча, чтобы предметы ближнего боя «поражали» только на коротких дистанциях.
  2. Создайте луч от указателя мыши до точки в трехмерном пространстве, то есть если вы хотите, чтобы пользователь мог выбирать юнитов с помощью мыши в стратегической игре.

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

Обнаружение столкновений

Ранее мы упоминали компоненты Collider и Rigidbody, которые можно добавить к объекту. Правило для столкновений состоит в том, что один объект в столкновении должен иметь твердое тело, а другой - коллайдер (или оба имеют оба компонента). Обратите внимание, что при использовании raycasting лучи будут взаимодействовать только с объектами, к которым прикреплены компоненты коллайдера.

После настройки в любом настраиваемом компоненте, прикрепленном к объекту, мы можем использовать методы OnCollisionEnter, OnCollisionStay и OnCollisionExit для реагирования на столкновения. Как только у нас будет информация о столкновении, мы сможем привлечь к ответственности GameObject и использовать то, что мы узнали ранее, для взаимодействия с компонентами, прикрепленными к нему.

Следует отметить, что твердые тела обеспечивают физику, такую ​​как гравитация для объектов, поэтому, если вы хотите, чтобы это было отключено, вам нужно будет включить is_kinematic .

Расширенные возможности

Мы не будем вдаваться в подробности сейчас, но, возможно, в следующей статье - просто чтобы вы знали, что они существуют.

Создание графического интерфейса

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

Расширение редактора Unity

Unity позволяет вам добавлять пользовательские кнопки к вашим инспекторам, чтобы вы могли влиять на мир в режиме редактирования. Например, чтобы помочь в построении мира, вы можете разработать настраиваемое окно инструментов для строительства модульных домов.

Анимация

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

Материалы и PBR

Unity использует физический движок рендеринга, который обеспечивает освещение в реальном времени и реалистичные материалы. Реальность такова, что вам нужно либо сначала изучить 3D-моделирование, либо использовать модели, созданные и оптимизированные кем-то другим, прежде чем вы доберетесь до этого, чтобы создавать вещи, которые действительно хорошо выглядят.

Совет новичкам

Если вы планируете написать свою первую игру, не стоит недооценивать сложность и время, необходимое для написания даже самой тривиальной игры. Помните, что над большинством игр, которые выходят в Steam, команды работают над ними в течение многих лет!

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

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

Хорошие ресурсы и сообщества

Сообщество разработчиков игр - одно из лучших среди всех, и в индустрии есть множество высококвалифицированных профессионалов, которые размещают контент бесплатно или почти бесплатно. В этой области требуются разработчики 3D-моделей, концептуальные художники, дизайнеры игр, программисты и так далее. Я связал несколько замечательных общих ресурсов, которые я нашел для каждого из этих полей ниже:

Концептуальное искусство

  • Школа дизайна Фэн Чжу (более 90 часов уроков по концепт-арту)
  • Тайлер Эдлин Арт (Великое арт-сообщество BST с отзывами профессионалов о ежемесячных испытаниях)
  • Art Cafe (Интервью и мастер-классы с известными концепт-художниками)
  • Трент Канюга (иллюстратор и 2D-художник, который также делает свою игру)

3D моделирование

  • CG Cookie (лучшие основы моделирования сетки в Blender, у них есть множество другого отличного контента для блендера)
  • Тор Фрик (модельеры и скульпторы твердых поверхностей в Blender)
  • Глеб Александров (Краткие мощные уроки по рендерингу в Blender)

Игровой дизайн

  • DoubleFine Amnesia Fortnight (разработчики игр, которые проводят двухнедельный хакатон и записывают весь процесс разработки)
  • Набор инструментов GameMakers (изучает принципы игрового дизайна)

Программирование

  • Handmade Hero (Написание игры и движка с нуля на C)
  • Джонатан Блоу (инди-разработчик, транслирующий свою разработку игры)
  • Brackeys (Хорошие учебники по Unity)

Вывод

Надеюсь, вам понравился этот урок! Я немного занимаюсь графическим дизайном, а также создаю прототипы игр и пользовательского интерфейса, так что загляните в мое портфолио ! Я тоже на связи .

портфолио| LinkedIn