Scenes
Scenes contain the environments and menus of your game. Think of each unique Scene file as a unique level. In each Scene, you place your environments, obstacles, and decorations, essentially designing and building your game in pieces.

When you create a new Unity project, your scene view displays a new Scene. This Scene is untitled and unsaved. The Scene is empty except for a Camera (called Main Camera) and a Light (called Directional Light).
To save the Scene you’re currently working on, choose File > Save Scene from the menu, or press Ctrl + S (Windows) or Cmd + S (masOS).
Unity saves Scenes as Assets in your project’s Assets folder. This means they appear in the Project window, with the rest of your Assets.

To open a Scene in Unity, double-click the Scene Asset in the Project window. You must open a Scene in Unity to work on it.
If your current Scene contains unsaved changes, Unity asks you whether you want to save or discard the changes.
Multi-Scene editing
It is possible to have multiple Scenes open for editing at one time. For more information about this, see documentation on Multi-Scene editing.
Scenes
Scenes contain the environments and menus of your game. Think of each unique Scene file as a unique level. In each Scene, you place your environments, obstacles, and decorations, essentially designing and building your game in pieces.

When you create a new Unity project, your scene view displays a new Scene. This Scene is untitled and unsaved. The Scene is empty except for a Camera (called Main Camera) and a Light (called Directional Light).
To save the Scene you’re currently working on, choose File > Save Scene from the menu, or press Ctrl + S (Windows) or Cmd + S (masOS).
Unity saves Scenes as Assets in your project’s Assets folder. This means they appear in the Project window, with the rest of your Assets.

To open a Scene in Unity, double-click the Scene Asset in the Project window. You must open a Scene in Unity to work on it.
If your current Scene contains unsaved changes, Unity asks you whether you want to save or discard the changes.
Multi-Scene editing
It is possible to have multiple Scenes open for editing at one time. For more information about this, see documentation on Multi-Scene editing.
Как мы переосмыслили работу со сценами в Unity
Unity, как движок, имеет ряд недостатков, но которые благодаря возможностям для кастомизации и инструментам для кодогенерации, можно решить.
Сейчас я вам расскажу о том, как мы написали плагин для Unity на основе пост-процессинга проектов и кодогенератора CodeDom.
Проблема
В Unity загрузка сцен происходит через строковой идентификатор. Он не стабильный, а это означает, что он легко изменяем без явных последствий. Например, при переименовании сцены всё полетит, а выяснится это только в самом конце на этапе выполнения.
Проблема обнаруживается быстро на часто используемых сценах, но может быть трудно обнаруживаемая, если речь идёт о небольших additive сценах или сценах, которые используются редко.
Решение
При добавлении сцены в проект, генерируется одноимённый класс с методом Load.
Если мы добавим сцену Menu, то в проекте сгенерируется класс Menu и в дальнейшем мы можем запустить сцену следующим образом:
По-хорошему, класс должен быть статическим, так как не предполагается создание экземпляра из него. Это ошибка, которую мы исправим. Как видно уже из этого фрагмента, кода мы цепляемся не к имени, а к GUID сцены, что является более надежным. Сам базовый класс выглядит вот так:
Теперь сцена может задекларировать список параметров, а вызывающий код должен передать для них аргументы.
Например, сцена Game хочет получить перечисление, содержащее всех игроков и при инициализации добавить для них аватаров.
В таком случае мы можем сами создать такой компонент.
После размещения его на сцене и последующим её сохранением, генератор добавит в класс сцены метода запуска сцены с обязательной передачей перечисления игроков.
В данный момент реализована возможность перегрузки обработчиков. Т.е. если на сцене будет N обработчиков с разными параметрами, под них создастся N методов запуска. Также не запрещается наличие нескольких компонентов-обработчиков с одинаковыми параметрами.
Это не фишка, а скорее недоработка, так как такой функционал быстрее создаст путаницу, нежели будет полезен.
А почему не сделать через N?
Первую версию плагина я осветил на своём YouTube канале в этом видео.
Там задали ряд вопросов и предложили альтернативные решения. Есть интересные подходы, которые имеют право на жизнь, а есть откровенно идиотские, которые я хочу разобрать.
Чем плох статический класс с полями, через которые передаются данные для сцены?
Нередко встречаю и такое. Речь идёт о классе по типу этого:
А уже внутри сцены, вероятно, будет группа компонентов, которая достаёт данные из свойств.
Основная проблема в том, что нет формализации: при загрузки сцены не совсем ясно, что нам нужно предоставить для корректной работы. Получателей в целом определить будет проще, так как мы можем воспользоваться поиском по ссылке.
Ну и опять же сцену придётся запускать по ID или имени.
Чем плох PlayerPerfs
Предлагали и такой экзотический вариант. Можно было бы начать с того, что PlayerPrefs вообще не предназначен для передачи значений внутри одного инстанса. Этим можно было бы и закончить, но продолжим критику тем, что вам также придётся работать с неформальными строковыми идентификаторами параметров.
Параллель с ASPNet
Мне хотелось получить что-то схожее с строго типизированными View из ASPNet Core. Мы считаем плохим тоном использовать ViewData и стараемся определять ViewModel. В Unity хочется что-то такого же толка с теми же преимуществами.
Но такой подход не очень распространён, к сожалению, и на это, я думаю, есть свои причины.
Где скачать
Плагин мы сделали в паре с Владиславом Койдо в рамках Proof-of-concept. Он ещё не стабилен и не обкатан как следует, но с ним уже можно поиграться.
Если вам интересно, я попрошу Владислава в следующей статье рассказать, как он работал с Code Dom в Unity и как работать с пост-процессингом на примере того, что мы сегодня обсуждали.
Создание сцен.
Содержание
Создание сцен
Сцены состоят из объектов Вашей игры. Они могут быть использованы для создания главного меню, отдельных уровней и всего остального. Каждый файл сцены можно рассматриавть как отдельный уровень. В каждой сцене Вы размещаете окружение,препятствия, декорации, т.е. проектируете Вашу игру из кусков.
Инстанцирование префабов.
В предыдущей статье было описано создание Префабов. Вы можете дополнительно почитать про префабы ТУТ. После того как Вы создали префаб вы можете быстро и легко сделать его копию, называемую Экземпляром (Instance). Для создания экземпляра префаба перетащите его из окна Проекта в Иерархию или Сцену. Теперь Вы имеете экземпляр Вашего префаба и можетет его позиционировать и настроить по желанию.
Добавление компонентов и скриптов.
Если добвление компонента разрывает связь объекта с префабом, Вы всегда можете использовать GameObject->Apply Changes to Prefab из меню для восстановления связи.
Размещение объектов.
После размещения объекта в сцене Вы можете использовать Инструмент Transform для позиционирования его. Добавочно Вы можете напрямую задавать значения в Инспекторе для точного размещенеия и поворота. Прочитайте страницу Компонент Transform для дополнительной информации о позиционировании и повороте объектов.
Работа с камерами.
Светильники.
Исключая достатояно специфические случаи, Вам всегда нужно добавить освещение к Вашей сцене. Есть три разных типа светильников с несколько отличающимся поведением. Важно что они добавляют атмосферу и окружение к Вашей игре. Различное освещение может полностью изменить настроение вашей игры, и следовательно важно изучить эффективное использование их. Для дополнительного чтения об освещении читайте страницу компонента Светильники.
Unity — Краткое руководство
Unity — это кроссплатформенный игровой движок, изначально выпущенный Unity Technologies в 2005 году. Основное внимание Unity уделяется разработке как 2D, так и 3D игр и интерактивного контента. Unity теперь поддерживает более 20 различных целевых платформ для развертывания, в то время как его наиболее популярными платформами являются системы ПК, Android и iOS.
Unity предоставляет полный набор инструментов для проектирования и создания игр, включая интерфейсы для графики, аудио и инструменты для создания уровней, требующие минимального использования внешних программ для работы над проектами.
В этой серии мы будем —
Давайте теперь начнем.
Unity — Установка и настройка
Для создания контента с помощью Unity основным требованием является загрузка движка Unity и среды разработки. Наряду с ядром ядра вы также можете загрузить дополнительные модули для развертывания на различных платформах, а также инструменты для интеграции сценариев Unity в Visual Studio.
Чтобы установить Unity, перейдите к этому. После этого нажмите —
Выберите свой Unity + Download.
Выберите свой Unity + Download.
На следующей странице прокрутите вниз и нажмите, чтобы подтвердить, что вы или ваша компания зарабатываете не более 100 000 долларов США годового дохода. Если вы это сделаете, вы не сможете попробовать Unity Free, хотя вы можете подписаться на бесплатную 30-дневную пробную версию Pro.
Как только установщик будет загружен, проходите по нему до тех пор, пока не появится меню выбора компонентов, которые вы хотите установить с Unity.
Здесь выберите компоненты, которые вам понадобятся. Для этой серии мы хотим установить компоненты, которые вы видите на изображении. Этот выбор включает в себя сам движок, документацию для движка, IDE; создавать инструменты для Android и набор ресурсов, которые вы можете добавить в свой проект позже.
Нажмите «Далее», следуйте инструкциям и опциям, и пусть Unity загружается и устанавливается на ваш компьютер.
Откройте Unity, и на следующем уроке мы создадим наш первый проект.
Создание вашего первого проекта
Unity одинаково подходит как для 2D, так и для 3D игр. Все игры, сделанные в Unity, начинаются как Проекты с загрузочного экрана.
Откройте вашу недавно установленную копию Unity; появится экран, как показано ниже —
Ваши существующие проекты будут отображаться в размытой области, как на изображении выше.
В правом верхнем углу окна вы увидите иконку New, как показано выше. После нажатия на значок вы увидите экран «Настройка проекта».
Здесь вы можете дать своему проекту имя, указать место, где он будет сохранен, установить тип проекта и добавить существующие ресурсы.
Нажмите « Создать проект» и позвольте Unity настроить основные файлы вашего проекта. Это может занять некоторое время в зависимости от скорости вашего компьютера, предварительно добавленных ресурсов и типа проекта.
Знание двигателя
Как только ваш новый проект создан и Unity открывается, появляется следующий экран —
Давайте посмотрим, что видно в этом окне. В настоящее время мы имеем дело с четырьмя основными регионами —
На следующем уроке мы обсудим рабочий процесс и работу игры в Unity.
Как работает Unity?
Вы можете увидеть этот видовой экран в виде серого прямоугольника, поместив указатель мыши внутри вида сцены и прокрутив вниз, чтобы уменьшить вид сцены. (Вы также можете сделать это, удерживая Alt и перетаскивая правой кнопкой мыши).
Дополнительные компоненты можно прикрепить к объекту, щелкнув Добавить компонент и выбрав нужный компонент. В наших последующих уроках мы также будем прикреплять сценарии к объектам GameObject, чтобы мы могли задавать им запрограммированное поведение.
Давайте теперь рассмотрим несколько примеров компонентов —
Renderer — отвечает за рендеринг и отображение объектов.
Коллайдер — определение физических границ столкновения для объектов.
Rigidbody — Дает объект физические свойства в реальном времени, такие как вес и гравитация.
Источник звука — предоставляет свойства объекта для воспроизведения и сохранения звука.
Аудио слушатель — компонент, который фактически «слышит» звук и выводит его на динамики проигрывателя. По умолчанию он существует в основной камере.
Аниматор — дает объекту доступ к системе анимации.
Свет — заставляет объект вести себя как источник света с различными эффектами.
Renderer — отвечает за рендеринг и отображение объектов.
Коллайдер — определение физических границ столкновения для объектов.
Rigidbody — Дает объект физические свойства в реальном времени, такие как вес и гравитация.
Источник звука — предоставляет свойства объекта для воспроизведения и сохранения звука.
Аудио слушатель — компонент, который фактически «слышит» звук и выводит его на динамики проигрывателя. По умолчанию он существует в основной камере.
Аниматор — дает объекту доступ к системе анимации.
Свет — заставляет объект вести себя как источник света с различными эффектами.
На этом графике мы можем видеть, как Unity компонует себя через GameObjects в сцены.
На следующем уроке мы создадим наш первый GameObject и погрузимся в сценарии.
Unity — создание спрайтов
Спрайты — это простые 2D-объекты, на которых есть графические изображения (так называемые текстуры ). Unity использует спрайты по умолчанию, когда движок находится в режиме 2D. При просмотре в трехмерном пространстве спрайты выглядят тонкими как бумага, потому что у них нет Z-ширины.
Спрайты всегда обращены к камере под перпендикулярным углом, если они не вращаются в трехмерном пространстве.
Давайте сначала создадим нашу текстуру. Получите стандартный файл изображения, такой как PNG или JPG, который вы хотите использовать, сохраните его, а затем перетащите изображение в область ресурсов Unity.
Давайте рассмотрим следующие моменты при создании спрайта —
Этот актив является изображением, поэтому он становится текстурой.
Перетаскивая эту текстуру в иерархию сцены, мы создаем новый GameObject с тем же именем, что и у нашей текстуры, с прикрепленным Sprite Renderer.
Этот рендерер спрайтов использует эту текстуру для рисования изображения в игре.
Этот актив является изображением, поэтому он становится текстурой.
Перетаскивая эту текстуру в иерархию сцены, мы создаем новый GameObject с тем же именем, что и у нашей текстуры, с прикрепленным Sprite Renderer.
Этот рендерер спрайтов использует эту текстуру для рисования изображения в игре.
Теперь мы создали спрайт в нашей сцене.
На следующем уроке мы рассмотрим некоторые модификаторы для спрайтов, которые у нас есть.
Unity — модифицирование спрайтов
Спрайт, который мы только что импортировали, также может быть изменен различными способами, чтобы изменить его внешний вид.
Если вы посмотрите в верхнем левом углу интерфейса двигателя, вы найдете панель инструментов, как показано ниже —
Давайте обсудим функции этих кнопок.
Инструмент « Рука» используется для перемещения по сцене, не затрагивая объекты.
Инструмент « Рука» используется для перемещения по сцене, не затрагивая объекты.
Инструмент масштабирования расположен вверх. Этот инструмент позволяет изменять размер (масштаб) объектов вдоль определенных осей.
Инструмент масштабирования расположен вверх. Этот инструмент позволяет изменять размер (масштаб) объектов вдоль определенных осей.
Эти инструменты оказываются достойными по мере увеличения сложности проекта.
Unity — трансформации и воспитание объектов
Свойства поворота определяют величину поворота (в градусах), в котором объект вращается вокруг этой оси относительно игрового мира или родительского объекта.
Масштаб объекта определяет, насколько он велик по сравнению с его исходным или собственным размером. Например, возьмем квадрат размером 2х2. Если этот квадрат масштабируется по оси X на 3, а по оси Y на 2, у нас будет квадрат размером 6×4.
Что такое Воспитание Объектов?
В Unity объекты следуют иерархической системе. Используя эту систему, GameObjects могут стать «родителями» других GameObjects.
Когда у GameObject есть родительский объект, он выполняет все свои изменения преобразования относительно другого GameObject вместо игрового мира.
Например, объект без родителей, размещенный в (10, 0 и 0), будет находиться на расстоянии 10 единиц от центра игрового мира.
Однако gameObject с родителем, размещенным в (10, 0, 0), будет считать текущую позицию родителя центром.
GameObjects можно родить, просто перетаскивая их на нужного родителя. «Дочерний» объект изображен в списке объектов с небольшим отступом и стрелкой рядом с родительским объектом.
Воспитание GameObjects имеет ряд применений. Например, все различные части танка могут быть отдельными GameObjects, объединенными в один GameObject с именем «tank». Таким образом, когда этот «танковый» родительский объект GameObject перемещается, все части перемещаются вместе с ним, потому что их положение постоянно обновляется в соответствии с их родителем.
В нашем следующем уроке мы обсудим внутренние активы. Мы также узнаем, как создавать и управлять активами в нашем проекте.
Единство — Внутренние активы
Помимо внешних ресурсов, которые вы импортируете из других программ, таких как аудиофайлы, изображения, 3D-модели и т. Д., Unity также предлагает создание внутренних активов. Эти активы, которые создаются внутри самого Unity, и, как таковые, не нуждаются ни в каких внешних программах для создания или изменения.
Несколько важных примеров внутренних активов, как показано ниже —
Сцены — Они действуют как «уровни».
Анимации — они содержат данные для анимации gameObject.
Материалы — определяют, как освещение влияет на внешний вид объекта.
Скрипты — код, который будет написан для игровых объектов.
Prefabs — они служат «чертежами» для объектов GameObject, поэтому их можно создавать во время выполнения.
Сцены — Они действуют как «уровни».
Анимации — они содержат данные для анимации gameObject.
Материалы — определяют, как освещение влияет на внешний вид объекта.
Скрипты — код, который будет написан для игровых объектов.
Prefabs — они служат «чертежами» для объектов GameObject, поэтому их можно создавать во время выполнения.
Несколько других важных активов — заполнитель, спрайты и модели. Они используются, когда вам нужны быстрые заполнители, так что они могут быть заменены правильной графикой и моделями позже.
По мере продвижения вперед, мы будем исследовать больше этих внутренних активов, поскольку они имеют решающее значение для построения правильной игры.
Unity — сохранение и загрузка сцен
В конце дня, когда вы закончили с большим количеством работы, вы хотите сохранить свой прогресс. В Unity нажатие Ctrl + S не сохранит ваш проект напрямую.
Давайте попробуем это. Если мы нажмем Ctrl + S и дадим имя нашей сцене, нам будет представлен новый актив в нашем регионе Активы. Это файл сцены.
Теперь давайте попробуем создать новую сцену. Для этого щелкните правой кнопкой мыши на Активы и выберите Создать → Сцена. Дайте вашей новой сцене имя и нажмите Enter.
В режиме редактора (когда игра не играет), сцены могут быть загружены в редактор, дважды щелкнув по ним. Загрузка сцены с несохраненными изменениями в текущую заставит вас сохранить или отменить изменения.
Ваш первый сценарий
Импортирование изображений и их сохранение в игре не поможет вам никуда. Возможно, из этого получится хорошая рамка для фотографий, но не игра.
Сценарии крайне необходимы для создания игр в Unity. Сценарии — это процесс написания блоков кода, которые прикрепляются как компоненты к объектам GameObject в сцене. Сценарии — один из самых мощных инструментов в вашем распоряжении, и он может сделать или сломать хорошую игру.
Сценарии в Unity выполняются либо в C #, либо в реализации JavaScript в Unity, известной как UnityScript (однако, с циклом 2018 года, UnityScript сейчас начинает фазу устаревания, поэтому рекомендуется его не использовать). Для целей этой серии мы будем использовать C #.
Когда вы создаете новый скрипт, должен появиться новый актив. Пока оставьте имя как есть и дважды щелкните по нему. Ваша стандартная IDE должна открыться вместе со скриптом. Давайте посмотрим, что это на самом деле.
Метод Update запускает каждый кадр игры после метода Start. Обычно игры в Unity работают со скоростью 60 FPS или кадров в секунду, что означает, что метод Update вызывается 60 раз в секунду, когда объект активен.
Сценарии Unity позволяют вам воспользоваться всеми преимуществами класса MonoBehaviour, а также основными функциями C #, такими как универсальные коллекции, лямбда-выражения и синтаксический анализ XML. На следующем уроке мы напишем наш первый код!
Unity — базовые скрипты движения
В этом уроке мы напишем код, который заставляет gameObject перемещаться вверх, вниз, влево и вправо в зависимости от ввода пользователя. Это должно помочь нам легче понять процесс написания сценариев Unity.
Давайте начнем с нашего сценария движения. Создайте новый сценарий и назовите его «Движение».
Теперь откройте сценарий, и вы увидите то же, что вы видели на последнем уроке.
Переменная отображается как редактируемое поле внутри редактора, поэтому вам не нужно вручную корректировать значения в коде.
Переменная отображается как редактируемое поле внутри редактора, поэтому вам не нужно вручную корректировать значения в коде.
Если мы сохраним этот скрипт, не затрагивая другие методы, он должен скомпилироваться в Unity.
(Вы можете увидеть, когда он компилируется 
Затем перетащите сценарий из активов в GameObject. Если вы делаете это правильно, это то, что вы должны увидеть в свойствах GameObject —
Поскольку значение скорости является регулируемым и не требует постоянного изменения кода, мы можем использовать метод update () вместо start ().
Давайте теперь рассмотрим цели для метода обновления —
Проверьте пользовательский ввод.
Если есть пользовательский ввод, прочитайте инструкции по вводу.
Измените значения положения преобразования объекта в зависимости от его скорости и направления. Для этого мы добавим следующий код —
Проверьте пользовательский ввод.
Если есть пользовательский ввод, прочитайте инструкции по вводу.
Измените значения положения преобразования объекта в зависимости от его скорости и направления. Для этого мы добавим следующий код —
Давайте теперь обсудим код в кратком изложении.
Класс Input отвечает за получение ввода от пользователя в виде нажатия клавиш, ввода мышью, ввода с контроллера и так далее. Метод GetAxisRaw немного сложнее для понимания, поэтому мы вернемся к этому позже.
Сохраните этот скрипт и возвращайтесь в Unity. Unity автоматически обновит все сценарии после успешной компиляции, поэтому вам не придется повторно подключать сценарий снова и снова.
Теперь, когда вы закончите, измените значение скорости в свойствах GameObject на 0,8. Это важно, потому что более высокое значение заставит игрока двигаться слишком быстро.
Теперь нажмите Play и увидите свою первую маленькую игру в действии!
Попробуйте нажать клавиши со стрелками и перемещаться. Чтобы остановить игру, просто нажмите Play еще раз. Вы даже можете регулировать скорость в режиме реального времени, чтобы вам не приходилось останавливаться и запускать ее постоянно.
На следующем уроке мы узнаем о твердых телах и столкновениях.
Единство — понимание столкновений
Столкновения в Unity отделены от самого Sprite, прикреплены как отдельные компоненты и рассчитываются самостоятельно. Давайте теперь узнаем причину этого.
Все в вашей игре — GameObject. Даже отдельные плитки, которые составляют ваш уровень, сами по себе являются объектами GameObject.
Когда мы рассматриваем каждый компонент как GameObject, мы понимаем, что в сцене могут быть тысячи GameObjects, которые каким-то образом взаимодействуют друг с другом. Вы можете себе представить, что если бы Unity добавляла коллизии к каждому GameObject, для движка было бы нецелесообразно рассчитывать коллизии для каждого из них.
Мы продолжим и добавим простую «стену», с которой может столкнуться наш персонаж. Для этого создайте еще один спрайт и увеличьте его, используя инструмент Rect. Мы также дадим ему красный цвет через свойство Color в компоненте Sprite Renderer.
Теперь перейдите к Add Component в Инспекторе и введите «Box Collider 2D». Нажмите на первый компонент, который появляется, и должен появиться новый компонент.
Повторите то же самое с нашим подвижным GameObject.
Конечно, коллизии в Unity не ограничиваются просто боксами. Они могут иметь различные формы и размеры и не обязательно являются точными копиями параметров объекта.
Они также могут принимать многоугольные формы.
Нередко разработчики и дизайнеры используют приблизительные формы на границах столкновений, чтобы упростить коллайдеры и избежать ненужных вычислений для двигателя. Скоро мы научимся создавать различные формы и размеры с помощью наших коллайдеров.
Теперь, когда у нас есть границы столкновений, нажмите play и посмотрите на них в действии.
Вы заметите, что наш подвижный объект не ведет себя нормально. Мы обсудим поведение объекта в нашей следующей главе.
Единство — твердые тела и физика
Вы можете прикрепить Rigidbody к своему GameObject, просто нажав Add Component и введя Rigidbody2D в поле поиска.
Нажав на Rigidbody2D, вы прикрепите компонент к вашему GameObject. Теперь, когда он прикреплен, вы заметите, что открылось много новых полей.
При настройках по умолчанию GameObject будет падать вертикально вниз под действием силы тяжести. Чтобы избежать этого, установите Gravity Scale на 0.
Теперь, игра в игру не будет показывать никакой видимой разницы, потому что GameObject пока не имеет ничего общего с его физическим компонентом.
Чтобы решить нашу проблему, давайте снова откроем наш код и перепишем его.
Мы можем видеть, что мы создаем ссылку на Rigidbody2D в объявлениях, и наш код обновления работает с этой ссылкой вместо преобразования объекта. Это означает, что Rigidbody получил ответственность за перемещение.
Вы можете ожидать, что ссылка на тело выдаст исключение NullReferenceException, поскольку мы ничего ему не присвоили. Если вы скомпилируете и запустите игру как есть, в левой нижней части редактора появится следующая ошибка
Чтобы это исправить, давайте рассмотрим компонент, созданный скриптом. Помните, что общедоступные свойства создают свои собственные поля в Unity, как мы это делали с переменной speed.
Установите более высокое значение скорости, около 5, и играйте в игру.
Ваши столкновения теперь будут работать правильно!
Unity — Пользовательские границы столкновений
В этой главе мы узнаем о пользовательских границах столкновений. Мы также узнаем, как настроить размер и форму наших коллайдеров.
Давайте начнем с нашего Box Collider. Box Collider (2D) имеет 4 регулируемые стороны и имеет форму прямоугольника. В компоненте коллайдера, нажмите на это поле —
На коллайдере вы увидите 4 «ручки». Вы можете перетащить эти ручки вокруг, чтобы отрегулировать их размеры.
Для простых форм Unity определяет наилучшую возможную посадку и для формы коллайдера, при условии, что вы выбрали правильный. Например, выбор кругового коллайдера на круговом спрайте будет соответствовать его радиусу.
Попробуйте нажать на кнопку «Изменить коллайдер» и поэкспериментируйте с настройкой коллайдеров.
Понимание Prefabs и Instantiation
Создание и уничтожение объектов считается очень важным во время игры. Создание просто означает возникновение. Предметы появляются или «появляются» в игре, враги умирают, элементы графического интерфейса исчезают и сцены постоянно загружаются в игре. Знание того, как правильно избавляться от ненужных предметов и как вводить те, которые вы делаете, становится еще более важным.
Давайте попробуем создать новый шестиугольник при каждом нажатии клавиши пробела.
Создайте новый скрипт под названием Instantiator и откройте его. В методе обновления введите код, указанный ниже.
Публичное объявление GameObject вверху создает слот, похожий на тот, который мы сделали для Rigidbody2D в наших предыдущих уроках. Однако этот слот принимает только префабы (во время редактирования ) и gameObjects (во время выполнения).
Назовите этот объект как-нибудь узнаваемым, например, объект Instatiator, и присоедините к нему наш новый скрипт. В слот, который отображается для GameObject, перетащите созданный нами сборный дом.
Если мы запустим игру сейчас, нажатие пробела создаст новый объект Hexagon, идентичный тому, который мы использовали для создания префаба. Вы можете видеть каждый шестиугольник, создаваемый в иерархии объектов. Причина, по которой вы не видите их в игре, заключается в том, что на данный момент все они создаются точно один над другим.
На нашем следующем уроке мы поймем концепцию разрушения объекта.
Unity — уничтожение GameObject
Уничтожение GameObjects так же важно, как и создание экземпляров. В этой главе мы узнаем, как уничтожать объекты GameObject.
К счастью, уничтожить GameObjects так же просто, как и создать их. Вам просто нужна ссылка на объект, который нужно уничтожить, и вызовите метод Destroy () с этой ссылкой в качестве параметра.
Теперь давайте попробуем создать 5 шестиугольников, которые будут разрушаться при нажатии назначенной клавиши.
Посмотрите, как мы использовали переменную с именем «gameObject» (small g, прописная буква O) в методе. Эта новая переменная gameObject (типа GameObject ) используется для ссылки на gameObject, к которому прикреплен этот скрипт. Если вы присоедините этот скрипт к нескольким объектам, они будут реагировать одинаково, когда эта переменная задействована.
Не запутайтесь между двумя, как бы то ни было.
GameObject с большой буквы G и O — это класс, который охватывает все объекты GameObject и предоставляет стандартные методы, такие как Instantiate, Destroy и методы для извлечения компонентов.
gameObject с маленьким g и заглавной буквой O — это конкретный экземпляр GameObject, используемый для ссылки на gameObject, к которому в данный момент прикреплен этот скрипт.
GameObject с большой буквы G и O — это класс, который охватывает все объекты GameObject и предоставляет стандартные методы, такие как Instantiate, Destroy и методы для извлечения компонентов.
gameObject с маленьким g и заглавной буквой O — это конкретный экземпляр GameObject, используемый для ссылки на gameObject, к которому в данный момент прикреплен этот скрипт.
Давайте теперь скомпилируем наш код и вернемся к Unity.
Нажмите на каждый из шестиугольников и посмотрите на их компоненты скрипта. Теперь вы можете установить отдельные клавиши так, чтобы GameObject разрушал себя при нажатии этой клавиши. Например, давайте создадим 5 шестиугольников и настроим их на уничтожение при нажатии клавиш A, S, D, F и G.
Важно понимать, что уничтожение GameObject не означает, что объект разрушится или взорвется. Уничтожение объекта просто (и немедленно) прекратит его существование в том, что касается игры (и ее кода). Ссылки на этот объект и его ссылки теперь не работают, и попытка получить доступ или использовать любой из них обычно приводит к ошибкам и сбоям.
Единство — сопрограммы
Сопрограммы являются наиболее полезными инструментами при создании игр в Unity. Давайте рассмотрим строку кода, показанную ниже, чтобы понять, что такое сопрограммы.
Как правило, если вы вызываете функцию в Unity (или, на самом деле, C #), функция запускается от начала до конца. Это то, что вы считаете «нормальным» поведением в том, что касается вашего кода. Однако иногда мы хотим намеренно замедлять функцию или заставлять ее ждать дольше, чем она длится доли секунды. Сопрограмма способна именно на это: сопрограмма — это функция, которая способна ожидать и синхронизировать свой процесс, а также полностью останавливать его.
Давайте рассмотрим пример, чтобы понять, как работает сопрограмма. Скажем, мы хотим сделать квадрат, который меняет свой цвет между красным и синим с интервалом в 1 секунду.
Помните, что средство визуализации отвечает за то, чтобы спрайт действительно отображался на экране. Рендерер имеет свойство color, которое влияет на глобальный цвет спрайта; это значение, которое должно быть изменено. Обнародование значений цветов позволит нам выбирать их через редактор в стандартной программе выбора цвета по умолчанию в вашей операционной системе.
Теперь мы перехватим нашу функцию сопрограммы в цикле while.
Давайте скомпилируем наш код и вернемся к Unity. Мы просто выберем наши чередующиеся цвета и нажмем на игру. Наш объект должен теперь переключаться между двумя цветами с интервалом в 3 секунды. Вы можете сделать интервал общедоступной переменной и настроить частоту изменения цвета.
Сопрограммы широко используются для временных методов, как тот, который мы только что сделали. Разнообразные методы WaitForX имеют свои собственные применения. Сопрограммы также используются для запуска «на стороне» процессов, которые запускаются самостоятельно, в то время как игра запускается одновременно. Это полезно, например, для загрузки закадровых частей большого уровня, когда проигрыватель начинает с одной точки.
Единство — Консоль
В консоли по умолчанию отображаются сообщения трех типов. Эти сообщения могут быть связаны с большинством стандартов компилятора —
ошибки
Ошибки — это проблемы или исключения, которые вообще не позволяют запускать код.
Предупреждения
Предупреждения — это проблемы, которые не остановят выполнение вашего кода, но могут вызвать проблемы во время выполнения.
Сообщения
Сообщения — это выходные данные, которые что-то передают пользователю; они обычно не выделяют проблемы.
Мы даже можем сделать так, чтобы Консоль выводила наши собственные сообщения, предупреждения и ошибки. Для этого мы будем использовать класс Debug. Класс Debug является частью MonoBehaviour, который дает нам методы для записи сообщений на консоль, очень похоже на то, как вы будете создавать обычные выходные сообщения в ваших начальных программах.
Вы можете найти Консоль на вкладке с надписью над областью Активы.
Вы можете начать с нового скрипта или изменить существующий.
Сохраняя, компилируя и выполняя этот код (конечно, присоединяя его к GameObject), попробуйте нажать пробел.
Примечание. Обратите внимание, что сообщение отображается внизу редактора.
Если вы нажмете на вкладку Консоль, вы найдете распечатанное сообщение.
Аналогично, вы также можете выводить предупреждения, используя метод LogWarning, а ошибки — методом LogErro r. Они окажутся полезными для тестирования небольших фрагментов кода без необходимости их реализации, как вы увидите позже.
Unity — Введение в Аудио
Есть причина, по которой игры делают акцент на аудио; это очень важно, чтобы добавить эстетическую ценность в игре. С самого первого понга можно услышать гудки и удары мяча, попеременно попадающих на весла. В то время это был действительно простой образец с короткими прямоугольными волнами, но что еще можно пожелать от дедушки всех видеоигр?
В реальной жизни многие вещи влияют на то, как вы воспринимаете звук; скорость объекта, тип сценария и направление его движения.
Существует ряд факторов, которые могут создать ненужную нагрузку на наш двигатель. Вместо этого мы пытаемся создать представление о том, как будет звучать наш звук в нашей игре, и строить вокруг этого. Это становится особенно заметным в 3D играх, где есть 3 оси, с которыми нужно иметь дело.
В Unity у нас есть специальные компоненты для восприятия и воспроизведения звука. Эти компоненты работают вместе, чтобы создать правдоподобную звуковую систему, которая кажется естественной для игры.
Unity предоставляет нам множество полезных инструментов и эффектов, таких как реверберация, эффект Доплера, микширование и эффекты в реальном времени и т. Д. Мы узнаем об этом в наших последующих главах.
Аудио Компоненты
В этом разделе мы узнаем о 3 основных компонентах, связанных со звуком в Unity.
AudioSource
Компонент AudioSource является основным компонентом, который вы присоединяете к GameObject, чтобы он воспроизводил звук. Он будет воспроизводить аудиоклип при запуске через микшер, через код или по умолчанию при пробуждении.
AudioListener
AudioListener — это компонент, который слушает все аудио, воспроизводимое в сцене, и передает его на динамики компьютера. Это действует как уши игры. Все аудио, которые вы слышите, находится в перспективе расположения этого AudioListener. Только один AudioListener должен быть в сцене, чтобы он функционировал должным образом. По умолчанию к основной камере подключен слушатель. Слушатель не имеет открытых свойств, о которых дизайнер хотел бы позаботиться.
Аудио Фильтры
Выход AudioSource или прием AudioListener могут быть изменены с помощью Audio Filters. Это конкретные компоненты, которые могут изменять реверберацию, хорус, фильтрацию и т. Д. Каждый конкретный фильтр представляет собой свой собственный компонент с доступными значениями для настройки его звучания.
Воспроизведение звука
Давайте попробуем сделать кнопку, которая воспроизводит звук при нажатии. Для начала мы создадим спрайт Circle и сделаем его красным.
Теперь давайте подключим аудиоисточник к этому спрайту.
Чтобы объект воспроизводил звук, мы должны дать ему один. Давайте использовать этот звуковой эффект для наших целей.
Загрузите звуковой эффект и перетащите его в Активы.
После того, как вы перетащите аудиоклип из Активов непосредственно в слот Аудиоклипа в Аудиоисточнике нашего спрайта, не забудьте отменить выбор «Воспроизвести при пробуждении» в свойствах Аудиоисточника; если вы этого не сделаете, звук начнет звучать в момент начала игры.
Теперь давайте перейдем к нашему коду. Создайте новый скрипт под названием «BellSound» и откройте его.
Поскольку наш аудиоисточник управляется с помощью кода, мы сначала хотим получить ссылку на него. Мы будем использовать метод GetComponent, как и раньше.
Теперь давайте настроим метод обнаружения объекта, по которому щелкают. MonoBehaviour дает нам именно тот метод, который нам нужен, с именем OnMouseDown. Метод вызывается всякий раз, когда мышь щелкает в диапазоне коллайдера этого gameObject.
Поскольку мы еще не прикрепили коллайдер к нашей кнопке, давайте сделаем это сейчас.
Нам не понадобится Rigidbody для этого; нам также не нужен доступ к этому коллайдеру по коду. Это просто должно быть там, чтобы метод работал.
Давайте проверим метод и посмотрим, работает ли он. Напишите следующий код в своем скрипте и прикрепите его к кнопке.
Как только вы сохраните сценарий и приложите его, играйте в игру. При нажатии на кнопку должно появиться сообщение в консоли.
Вы сейчас в одном шаге от воспроизведения звука. Все, что вам нужно сделать сейчас, это вызвать метод Play в экземпляре Audio Source.
Сохраните ваш скрипт и запустите его в игре. Нажмите на кнопку, и вы должны услышать звук!
Примечание. Подумайте о создании кнопки, которая увеличивается по высоте при каждом нажатии на нее. Используйте mySource.pitch и счетчик и посмотрите, сможете ли вы это выяснить.)
Unity — начиная с пользовательского интерфейса
В этом разделе мы узнаем о процессе проектирования для пользовательского интерфейса или элементов пользовательского интерфейса в Unity. Это включает в себя базовую настройку, а также обзор общих элементов, которые поставляются с Unity.
Рабочий процесс для разработки пользовательского интерфейса в Unity следует немного по другому пути, чем тот, который мы проходили до сих пор. Для начала, элементы пользовательского интерфейса не являются стандартными объектами GameObject и не могут использоваться как таковые. Элементы пользовательского интерфейса разработаны по-разному; кнопка меню, которая выглядит правильно в разрешении 4: 3, может выглядеть растянутой или искаженной в разрешении 16: 9, если не настроена правильно.
Давайте теперь посмотрим на Canvas GameObject, чтобы узнать о дополнительных новых компонентах —
Похоже, что Rect Transform в верхней части имеет много новых свойств, которых нет в стандартном Transform GameObject.
По умолчанию вы не сможете изменить форму области холста, и это будет сравнительно гигантский прямоугольник вокруг вашей сцены.
У нас есть три варианта в раскрывающемся списке. Давайте узнаем об опциях в наших последующих разделах.
Пространство экрана — Наложение
Этот режим является наиболее стандартным для меню, HUD и так далее. Он отображает пользовательский интерфейс поверх всего остального в сцене, в точности как он устроен и без исключения. Он также хорошо масштабирует пользовательский интерфейс при изменении размера экрана или игрового окна. Это режим рендеринга по умолчанию на холсте.
Пространство экрана — камера
Пространство экрана — камера создает воображаемую проекционную плоскость, установленное расстояние от камеры и проецирует на нее весь пользовательский интерфейс Это означает, что появление пользовательского интерфейса в сцене сильно зависит от настроек, используемых камерой; это включает в себя перспективу, поле зрения и так далее.
Мир Космоса
В режиме World Space элементы пользовательского интерфейса ведут себя так, как если бы они были обычными объектами GameObject, помещенными в мир. Однако они похожи на спрайты, поэтому они обычно используются как часть игрового мира, а не для игрока, как игровые мониторы и дисплеи. По этой причине вы можете напрямую изменять значения Canvas RectTransform в этом режиме.
Graphics Raycaster имеет дело главным образом с raycasting (ссылка на документацию Unity для Raycasting), элементами пользовательского интерфейса и обеспечивает правильную работу инициируемых пользователем событий, таких как щелчки и перетаскивания.
Единство — Кнопка
В этой главе мы научимся вставлять элементы пользовательского интерфейса в нашу сцену и работать с ними.
Если вы играете сцену, вы заметите, что кнопка уже имеет некоторые стандартные функции, такие как обнаружение, когда мышь наведена на нее, и изменение цвета при нажатии.
Кнопка требует функциональности, чтобы быть действительно полезной в пользовательском интерфейсе. Эта функциональность может быть добавлена через его свойства.
Мы сделали простой метод, который регистрирует, сколько раз мы нажали кнопку.
Примечание. Этот метод должен быть общедоступным; иначе это не будет замечено функциональностью кнопки.
Давайте создадим пустой GameObject и прикрепим к нему этот скрипт. Мы делаем это, потому что кнопка не будет ничего делать сама по себе; он вызывает только указанный метод в своем сценарии.
Нажмите значок + на нижней вкладке, и новая запись должна появиться в списке.
Эта запись определяет, на какой объект действует нажатие кнопки и какая функция скрипта этого объекта вызывается. Из-за системы событий, используемой при нажатии кнопки, вы можете запускать несколько функций, просто добавляя их в список.
Если вы играете в игру сейчас, вы можете проверить кнопку и, конечно же, консоль распечатает, сколько раз вы нажали кнопку.
Unity — элемент текста
Встроенный текстовый пользовательский интерфейс Unity — отличная отправная точка для учащихся при разработке пользовательского интерфейса, даже если он находится в тени более мощных и эффективных ресурсов сообщества.
Для нашей цели ванильный элемент Text более чем достаточен для начала.
Новый текстовый элемент должен появиться в вашем регионе Canvas. Если мы посмотрим на его свойства, мы увидим несколько очень полезных опций.
Чтобы изменить шрифт текста, вы должны сначала импортировать файл шрифта со своего компьютера в Unity в качестве актива. Шрифт не нужно активно прикреплять к чему-либо в сцене, и на него можно напрямую ссылаться из Активов.
Доступ к элементу Text также возможен через скрипты; это то, где важность динамического пользовательского интерфейса вступает в силу.
Вместо консоли выводит, сколько раз была нажата кнопка, как в предыдущей главе; давайте распечатаем это на экране игры. Для этого мы откроем наш скрипт ButtonBehaviour из предыдущего урока и внесем в него некоторые изменения.
Затем мы создаем общедоступную переменную Text, куда мы можем перетащить наш элемент Text UI.
Если мы сохраним наш скрипт, мы теперь увидим новый слот для элемента Text UI в нашем ButtonManager. Просто перетащите элемент gameObject, содержащий этот элемент Text, в слот и нажмите кнопку Play.
Единство — Слайдер
В этой главе мы узнаем о последнем элементе пользовательского интерфейса в этой серии. Ползунок обычно используется, когда определенное значение должно быть установлено между парой максимального и минимального значений. Одним из наиболее распространенных способов использования этого является громкость звука или яркость экрана.
Чтобы создать слайдер, выберите «Создать» → «Интерфейс» → «Слайдер». Новый элемент Slider должен появиться на вашей сцене.
Если вы перейдете к свойствам этого ползунка, вы увидите множество опций для его настройки.
Давайте попробуем сделать слайдер громкости из этого слайдера. Для этого откройте скрипт ButtonBehaviour (вы можете переименовать ButtonManager GameObject, поскольку он, безусловно, делает больше, чем просто управление кнопкой сейчас) и добавить ссылку на Slider. Мы также немного изменим код.
Узнайте, как мы используем метод Update, чтобы постоянно обновлять значение myText.text.
В свойствах слайдера давайте отметим поле «Целые числа» и установим максимальное значение равным 100.
Мы установим цвет текста через его свойства для более видимого цвета.
Проделаем ту же процедуру перетаскивания игрового объекта Slider на новый слот и нажмем кнопку play.
Настоятельно рекомендуется изучить и поэкспериментировать с другими элементами управления пользовательского интерфейса, чтобы увидеть, какие из них работают и каким образом.
В нашем следующем разделе мы узнаем об освещении, материалах и шейдерах.
Unity — материалы и шейдеры
Теперь нажмите на куб и посмотрите на его свойства.
Похоже, что у самого нижнего свойства есть материал по умолчанию и стандартный шейдер.
Что такое материал?
В Unity (и во многих аспектах трехмерного моделирования) Материал — это файл, который содержит информацию об освещении объекта этим материалом. Обратите внимание, как серая сфера обозначает материал, с небольшим количеством света, поступающего сверху.
Теперь не путайте с именем; Материал не имеет ничего общего с массой, столкновениями или даже физикой в целом. Материал используется для определения того, как освещение влияет на объект с этим материалом.
Давайте попробуем создать наш собственный материал. Щелкните правой кнопкой мыши в области «Активы», перейдите в « Создать» → «Материал» и дайте ему имя, например «Мой материал».
Материалы — это то, что делает ваши объекты видимыми в первую очередь. На самом деле, даже в 2D мы используем специальный материал, который также не требует освещения. Конечно, Unity генерирует и применяет это ко всему для нас, поэтому мы даже не замечаем, что это там.
Что такое шейдер?
Шейдер — это программа, которая определяет, как каждый пиксель отображается на экране. Шейдеры вообще не программируются на C # или даже на языке OOPS. Они запрограммированы на C-подобном языке, называемом GLSL, который может давать прямые инструкции GPU для быстрой обработки.
Единство — система частиц
Системы частиц помогают эффективно генерировать большое количество частиц с небольшой продолжительностью жизни. Эти системы проходят отдельный процесс рендеринга; они могут создавать частицы даже тогда, когда существуют сотни или тысячи объектов.
Теперь, частицы — это неоднозначный термин в системе частиц; Частица — это любая отдельная текстура, экземпляр материала или объект, который генерируется системой частиц. Это не обязательно точки, плавающие в пространстве (хотя они могут быть!), И их можно использовать для множества различных сценариев.
GameObject управляет системой частиц с прикрепленным компонентом системы частиц; Системы частиц не требуют никаких Активов для настройки, хотя они могут требовать разных материалов в зависимости от желаемого эффекта.
Справа от некоторых значений вы можете заметить маленькую черную стрелку. Это позволяет получить больший контроль над значениями каждой отдельной частицы. Например, вы можете установить для параметра « Начальный размер» значение « Случайный между двумя константами», чтобы система частиц отображала случайные частицы разных размеров, например, водяной шланг.
Unity — Использование Asset Store
Магазин активов — одна из самых сильных сторон Unity на рынке игровых движков; он включает в себя большое количество ресурсов, инструментов, сценариев и даже целых готовых проектов, которые вы можете загрузить.
После входа в систему вы сможете увидеть свое имя пользователя в правом верхнем углу.
Мы нажмем «Загрузить» и дадим его завершить. По завершении кнопка « Загрузить» изменится на « Импорт» ; нажмите на него еще раз, чтобы импортировать новый актив в текущий открытый проект.
(Примечание: в данном конкретном случае мы импортируем полный проект; если Unity предупредит вас об этом, создайте новый проект или перезапишите существующий, если хотите. В любом случае это нормально.)
Попытка загрузить ресурсы без их оплаты является незаконной и всегда может содержать вирусы, ошибки или отсутствие обновлений.






























































































