Как сделать модель комнаты для юнити

Добавил пользователь Алексей Ф.
Обновлено: 04.10.2024

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

По сравнению с этим многопользовательские игры, такие как Fortnite и PUBG, покорили мир. Эти игры, которые легко осваивать, но трудно создавать. Они становятся все более популярными среди рекордного числа людей.

Некоторые люди даже делают карьеру из этих игр в качестве стримеров Twitch, что очень трудно сделать в одиночных играх.

В этом руководстве вы узнаете, как создать собственную многопользовательскую игру на Unity с использованием библиотеки Photon Unity Networking (для краткости PUN).

В этом уроке, вы узнаете:

  • Ключевые различия между Unity Networking и PUN.
  • Как создать сцену в лобби, чтобы игроки могли присоединяться
  • Как загрузить игровую сцену и синхронизировать значения трансформации игроков.

Прежде чем приступить к обучению, давайте рассмотрим основные различия между Unity Networking и Photon Unity Networking.

Изучение архитектуры

Движок Unity, как и PUN имеют похожие низкоуровневые API. Но архитектура, необходимая для этих библиотек, чтобы использовать эти API, является ключевым дифференцирующим фактором между ними.

Сравнение

Можете ознакомиться с этим видео:

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

Начинаем работу

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

Как только вы все настроите, загрузите стартовый проект, и откройте Photon Starter с Unity.Project Overview

Посмотрите на структуру папок в окне проекта:

Вот что содержит каждая папка:

  • LogViewer: Файлы, необходимые для актива LogViewer.
  • Materials: Материалы, необходимые для этого урока.
  • Models: Модели, необходимые для этого урока.
  • Photon: Файлы, необходимые для Фотонной библиотеки
  • PhysicsMaterial: Это физические материалы, которые будут использоваться в проекте.
  • Prefabs: Готовые префабы для туториала.
  • Resources: Сборные, которые должны быть синхронизированы Photon.
  • Scenes: Главное меню игры и сцены Арены.
  • Scripts: Скрипты, необходимые для проекта.

Откройте сцену запуска из Активов / RW / Сцены.

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

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

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

Создаём аккаунт в Photon

Примечание: Библиотека Photon Unity Networking уже присутствует в начальном проекте, который вы загрузили в начале этого учебного пособия, но вы также можете использовать ее в своих существующих проектах, загрузив пакет Unity Pack из хранилища активов.

Продолжайте работу, вернувшись в Редактор Unity, откройте Мастер PUN, выбрав Окно ▸ Фотон Unity сети ▸ Мастер PUN.

Настройка

Теперь, когда у вас есть Photon, давайте приступим к созданию лобби.

Создание Лобби

Вот обзор того, что делает скрипт Launcher.cs, по порядку:

  1. Лаунчер подключается к сети Photon Network.
  2. После подключения примите два вводных значения от пользователя: имя игрока, которое он хочет использовать, и имя комнаты, которое они хотят создать или присоединиться.
  3. Если комнаты с введенным именем не существует, создайте комнату с таким именем и сделайте текущего игрока лидером лобби. Если Комната существует, игрок присоединится к Комнате.
  4. Как только оба игрока подключились к одной комнате, лидер лобби сможет загрузить сцену MainArena.

Откройте скрипт Launcher.cs в Assets / RW / Scripts.

Добавьте следующие строки кода в Launcher.cs после комментария // Start Method.

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

Вот краткое объяснение кода.

  1. При подключении к серверу PUN пропингует все доступные серверы и сохраняет IP-адрес сервера с самым низким пингом в виде пары ключ-значение PlayerPrefs. Это может привести к неожиданному поведению на этапе подключения. Чтобы избежать каких-либо аномалий, вызывается DeleteAllis при запуске сцены Launcher. Элементы пользовательского интерфейса по умолчанию скрыты и активируются после установления соединения с сервером Photon.
  2. ConnectToPhotonвызывается для подключения к сети Photon. Значение AutomaticsSyncScene имеет значение true. Это используется для синхронизации сцены между всеми подключенными игроками в комнате.

Загрузка сцены MainArena

Чтобы получить входные данные из элементов пользовательского интерфейса TextField, вам нужен открытый метод для сохранения значения в TextField. Добавьте следующий код после комментария // Tutorial Methods:

Затем добавьте следующие методы после комментария // Tutorial Methods:

Вот как работает этот код:

  1. Параметр GameVersion установлен. Это строка версии для вашей сборки и может использоваться для разделения несовместимых клиентов. Для этого урока его значение будет равно 1 (устанавливается при объявлении поля gameVersion).
  2. ConnectUsingSettingsвызывается, когда нужно подключиться к Photon, в редакторе уже всё настроено. Вы можете прочитать больше в документации.

Затем добавьте следующие строки кода:

Смотрите внимательно за каждой строкой кода:

  1. Параметр NickName LocalPlayer устанавливается из закрытой переменной playerName. Это имя будет доступно всем, с кем вы играете по сети Photon, и используется в качестве уникального идентификатора.
  2. Объект класса RoomOptions объявлен. Это оборачивает свойства общей комнаты, необходимые при создании комнаты. Он может использоваться для предоставления пользователю контроля над различными характеристиками комнаты, такими как максимальное количество игроков, которые могут присоединиться, PlayerTtl (Player Time To Live) и т. д. (Документация)
  3. Объявлен объект класса TypedLobby. Он относится к конкретному типу лобби на сервере Photon. Название и тип лобби используются в качестве уникального идентификатора. Имя комнаты задается из закрытой переменной roomName, а тип лобби устанавливается по умолчанию. (Документация)
  4. Наконец, метод JoinOrCreateRoom класса PhotonNetwork вызывается с аргументами — roomName, roomOptions и typedLobby, которые были установлены ранее. Если метод вызывается новым пользователем с новым именем комнаты, которое еще не существует, комната создается, и пользователь автоматически назначается лидером лобби. В противном случае другие игроки просто присоединяются к комнате.
  5. После того, как лидер лобби создал комнату и присоединился к ней, кнопка LoadArena станет активной. Перед загрузкой Arena устанавливается проверка, чтобы убедиться, что сцена MainArena загружена, только если оба игрока присоединились к комнате.

Методы обратного вызова PUN

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

Добавьте следующий код после комментария // Photon Methods:

Давайте посмотрим, что делает каждый фрагмент кода:

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

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

Использование компонента преобразования просмотра — Photon View

После того, как код комнаты объединен, следующая важная концепция Photon Unity Networking. Также важная функция, которую вам нужно знать, — это компонент Photon View.

PUN позволяет очень просто создать префаб, свойства которого (положение, вращение и т. д.) Должны синхронизироваться по сети во время многопользовательской игры с использованием компонента Photon View.

При использовании PUN важно понимать, что Prefab, который должен создаваться по сети, должен находиться внутри папки с именем Resources.

Важным побочным эффектом наличия Prefabs внутри папок Resources, является необходимость просмотра их имен. У вас не должно быть двух префабов под путями ресурсов ваших активов, названных одинаково, потому что Unity просто выберет первый, который найдет.

После этого давайте начнем создавать Game Manager.

Вот краткий обзор того, что собирается делать скрипт GameManager.cs:

  1. Когда сцена MainArena загружена, проверьте, является ли клиент главным в лобби или нет. Если это так, создайте игровой объект Car GameObject с помощью Instantiate, измените имя игрока 1 GameObject, а также создайте шарик GameObject. В противном случае просто создайте player2 GameObject и измените его имя.
  2. Добавьте метод обратного вызова PUN, который позаботится о различных случаях использования в зависимости от условий и событий сети.
  3. Вспомогательные методы отключат пользовательский интерфейс, комнату выхода и т. д.

Добавьте следующий код после комментария // Start Method:

Вот как это работает

Сохраните файл и вернитесь в редактор.

Теперь, когда у вас есть готовая логика для создания объектов Player и Ball GameObject, следующим шагом будет добавление необходимых компонентов, чтобы их можно было создать с помощью метода PhotonNetwork.Instantiate.

В Инспекторе вы должны увидеть, что некоторые базовые компоненты для Car GameObject (Rigidbody, Collider, Movements и т. д.) Уже являются частью префаба.

Поскольку по сети необходимо синхронизировать только свойства Transform объекта GameObject, добавьте компонент Photon Transform View в Car GameObject.

Вы заметите, что компонент Photon View также добавлен, так как компонент Photon Transform View уже наследует от него множество свойств.

В дополнение к синхронизации положения, поворота и масштаба GameObject, Photon Transform View дает вам много разных вариантов, чтобы синхронизированные значения выглядели гладкими, даже когда данные принимаются только пару раз в секунду.

Сохраните готовый префаб Car

Затем откройте префаб Ball из Assets / RW / Prefabs в режиме Prefab Editing и повторите вышеуказанные шаги:

Наконец, переместите префабы Car и Ball из папки Assets / RW / Prefabs в директорию Assets / RW / Resources, чтобы их можно было загрузить методом PhotonNetwork.Instantiate.

Время тестировать нашу игру!

Выберите File ▸ Build and Run, чтобы создать исполняемый файл для вашей операционной системы.

Вы должны увидеть, что сцена MainArena загружена двумя игроками (машинами) и мячом. Вы можете использовать кнопки WASD или клавиши со стрелками на клавиатуре, чтобы перемещать машину по арене.

Обратите внимание, что на обоих клиентах движется только 1 автомобиль (автомобиль, принадлежащий клиенту).

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

Вся работа выполняется с помощью компонента Photon Transform View, который вы добавили в префабы Car и Ball.

Однако если вы закроете один из клиентов, то другой клиент останется нестабильным. Для обработки подобных случаев вы добавите методы обратного вызова, чтобы выполнить необходимое действие в зависимости от текущей ситуации клиента (например, потеря сети или другой оставшийся игрок).).

Добавление методов обратного вызова PUN

Добавьте следующий код в скрипт GameManager.cs после комментария // Update Method:

Это довольно просто.

В любой момент игры, если нажата кнопка Escape, будет вызвано событие Application.Quit.

Затем добавьте следующий код после комментария // Photon Methods:

OnPlayerLeftRoom является методом обратного вызова PUN, который вызывается всякий раз, когда игрок покидает комнату, либо закрывая клиента, либо отключается от сети.

Наконец, добавьте следующий код после комментария // Вспомогательные методы: // Helper Method

При нажатии на Canvas / Top Menu Panel / Quit Room Button будет вызван данный метод.

Теперь вам предстоит установить событие On Click () и кнопки Quit Room на GameManager.QuitRoom

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

Что делать дальше?

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

Вы можете узнать больше о библиотеке Photon Unity Networking на официальном сайте

Начнем с самого простого: загрузки и настройки Unity.

Загрузите последнюю версию с официального сайта или торрента и запустите установочный файл.

Выбор редактора в Unity

Полезно знать: невозможно использовать отладчик Visual Studio 2013 Express с Unity. Вы должны иметь Pro версию Visual Studio и купить UnityVS плагин. С версией Express, вы будете иметь лучший редактор кода, но отсутствие отладчика сведет на нет все его достоинства.

Mac OS X

MonoDevelop 4 - существенно лучше, чем старый MonoDevelop 2 в предыдущих версиях Unity. Он, конечно, далек от совершенства, но ничего лучшего под на Mac не придумано.

На каком языке программировать в Unity?

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

Вот несколько ссылок, которые могут быть вам полезными:

  • Изучение интерфейса Unitys : основа всех основ. Не зная интерфейса, вы не сможете создавать игры в Unity 3D
  • Создание сцены в Unity : изучение этого раздела поможет вам создать свою собственную сцену
Первая сцена. Создаем новый проект.

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

Создание нового проекта в Unity

Выберите 2D настройки. Как и прежде, вы можете изменить этот флаг в настройках проекта позже.

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

Разметка и панели Unity

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

Пустой проект

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

Чтобы держать все под рукой, советуем создать папки во вкладке Project (Проект). Эти папки будут созданы в папке Assets вашего проекта.

Папки в Unity

Внимание: папка Assets – это место, где хранится все, что вы добавляете во вкладке Project. Она может быть невидимой в Unity, в зависимости от выбранной разметки вкладки (одна или две колонки), но вы сможете увидеть ее, открыв приложение для экспорта файлов.

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

Ассеты проекта

В вашей панели Project, вы можете найти различные типы ассетов:

Префабы

Многоразовые игровые объекты (например: пули, враги, бонусы).

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

Сцены

Сцена содержит игровой уровень или меню.

В отличие от других объектов, создаваемых в панели "Проект", сцены создаются в меню "Файл". Если вы хотите создать сцену, нажмите на кнопку "Новая сцена" в подменю и не забудьте потом сохранить ее в папку Scenes.

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

Звуки

Тут все предельно просто. Увидите, если захотите раскидать музыку по разным папкам.

Scripts

Textures

Спрайты и изображения вашей игры. В 2D проекте вы можете переименовать эту папку в "Sprites".

Это неважно для 2D проекта, но, оставив название Textures (Текстуры), вы дадите возможность Unity автоматизировать некоторые задачи. Если вы хотите узнать подробную информацию по этой теме, вы можете прочитать об этом здесь , или здесь .

Заметка о папке Resources : если вы уже работали с Unity, вы знает, что Resources – полезная и уникальная папка. Она позволяет загрузить в скрипт объект или файл (с помощью статичного класса Resources ). Она понадобится нам в самом конце (в главе, посвященной меню). Проще говоря, пока мы не будем ее добавлять.

Наша первая игровая сцена

Панель Hierarchy (Иерархия) содержит все объекты, которые доступны в сцене. Это то, чем вы манипулируете, когда начинаете игру с помощью кнопки "Play".

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

Логические объекты

Как вы можете видеть здесь, у нас здесь 3 потомка для объекта Level .

Пустые объекты

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

Пустые объекты

Убедитесь, что все они имеют координаты (0, 0, 0) и тогда вы сможете легко их найти! Пустые объекты никак не используют свои координаты, но они влияют на относительные координаты их потомков. Мы не будем говорить об этой теме в этом уроке, давайте просто обнулим координаты ныших пустых объектов.

Заполнение сцены

По умолчанию, новая сцена создается с объектом Main Camera (Главная камера). Перетащите ее на сцену.

Для начала создайте эти пустые объекты:

Scripts Мы добавим наши скрипты сюда. Мы используем этот объект, чтобы прикрепить сценарии, которые не связаны с объектом – например, скрипт гейм-менеджера. Render Здесь будет наша камера и источники света. Level

В Level создайте 3 пустых объекта:

  • 0 - Background
  • 1 - Middleground
  • 2 - Foreground

Сохраните сцену в папке Scenes . Назовите ее как угодно, например Stage1 . Вот, что у нас получилось:

Первая сцена на Unity

Совет: по умолчанию игровой объект привязан к положению родителя. Это приводит к интересному побочному эффекту при использовании объекта камеры: если камера является дочерним объектом, она автоматически будет отслеживать положение родителя. Если же она является корневым объектом сцены или находится внутри пустого игрового объекта, она всегда показывает один и тот же вид. Однако если вы поместите камеру в движущийся игровой объект, она будет следовать за его передвижениями в пределах сцены. В данном случае нам нужна фиксированная камера, поэтому мы помещаем ее в пустой объект Render . Но запомните это свойство объекта камеры, оно может вам пригодиться. Мы подробно остановимся на этой теме в главе "Паралаксный скроллинг".

Мы только что создали базовую структуру нашей игры. На следующем этапе мы начнем делать забавные вещи: добавим на сцену фон и кое-что еще!

Добавляем фон в сцену

Наш первый фон будет статическим. Воспользуемся следующим изображением:

TGPA фон

Импортируйте изображение в папку Textures (Текстуры). Просто скопируйте файл в нее, или перетащите его из проводника. Не беспокойтесь сейчас о настройках импорта.

Создайте в Unity новый игровой объект Sprite на сцене.

Новый спрайт для игры в Unity

Что такое спрайт?

По сути, спрайт – это 2D-изображение, используемое в видео-игре. В данном случае это объект Unity для создания 2D-игр.

Добавляем текстуру спрайта

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

Выбор спрайта в Unity

Вы должны нажать на маленький круглый значок справа от поля ввода, чтобы появилось Select Sprite (Выбрать спрайт) в Инспекторе

Вид спрайта

Итак, мы создали простой спрайт отображающий облака на небе. Давайте внесем изменения в сцену. В панели Hierarchy (Иерархия) выберите New Sprite . Переименуйте его в Background1 или что-то такое, что легко запомнить. Переименуйте его в Background1 или что-то такое, что легко запомнить. Затем переместите объект в нужное место: Level -> 0 - Background . Измените координаты на (0, 0, 0) .

Фон установлен

Создайте копию фона и поместите его в (20, 0, 0) . Это должно отлично подойти к первой части.

Фон 2

Слои со спрайтами

Следующее утверждение очевидно, но обладает некими неудобствами: мы отображения 2D мир. Это означает, что все изображения на одной и той же глубине, то есть 0 . И вы графический движок не знает, что отображать в первую очередь. Слои спрайтов позволяют нам обозначить, что находится спереди, а что сзади.

В Unity мы можем изменить "Z" наших элементов, что позволит нам работать со слоями. Это то, что мы делали в этом руководстве перед обновлением до Unity 5, но нам понравилась идея идея использовать слои со спрайтами. У вашего компонента Sprite Renderer есть поле с именем Sorting Layer с дефолтным значением. Если щелкнуть на нем, то вы увидите:

Сортировка списка слоев

Давайте добавим несколько слоев под наши нужды (используйте кнопку + ):

Добавить сортировку слоя в Unity

Добавьте фоновый слой к вашему спрайту фона:

Установить сортировку слоя

Настройка Order in Layer - это способ ограничить подслои. Спрайты с меньшим номером оказываются перед спрайтами с большими числами.

Слой Default нельзя удалить, так как это слой, используемый 3D-элементами. Вы можете иметь 3D-объекты в 2D игре, в частности, частицы рассматриваются как 3D-объекты Unity, так что они будут рендериться на этом слое.

Добавление элементов фона

Также известных как props. Эти элементы никак не влияют на геймплей, но позволяют усовершенствовать графику игры. Вот некоторые простые спрайты для летающих платформ:

Спрайты для платформ

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

Получение двух спрайтов из одного изображения

Выполняйте следующие действия:

  1. Импортируйте изображения в папку "Текстуры"
  2. Выберите спрайт Platform и перейдите к панели Инспектор
  3. Измените "Sprite Mode" на "Multiple"
  4. Нажмите на кнопку Sprite Editor (Редактор спрайта)

В новом окне ( Sprite Editor ) вы можете рисовать прямоугольники вокруг каждой платформы, чтобы разрезать текстуру на более мелкие части:

Редактор спрайтов

Кнопка Slice в левом верхнем углу позволит вам быстро и автоматически проделать эту утомительную работу:

Автоматическая нарезка

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

В этом уроке проделаем эту операцию вручную. Назовите платформы platform1 и platform2 . Теперь, под файлом изображения, вы должны увидеть два спрайта отдельно:

Результат редактора спрайтов

Добавим их в сцену. Для этого мы будем выполнять те же действия что и для фона: создадим новый спрайт и выберим platform1 . Потом повторим эти действия для platform2 . Поместите их в объект 1 - Middleground . Убедитесь, что их позиция по оси Z равна нулю.

Две новые платформы

Prefabs (Префабы)

Сохранить эти платформы как префабы. Просто перетащите их в папку Prefabs :

Префабы

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

соединение префабов

Заметка о кнопках "Prefab": При последующей модификации игрового объекта, вы можете использовать кнопку "Apply", чтобы применить эти изменения к Prefab , или кнопку "Revert", чтобы отменить все изменения игрового объекта в свойстваъ Prefab . Кнопка "Select" переместит выбранные свойства в ассет Prefab в окне проекта (они будут выделены).

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

Теперь вы можете добавить больше платформ, меняющих свои координаты, размеры и плоскости (вы можете поместить их на заднем или переднем плане, просто установите координату Z для платформы на 0 ).

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

Прежде чем двигаться дальше, мы модифицируем наши слои, чтобы избежать каких-либо проблем с порядком их отображения. Для этого просто измените позицию игровых объектов по оси Z во вкладке Hierarchy (Иерархия) следующим образом:

Слой Позиционирование по оси Z
0 - Задний фон 10
1 - Средний фон 5
2 - передний фон 0

При переключении из 2D режима в 3D, в окне "Scene" (Сцена) вы будете четко видеть слои:

Кликнув на игровом объекте Main Camera , вы увидите, что флажок Projection установлен на Orthographic . Эта настройка позволяет камере визуализировать 2D игру без учета трехмерных свойств объектов. Имейте в виду, что даже если вы работаете с 2D объектами, Unity по-прежнему использует свой 3D движок для визуализации сцены. Рисунок выше это наглядно демонстрирует.

В следующем уроке:

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

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

🎮 Игры

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

Вступление

Эта статья предназначена для всех, кто никогда раньше не использовал 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

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

Просмотр сцены: позволяет размещать и перемещать игровые объекты в сцене.

Просмотр игры: предварительный просмотр того, как игрок будет видеть сцену с камеры.

Инспектор: предоставьте подробную информацию о выбранном GameObject в сцене.

Assets / Project: здесь хранятся все префабы, текстуры, модели, скрипты и т. Д.

Иерархия: позволяет вложение и структурирование игровых объектов внутри сцены.

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

Объекты Unity Game

Что такое GameObjects

Если у вас есть опыт веб-дизайна, вы можете думать о GameObjects как о элементах

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Преимущества локального пространства станут немного более очевидными с диаграммой!

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Raycasting

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

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

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

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

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

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

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

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

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

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

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

Анимация

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

Материалы и PBR

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

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

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

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

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

Хорошие ресурсы для разработки игр в Unity

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

Unity может работать с 3D моделями любой формы, создаваемыми в приложениях для моделирования. Однако, существует ряд примитивных моделей, которые можно создать прямо в Unity: Куб ( Cube ), Сфера ( Sphere ), Капсула ( Capsule ), Цилиндр ( Cylinder ), Плоскость ( Plane ) и Квад ( Quad ). Эти объекты часто применяются как есть (плоскость обычно используется в качестве поверхности земли, например), но также они позволяют быстро создать прототипы сложных объектов в целях тестирования. Любой из примитивов может быть добавлен в сцену с помощью соответствующего пункта в меню GameObject > Create Other .


Это простой куб, с длиной ребра в одну единицу измерения. Куб текстурирован так, чтобы изображение повторялось на каждой из 6 его граней. Сам по себе куб не так часто встречается в играх, но если его отмасштабировать, то его можно использовать в качество стен, столбов, коробок, ступенек и других аналогичных предметов. Для разработчиков, куб - удобная замена итоговой модели, если она ещё не готова. Например, кузов автомобиля может быть грубо представлен в виде вытянутого до нужных габаритов куба. Хоть это и не приемлемо для готовой игры, но вполне подходит в качестве заготовки для тестирования кода управления автомобилем. Так как длины рёбер куба равны одной единице измерения, вы можете проверять пропорции импортированного в сцену меша просто поставив куб рядом, для сравнение размеров.

Сфера


Это сфера диаметром в одну единицу измерения (то есть, с радиусом в 0.5 единицы измерения), текстурированная так, чтобы всё изображение огибало сферу один раз, при этом верхняя и нижняя границы картинки будут находиться на полюсах сферы. Очевидно, сферы полезны для создания мячей, планет и снарядов, но полу-прозрачная сфера может также служить и удобным GUI инструментом для представления радиуса эффекта.

Капсула


Капсула - это цилиндр с полусферическими колпаками на концах. Объект имеет диаметр в одну единицу измерения и высоту в две единицы измерения (цилиндр высотой в одну единицу и оба колпака по половине единицы каждый). Капсула текстурирована таким образом, чтобы изображение огибало её ровно один раз, с закреплением в вершине каждой из полусфер. Хоть в реальном мире и не так много объектов с такой формой, капсулу удобно использовать для прототипирования. В частности, в некоторых задачах физика закруглённого объекта предпочтительнее, чем таковая у прямоугольного.

Цилиндр


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

Плоскость


Это плоский квадрат с длиной стороны в 10 единиц, ориентированный в плоскости XZ локального пространства координат. Он текстурирован так, чтобы всё изображение точно заполнило квадрат. Плоскость удобна для отображения картинок и видео в GUI, и для различных спецэффектов. Хоть плоскость и может использоваться для описанных выше вещей, более простой примитив квад чаще подходит для таких задач.


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

Читайте также: