Пишем арканоид на Unity. Поведение блоков, префабы и дизайн уровней


Оглавление (нажмите, чтобы открыть):

2D игра на Unity. Подробное руководство. Часть 1

Настройка среды в Unity

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

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

Для редактирования кода в Unity (4.0.1 и выше) служит редактор MonoDevelop. Если вы работаете в Windows, вы можете (и я вам советую) использовать альтернативый редактор Visual Studio 2013 Desktop (C#) для Windows, после чего в настройках Unity измените редактор по умолчанию на Visual Studio.

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

Mac OS X

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

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

Unity позволяет кодировать на трех языках: JavaScript, C# и Boo. Рекомендую использовать C# — он более мощный и проще.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Префабы

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

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

Сцены

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

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

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

Звуки

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

Scripts

Весь код находится здесь. Мы используем эту папку в качестве эквивалента корневой папке в C# проекте.

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 . Вот, что у нас получилось:

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

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

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

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

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

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

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


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

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

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

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

Мой спрайт не появляется в диалоговом окне! Убедитесь, что вы находитесь в вкдадке Assets диалогового окна «Select Sprite» (Выбрать спрайт). Если вы видите диалоговое окно пустым, — не пугайтечсь. Дело в том, что для некоторых установок Unity, даже со свежим новым 2D проектом изображения импортируются как «Текстура», а не «Спрайт». Чтобы это исправить, необходимо выбрать изображение на панели «Проект», и в «Инспекторе», изменить свойство «Текстура Type» имущество «Sprite»:

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

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

Tip: Вы можете создать копию объекта с помощью клавиш cmd + D в OS X или ctrl + D Windows .

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

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

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

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

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

Настройка 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 — передний фон

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

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

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

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

Создание экземпляров префабов во время работы приложения

К данному моменту вы уже должны понимать основы концепта префабов ( Prefabs ). Префабы — это набор заранее установленных игровых объектов GameObjects и компонентов Components , которые используются более одного раза за всю игру. Если вы не знаете, что такое префаб, то мы рекомендуем вам для начала ознакомиться со страницей Prefabs, для базового объяснения префабов.

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

  • Вы можете создать экземпляр префаба с полным функционалом при помощи одной строчки кода. Создание эквивалентного GameObject из кода в среднем занимает 5 строк кода, а обычно всё же больше.
  • Вы можете легко и быстро настраивать, тестировать и модифицировать префабы в сцене и инспекторе.
  • Вы можете изменять префаб, экземпляр которого будет создан, без изменения кода, отвечающего за призыв. Простая ракета может быть превращена в супер-заряженную ракету без изменения кода.

Общие сценарии

Чтобы показать мощь префабов, давайте рассмотрим некоторые основные ситуации, где они могут пригодиться:

  1. Построение стены из одного префаба “кирпича” путём создания его несколько раз в разных позициях.
  2. Ракетная установка создаёт экземпляр префаба ракеты, когда пользователь жмёт кнопку атаки. Префаб содержит меш, Rigidbody, коллайдер и дочерний GameObject, который содержит систему частиц для следа.
  3. Робот разлетается на несколько кусков. Полный, функциональный робот уничтожается и заменяется префабом сломанного робота. Этот префаб будет состоять из робота, разделённого на много частей, содержащих Rigidbody и системы частиц. Эта техника позволяет вам взорвать робота на мелкие кусочки просто одной строкой кода, заменяющей один объект на префаб.

Построение стены

Это объяснение иллюстрирует преимущества использования префабов над созданием объектов из кода.

В первую очередь, давайте построим стену из кода:

  • Чтобы использовать скрипт выше, мы просто сохраняем скрипт и перетягиваем его на пустой GameObject.
  • Создайте пустой GameObject при помощи GameObject->Create Empty .

Если вы исполните этот код, вы увидите целую кирпичную стену, создаваемую при входе в режим Play Mode . На отдельный кирпич приходится по 2 строки, отвечающие за функциональность: строки CreatePrimitive() и AddComponent() . Пока что не так и плохо, но все кирпичи не имеют текстур. Каждое дополнительное действие, которое мы хотим сделать с кирпичом, вроде изменения текстуры, трения или массы Rigidbody, требует дополнительную строку.

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

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

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

Теперь нам остаётся лишь создать префаб, который мы делаем в редакторе. Вот так:

  1. Выбрать GameObject->Create Other->Cube
  2. Выбрать Component->Physics->Rigidbody
  3. Выбрать Assets->Create->Prefab
  4. В окне Project View измените имя вашего нового префаба на “Brick”
  5. Перетащите созданный куб в иерархию поверх префаба “Brick” в окно Project View
  6. Теперь, когда префаб создан, вы можете безопасно удалить куб из иерархии ( Delete в Windows, Command-Backspace на Mac)

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

Теперь перетащите префаб “Brick” из окна Project View на переменную brick в инспекторе. Нажмите Play и вы увидите стену построенную из префабов.


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

Но т.к. вы сейчас используете префаб, вы можете настроить Prefab за секунды. Хотите внести изменения для всей кучи образцов? Настройте Rig >Material для всех образцов? Перетащите материал на префаб всего один раз. Хотите изменить трение? Используйте другой физический материал ( Physic Material ) в коллайдере префаба. Хотите добавить системы частиц ко всем кирпичам? Добавьте дочернюю систему к префабу всего один раз.

Создание экземпляров ракет и взрывов

Вот как префабы подходят для данного сценария:

  1. Ракетная установка создаёт экземпляр префаба ракеты, когда пользователь жмёт кнопку атаки. Префаб содержит меш, Rigidbody, коллайдер и дочерний GameObject, который содержит систему частиц для следа.
  2. Ракета врезается и создаёт экземпляр префаба взрыва. Префаб взрыва содержит систему частиц, источник освещения, который угасает со временем, и скрипт, который применяет урон окружающим объектам.

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

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

Этот скрипт покажет, как запустить ракету используя функцию Instantiate() .

Замена персонажа на Ragdoll или обломки

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

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

Любой из этих вариантов может быть достигнут разовым вызовом Instantiate() . Вам надо просто привязать к нему правильный префаб и всё готово!

Важно помнить, что обломки, которые вы Instantiate() (создаёте их экземпляр), могут быть сделаны из совершенно отличных от оригинала объектов. Например, если у вас есть самолёт, вы можете смоделировать 2 версии. Одна из которых — самолёт, состоящий из одного GameObject с Mesh Renderer и скриптами физики самолёта. Если эта модель будет единым объектом, то игра будет работать быстрее, т.к. вы сможете сделать модель с меньшим количеством треугольников, а ввиду того, что в результате будет меньше объектов, то и рендер будет проходить быстрее. Также, пока ваш самолёт радостно летает вокруг, нет надобности разделять его на части.

Это стандартные шаги, если надо собрать префаб сломанного самолёта:

  1. Смоделируйте ваш самолёт с различными деталями в вашем любимом приложении для моделирования
  2. Создайте пустую сцену
  3. Перетащите модель в пустую сцену
  4. Добавьте Rig >Component->Physics->Rigidbody
  5. Добавьте коллайдеры Box Coll >Component->Physics->Box Collider
  6. Для дополнительного спец-эффекта, добавьте системы похожих на дым частиц в виде дочерних объектов для каждой части.
  7. Теперь у вас есть самолёт с множеством раздельных деталей. Они будут падать на землю по законам физики и будут создавать след из частиц, в силу того, что к ним присоединены системы частиц. Нажмите Play для предварительного просмотра того, как ваша модель будет себя вести и проведите все необходимые поправки.
  8. Выберите Assets->Create Prefab
  9. Перетяните на префаб корневой GameObject, содержащий все части самолёта.

Следующий пример покажет, как эти шаги моделируются в коде.

Размещение группы объектов по заданному шаблону

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

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

Так используйте вместо этого Instantiate() с префабом! Мы думаем, что вы уже поняли нашу идею, почему префабы так удобны в этих случаях. Вот необходимый для этих сценариев код:

Unity 2d движение к цели. Пишем арканоид на Unity

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

Вот список всех статей:

Где мы остановились?

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

Превью результата

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

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

Сценарии представляют собой фрагменты программного кода, которые ответственны за какую-то конкретную задачу. Unity может работать со скриптами, написанными на трех языках программирования: Boo, JavaScript и C#. Мы будем использовать последний, но вы можете попробовать свои силы и с другими языками.

Итак, для создания скрипта перейдем на вкладку Project , найдем там одноименную папку Scripts и кликнем на нее правой кнопкой мыши. Выберем Create -> C# Script . Появится новый файл с названием NewBehaviourScript . Переименуйте его в PlayerScript для удобства. На вкладке Inspector вы можете видеть содержимое скрипта.

Двойным кликом откройте скрипт. Запуститься среда разработки MonoDevelop, которую вы впоследствии можете изменить на любой удобный для вас редактор. Вот то, что вы увидите:

Using UnityEngine; using System.Collections; public class NewBehaviourScript: MonoBehaviour < // используйте этот метод для инициализации void Start () < >// Update вызывается при отрисовке каждого кадра игры void Update () < >>

Все сценарии на Unity имеют по умолчанию два метода:

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

Для того, чтобы сдвинуть платформу, нам потребуется два вида информации: позиция и скорость.

Таким образом, необходимо создать две переменные для сохранения этой информации:

public float playerVelocity;
private Vector3 playerPosition;

Обратите внимание, что одна переменная объявлена публично, а вторая — приватно. Для чего это делается? Дело в том, что Unity позволяет редактировать значения публичных переменных не переходя в редактор MonoDevelop, без необходимости изменения кода. Эта возможность очень полезна в тех случаях. когда необходимо «на лету» корректировать какое-то значение. Скорость платформы — одно из таких значений, и именно поэтому мы объявили его публично.

Сохраните сценарий в редакторе MonoDevelop и перейдите в редактор Unity. Теперь у нас есть сценарий и нам нужно присвоить его какому то объекту, в нашем случае — платформе. Выберите нашу платформу во вкладке Hierarchy и в окне Inspector добавьте компонент, кликнув на кнопку Add Component .

Добавление нашего скрипта в компонент можно сделать и по-другому. Перетащите наш сценарий в область кнопки Add Component . Во вкладке Inspector вы должны увидеть что-то подобное:

Обратите внимание, что в компоненте скрипта появилось поле Player Velocity , которое можно тут же изменить. Это получилось возможным благодаря публичному объявлению переменной. Установите параметр в значение 0.3 и перейдите в редактор MonoDevelop.

Теперь нам надо узнать позицию платформы: playerPosition . Для того, чтобы инициализировать переменную, следует обратиться к объекту сценария в методе Start() :

// используйте этот метод для инициализации vo >

Отлично, мы определили начальную позицию платформы, и теперь можно ее двигать. Так как нам надо, чтобы платформа перемещалась только по оси X, то мы сможем использовать метод GetAxis класса Input . Этой функции мы передадим строку Horizontal , и она вернет нам 1, если была нажата клавиша «вправо», и -1 — «влево». Умножив полученное число на скорость и прибавив эту величину к текущей позиции игрока, мы и получим движение.

Также добавим проверку на выход из приложения по нажатию на клавишу Esc .

Вот то, что у нас должно получиться в итоге:

Using UnityEngine; using System.Collections; public ) * playerVelocity; // выход из игры if (Input.GetKeyDown(KeyCode.Escape)) < Application.Quit(); >// обновим позицию платформы transform.position = playerPosition; > >

Сохраните скрипт и вернитесь в редактор Unity. Нажмите кнопку Play и попробуйте передвинуть платформу при помощи кнопок «влево» и «вправо».

Определение игровой области

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

Давайте добавим в наш существующий скрипт еще одну публичную переменную и назовем его boundary .

Эта переменная будет хранить максимальную координату платформы по оси X. Так как мы собираемся строить уровни в симметричной форме вокруг точки с координатами (0, 0, 0), то абсолютное значение переменной boundary будет одинаковым и для положительной части оси X, и для отрицательной.

А теперь добавим пару условий. Поступим достаточно просто: если вычисленная нами позиция будет больше boundary или меньше -boundary , то мы просто зададим новую позицию по оси X, равную значению переменной boundary . Таким образом, мы гарантируем, что платформа не уедет за пределы наших границ и никогда не покинет игровую зону. Вот код:

Using UnityEngine; using System.Collections; public ) * playerVelocity; // выход из игры if (Input.GetKeyDown(KeyCode.Escape)) < Application.Quit(); >// обновим позицию платформы transform.position = playerPosition; // проверка выхода за границы if (playerPosition.x boundary) < transform.position = new Vector3(boundary, playerPosition.y, playerPosition.z); >> >

Теперь вернитесь в редактор и, переключаясь в игру, найдите оптимальное значение переменной boundary . В нашем случае подошло число 5.46. Откройте Inspector и сбросьте позицию платформы по оси X на 0, а параметр Boundary выставьте согласно найденному вами значению.

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

Включение физики

Чтобы столкновения были более реалистичные — воспользуемся симуляцией физики. В этой статье мы добавим физические свойства мячику, платформе и границам поля. Так как мы пишем 2D игру, то будем использовать 2D коллайдеры. Коллайдер — это отдельный тип компонентов, который позволяет объекту реагировать на коллайдеры других объектов.

В окне Hierarchy выберем нашу платформу, перейдем в Inspector и нажмем на кнопку Add Component . В появившемся окошке наберем collider . Как вы можете увидеть — вариантов достаточно много. Каждый коллайдер имеет специфические свойства, соответствующие связанным объектам — прямоугольникам, кругам и т.д.


Так как наша платформа имеет прямоугольную форму, мы будем использовать Box Collider 2D . Выберите именно его, и компонент автоматически определит размеры платформы: вам не нужно будет задавать их вручную, Unity сделает это за вас.

Сделайте то же самое и для 3 границ (Hierarchy -> Inspector -> Add Component -> Box Collider 2D ).

С мячиком чуть-чуть по другому: он имеет круглую форму. Выберем мяч и добавим для нее компонент Circle Collider 2D .

На самом деле коллайдер окружности и прямоугольника очень похожи, за исключением того, что вместо параметра Size , определяющим ширину и длину, в окружности используется Radius . Объяснения здесь, думаем, излишни.

Упругое столкновение

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

Откройте окно Project и внутри папки Asset создайте новую папку под названием Physics . Кликните по только что созданной папке правой кнопкой мыши и выберите Create -> Physics2D Material . Задайте название BallPhysicsMaterial .

Каждая поверхность в Unity имеет два параметра: трение (friction) и упругость (bounciness) . Более подробно вы можете прочитать про физический движок и ряд физических параметров . Если вам требуется абсолютно упругое тело, то следует выставить трение на 0, а упругость на 1.

Сейчас у нас есть готовый материал, но он пока никак не связан с мячом. Выберите объект мяча во вкладке Hierarchy и в окне Inspector вы увидите поле Material компонента Circle Collider 2D . Перетащите сюда недавно созданный материал.

Добавление компонента Rigid Body

Для того, чтобы наш мячик двигался под контролем физики, мы должны добавить ему еще один компонент: Rigid Body 2D . Выберите объект мяча в окне Hierarchy и добавьте вышеупомянутый компонент — хоть он и имеет несколько параметров, нас интересует только один: Gravity Scale . Так как наш шарик будет двигаться только за счет отскоков, то мы зададим этому параметру 0 — таким образом мы гарантируем, что гравитация не будет реагировать на объект. Все остальное можно не менять.

Поведения шарика

Давайте создадим для шарика отдельный скрипт (снова воспользуемся C# в качестве языка программирования) и назовем его BallScript . Свяжите созданный скрипт с объект (Hierarchy -> Inspector -> Add Component ).

Перед тем, как начать писать скрипт, давайте определим поведение шарика:

  1. Шар имеет два состояния: неактивное (когда он в начале игры находится на платформе) и активное (когда находится в движении).
  2. Шар будет становиться активным только один раз.
  3. Когда шар становится активным, мы применяем к нему силу для того, что он начал движение.
  4. Если шар вышел за пределы игрового поля, он переводится в неактивное состояние и помещается на платформу.

Основываясь на этой информации, давайте создадим глобальные переменные ballIsActive , ballPosition и ballInitialForce:

private bool ballIsActive;
private Vector3 ballPosition;
private Vector2 ballInitialForce;

Теперь, когда у нас есть набор переменных, мы должны подготовить объект. В методе Start() мы должны:

  • создать силу, которая будет применена к шару;
  • перевести шар в неактивное состояние;
  • запомнить позицию шара.

Вот, как это можно сделать:

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

Следующим шагом является проверка состояния шара, поскольку задать силу нам надо только в том случае, если шар находится в неактивном состоянии:

Если предположить, что мы находимся в начале игры, то мы должны применить силу к шару и установить его в активное состояние:

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

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

Решение достаточно простое, но как нам получить координату совсем другого объекта? Элементарно — мы создадим переменную типа GameObject и сохраним ссылку на объект платформы:

public GameObject playerObject;

Вернемся к методу Update() :

Сохраните скрипт и вернитесь в редактор Unity. Вы наверняка заметили, что переменная playerObject объявлена, используется, но нигде не инициализирована. Да, так и есть. Чтобы ее проинициализировать, перейдите во вкладку Hierarchy , найдите шар и в окне Inspector найдите компонент Ball Script . У данного компонента есть параметр Player Object , в настоящее время пустующий:

Найдите во вкладке Hierarchy нашу платформу и перетащите ее на поле Player Object . Запустите игру, нажав кнопку Play , и убедитесь, что все работает.

Сброс игры

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

Это состояние отловить очень просто: шар будет активен, а его положение по оси Y отрицательно. Если это так, то мы переводим шар в неактивное состояние и ставим его на платформу:

If (ballIsActive && transform.position.y

А вот теперь точно все. Запустите игру и проверьте, все ли работает как положено.

В следующей части

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

В второй главе о разработке игры на Unity мы добавим игрока и его врагов в сцену

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

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

  1. Скорируйте картинку в папку «Textures»
  2. Создайте новый спрайт и назовите его «Player»
  3. Настройте спрайт так, чтобы он отображался в свойстве «Sprite» компонента «Sprite Renderer»

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

  1. Поместите игрока в слой «2 — Foreground»
  2. Измените масштаб на (0.2, 0.2, 1)

Теперь несколько слов о компонентах. Мы только что говорили о компоненте «Sprite Renderer». Если вы еще не заметил, объект игры состоит из нескольких компонентов, видимых в панели «Инспектор».

По умолчанию пустой объект игры выглядит так:

Этот объект имеет только один компонент: Transform . Этот компонент является обязательным и не может быть отключен или удален. Вы можете добавить к объекту столько компонентов, сколько захотите. Например, скрипты добавляются в качестве компонента. Большинство компонентов может быть включено или отключено пока существует объект.

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

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

Sprite Renderer является компонентом, который способен отображать спрайт-текстуру. Теперь, когда мы узнали о концепции компонента, давайте добавим один к игроку!

Добавляем бокс-коллайдер (Box Collider)

Нажмите на кнопку «Добавить компонент» объекта игрока. Выберите «Box Collider 2D». Вы можете увидеть коллайдер в редакторе «Сцена» зрения и настройки его размера в «Инспекторе» в поле «Размер» (Size).

Существует еще один способ редактирования бокс-коллайдера. Выберите игровой объект с помощью бокс-коллайдера и зажмите клавишу shift на клавиатуре. Вы увидите, что на бокс-коллайдере (зеленый прямоугольник ) появились четыре маленьких рычажка. Перетащите один из них, чтобы изменить форму бокс-коллайдера. Будьте осторожны, синий прямоугольник представляет собой компонент Transform вашего игрового объекта, а не коллайдер.

Мы будем устанавливать размер коллайдера равным (10, 10) .

Это слишком много для настоящего шмапа, но все же меньше, чем спрайт:

В настоящее время, этого вполне достаточно.

Совет : Если вы планируете создать шмап , вам придется уделить много времени настройке хитбоксов – они должны точно соответствовать маленькому элементу внутри игрового спрайта. Вы также можете изменить такой параметр коллайдера, как shape – например, с помощью «Circle Collider 2D». Благодаря Unity, его поведение при этом не меняется, но это позволяет немного улучить геймплей.

Сохраним объект игрок как префаб. Теперь у вас есть базовую сущность игрока!

2D полигональный коллайдер

Если вы хотите супер точный и произвольный формы хитбокс, воспользуйтесь компонентом Unity «Полигоннальный коллайдер 2D» (Polygon Collider 2D). Эффект от этого будет незначительный, но зато вы получите такую форму, какую вы хотите.


«Polygon Collider 2D» похож на остальные коллайдеры: вы можете изменять форму с помощью мышки в режиме «Scene». Для удаления точки зажмите cmd или ctrl , а чтобы отрегулировать положение точки или добавить ее в форму коллайдера, используйте shift

Магия Rigidbody

Последний компонент, необходимый для добавления на нашего игрока: «Rigidbody 2D». Это поможет физическому движку правильно задействовать объект в игровом пространстве. Более того, это позволит вам использовать столкновения в скрипте.

  1. Выберите объект Player в «Hierarchy».
  2. Добавьте компонент «Rigidbody 2D».

Теперь, нажмите кнопку «играть» и смотрите, что у нас вышло:

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

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

Гравитация может быть использована в любой игре, но нам она не нужна. К счастью, гравитацию на Rigidbody можн легко отключить. Просто установите «гравитационный масштаб» равным нулю. Вот и все, корабль снова летит. Не забудьте поставить галочку в окошке «Fixed Angles», чтобы предотвратить вращение корабля, обусловленное такой физикой.

Перемещение игрока

Настало время написать скриптик (вы ведь не думали, что все будет двигаться само)? Создайте в Unity C#-скрипт в папке «Scripts» и назовите это «PlayerScript». Откройте ваш любимый редактор или используйте подменю «Sync» (нажмите на «Assets» в строке меню, затем на «Sync MonoDevelop Project») для правки созданного Unity скрипта.

«Sync MonoDevelop Project» : Это подменю немного странное.Во-первых, невозможно изменить имя, даже если сменить редактора.
Мы также рекомендуем использовать это меню при создании первого скрипта, так как Unity создаст решения и привяжет их к библиотекам Unity (для Visual Studio, Xamarin Studio или MonoDevelop).
Если вместо этого вы просто откроете скрипт, компилятор вашего IDE, скорее всего, зарегистрирует определенные ошибки, не Unity. Это не имеет значения, потому что вам не придется использовать его напрямую, но функция автоматического завершения объектов Unity не помешает.

По умолчанию в скрипте уже прописаны методы Start и Update . Вот краткий список наиболее часто используемых функций:

  • Awake() вызывается один раз, когда объект создается. По сути аналог обычной функции-конструктора.
  • Start() выполняется после Awake() . Отличается тем, что метод Start() не вызывается, если скрипт не включен (remember the checkbox on a component in the «Inspector»).
  • Update() выполняется для каждого кадра in the main game loop.
  • FixedUpdate() вызывается каждый раз через определеннок число кадров. Вы можете вызывать этот метод вместо Update() когда имеете дело с физикой («RigidBody» и др.).
  • Destroy() вызывается, когда объект уничтожается. Это ваш последний шанс, чтобы очистить или выполнить код.

У вас также есть некоторые функции для обработки столкновений:

  • OnCollisionEnter2D(CollisionInfo2D info) выполняется, когда коллайдер объекта соприкасается с другим коллайдером.
  • OnCollisionExit2D(CollisionInfo2D info) выполняется, когда коллайдер объекта не соприкасается ни с одним другим коллайдером.
  • OnTriggerEnter2D(Collider2D otherCollider) выполняется, когда коллайдер объекта соприкасается с другим коллайдером с пометкой «Trigger».
  • OnTriggerExit2D(Collider2D otherCollider) выполняется, когда коллайдер объекта перестает соприкасаться с коллайдером, помеченным как «Trigger».

Итак, с теорией покончено, пора в бой. Или нет, погодите еще немного: обратите внимание, что почти все, о чем мы говорили с вами имеет, суффикс «2D». Box Collider 2D , a Rigidbody 2D , OnCollisionEnter2D , OnTriggerEnter2D и т.д. Эти новые компоненты или методы появились с Unity 4.3. Используя их, вы работаете с физическим движком, встроенным в Unity 4.3, для 2D-игр (на основе Box2D) вместо движка для 3D-игр (PhysX). Два движка имеют аналогичные концепции и объекты, но они не работают точно так же. Если вы начинаете работать с одним (например, Box2D для 2D-игр), придерживаqntcm его. Именно поэтому мы используем все объекты или методы с суффиксом «2D».

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

Using UnityEngine; /// /// Контроллер и поведение игрока /// public ); // 4 — движение в каждом направлении movement = new Vector2(speed.x * inputX, speed.y * inputY); > vo >

Поясню цифры в комментариях к коду:

  1. Сначала определим публичную переменную, которая будет отображаться в окне «Инспектор». Это скорость, используемая для корабля.
  2. Сохраним движение для каждого кадра.
  3. Используем дефолтную ось, которую можно отредактировать в «Edit» -> «Project Settings» -> «Input» . При этом мы получим целые значения между [-1, 1] , где 0 будет означать, что корабль неподвижен, 1 — движение вправо, -1 — влево.
  4. Умножим направление на скорость.
  5. Изменим скорость rigidbody. Это даст движку команду к перемещению объекта. Сделаем это в FixedUpdate() , предназначенном для всего, что связано с физикой.

Заметка о соглашениях C# : Посмотрите на видимость speed члена класса – он обозначен как публичный. В C# переменная члена класса должна быть приватной для соответствующего сохранения его внутренней репрезентации.
Но смена типа переменной на публичный позволяет редактировать ее в Unity через панель «Inspector», даже в процессе игры. Это одна из самых мощных возможностей Unity, позволяющая изменять геймплей без использования кода.
Помните, что в данном случае мы создаем скрипты, а это не то же самое, что классическое программирование на C#. Это предполагает некоторых правил и соглашений.

Теперь добавим скрипт к игровому объекту. Для этого перетащите скрипт из окна «Проект» (Project) на игровой объект в «Иерархии» (Hierarchy). Вы также можете нажать на «Add Component» и добвить его вручную.

Нажмите кнопку «Play» в верхней части окна редактора. Корабль движется! Congratulations, Вы только что сделали эквивалент «Hello, World!» для игры:)

Попробуйте настроить скорость: нажмите на игрока, измените значения скорости в «Инспекторе», и посмотрите что из этого получится.

Будьте осторожны: изменения параметров, сделанные во время, игры теряются, когда вы ее остановите! Инспекторе — это отличный инструмент для настройки геймплея, но запомните или запишите, что вы делали, если хотите сохранить изменения. Этот же трюк подходит, если вы хотете проверить что-то новое, но не хотите вносить изменения в реальный проект.

Первый враг

Теперь добавим неприятелей, стремящихся уничтожить наш корабль. Пусть им будет зловещий спрут, названный «Poulpi»:

Создадим новый спрайт. Для этого:

  1. Скопируйте картинку в папку «Textures».
  2. Создайте новый спрайт, используя это изображение.
  3. Измените свойство «Масштаб» (Scale) в разделе Трансформирование (Transform) на (0.4, 0.4, 1) .
  4. Добавьте «Box Collider 2D» размером (4, 4) .
  5. Add a «Rigidbody 2D» with a «Gravity Scale» of 0 and «Fixed Angles» ticked.

Сохраните префаб и. вуаля!

Скрипт

Теперь напишем простенький скрипт, отвечающий за движение осьминога в определенном направлении. Для этого создайте новый скрипт, назвав его «MoveScript».

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

Скопируем некоторые части кода, который мы написали в «PlayerScript» для движения персонажа. We will add another designer (a public member you can alter in the «Inspector») variable for the direction:

Прикрепите скрипт к осьминогу. Нажмите «Play» и убедитесь, что спрут движется так, как показано на рисунке ниже:

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

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

Всем привет. Продолжаем дело, начатое в первой части. Сейчас у нас есть платформа и стоящий на ней персонаж с анимацией покоя. Настало время научить нашего персонажа бегать вправо-влево по платформе.

Загрузим сцену из первой части. Напомню, что в прошлый раз мы импортировали несколько спрайтов в папку AssetsSprites . На всякий случай, внизу поста еще раз приведу ссылку на спрайты. Среди них должен быть спрайт под названием Run . Мы будем использовать его для создания анимации бега. Для этого нам надо проделать те же действия по превращению одиночного спрайта в коллекцию, как и при создании анимации покоя. Вкратце напомню: выделяем спрайт, в окне Inspector устанавливаем свойство Sprite Mode как Multiple , нажимаем ниже Sprite Editor , нарезаем изображение в режиме Grid или Automatic .

Теперь в окне Hierarchy выбираем Character и переходим в окно Animation . Нажимаем на поле с анимацией Idle и выбираем Create New Clip , чтобы создать анимацию бега. Сохраним файл анимации в папке AssetsAnimations под именем Run .

Новая созданная анимация Run стала текущей в окне Animation . Разворачиваем спрайт Run в окне Project , выделяем все фалы Run_0… Run_9 и перетаскиваем в окно Animation . Установим пока значение Sample равное 24.

Все это мы уже делали в первой части, а теперь будет нечто новое. Перейдем в окно Animator . Сейчас там отображены три анимации: Any State , Idle и Run . Нам предстоит задать условия перехода из анимации Idle в анимацию Run , то есть из состояния покоя в состояние бега. В нижнем левом углу есть поле Parameters . Нажимаем на плюсик, выбираем Float и называем новый параметр как Speed . Тем самым мы создали параметр типа число с плавающей запятой, обозначающий скорость перемещения персонажа. Именно в зависимости от значения этого параметра будет происходить переключение из анимации покоя в анимацию бега. Теперь нажимаем правой кнопкой мыши на анимацию Idle , выбираем Make Transition и нажимаем левой кнопкой мыши на анимацию Run . Между анимациями появится линия со стрелкой. Передвиньте мышкой прямоугольники анимации, если плохо видно. Кликнем по линии со стрелкой. В окне Inspector отобразятся свойства перехода между анимациями. Обратим внимание на низ окна, в раздел Conditions . Кликнем на параметр Exit Time и поменяем его на Speed . Второе поле Greater оставим без изменений, а в третьем введем значение 0.01 . Мы создали условие перехода из анимации покоя в анимацию бега — оно происходит, когда значение параметра скорости становится немногим больше нуля.

Теперь нужно сделать обратный переход — из Run в Idle . Делаем все с точностью наоборот: Make Transition от Run к Idle , выделяем переход, в Conditions устанавливаем SpeedLess0.01 .

Теперь у нас есть две анимации и условия перехода между ними. Но пока ничего работать не будет, потому что все что мы сделали нужно «оживить» при помощи скрипта. Давайте перейдем в окно Project и создадим в папке Assets подпапку Scripts . Добавим в нее новый C# Script , назовем его CharacterControllerScript и откроем на редактирование.

Я приведу полный листинг скрипта с подробными комментариями, а ниже еще поясню, что в нем происходит.
using UnityEngine; using System.Collections; public > /// Начальная инициализация /// private vo > /// Выполняем действия в методе FixedUpdate, т. к. в компоненте Animator персонажа /// выставлено значение Animate Physics = true и анимация синхронизируется с расчетами физики /// private vo , Mathf.Abs(move)); //обращаемся к компоненту персонажа Rig > 0 && !isFacingRight) //отражаем персонажа вправо Flip(); //обратная ситуация. отражаем персонажа влево else if (move /// Метод для смены направления движения персонажа и его зеркального отражения /// private vo >

Итак, мы завели несколько переменных: для задания максимальной скорости перемещения, для определения направления (вправо/влево) и для работы с компонентом Animator . Почти все действия происходят в методе FixedUpdate . В нем мы получаем значение оси Х , которое меняется при нажатии на клавиатуре клавиш влево-вправо или A-D (если не меняли соответствующие настройки проекта!). Затем устанавливаем это значение параметру Speed компонента Animator . Обратите внимание, что мы берем модуль этого значения при помощи метода Mathf.Abs , так как при создании условий перехода между анимациями покоя и бега мы сравниваем значение параметра с положительным числом 0.01 . Нам здесь не важно, в какую сторону бежит персонаж. Важно лишь величина значения. Далее задаем скорость перемещения по оси Х в соответствии со значением максимальной скорости. И, наконец, проверяем, в какую сторону бежит персонаж, и в какую сторону он в этот момент повернут. Если он бежит вправо, а повернут влево — разворачиваем его вправо путем инвертирования его размера по оси Х . И наоборот. Этим нехитрым способом мы избавились от необходимости делать две анимации вместо одной: для бега вправо и для бега влево.

Сохраняем скрипт. В Unity перетаскиваем его на нашего Character в окне Hierarchy . Запускаем игру, нажимаем влево-вправо или A-D.

Капитан Коготь теперь умеет бегать! Скорость анимации получилась быстроватой. Ее можно снизить путем уменьшения значения Sample в окне Animation для анимации Run (значение 12 будет нормально). Если одновременно с игрой у вас видно окно Animator , то вы увидите, что во время покоя работает анимация Idle (бегает синий прогрессбар), а во время бега происходит переход на анимацию Run , и, соответственно, работает она.

На этом пока все. Нам осталось разобраться с прыжками… и узнать при этом еще несколько новых вещей!

Пишем арканоид на Unity. Поведение блоков, префабы и дизайн уровней

Всем привет! Сразу хочу напомнить вам терминологию:

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

1) Я переименовал все и привел в подобающий вид.
2) Я добавил объект Mouse для управления платформой.

Теперь давайте рассмотри базовую механику:

1) У нас будет мячик. Он будет отбиваться от стен, блоков и платформы.
2) Стены будут находится на левой, правой и верхней границах экрана.
3) У нас будет платформа, как говорилось ранее ей мы будем манипулировать мышкой, но вы вполне можете сделать это с помощью клавиатуры, главное чтобы это было сделано грамотно .
4) Собственно, блоки разной прочности. Если прочность блока больше единицы, то блок удаляется и на его место ставится менее прочный, а если прочность блока равна единице, то блок просто удаляется.

Приступаем: Для начала переименуем слой «Layer 0» в «Background» и создадим слой «Game».

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

Примерно такой результат должен быть у вас:


Теперь бонус:
Как вы заметили, платформа залезает за стены — это можно исправить в одну строчку:

Здесь записана вот такая строка в поле X: Код: Выделить всё max(paddle.Width / 2, min(Mouse.X, LayoutWidth — paddle.Width / 2))

Домашняя работа:
На тройку — выполнить все в точности как сказано
На четыре — выполнить все в точности как сказано и здраво назвать все переменные, чтобы человек знающий английский мог понять, что здесь происходит
На пять — выполнить все в точности как сказано и здраво назвать все переменные, чтобы человек знающий английский мог понять, что здесь происходит; объяснить как работает бонус в сообщении или реализовать блоки рациональней (Такой вариант точно есть)

Если что-то не поняли — ЛС мне . Всегда рад ответить.

Улучшение работы с префабами

В версии 2020.3 мы улучшили процесс работы с префабами, включая вложенные префабы, варианты префабов и режим префабов.

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

Улучшения внесены на основе опросов более 150 корпоративных клиентов, многочисленных интервью, нескольких тестов удобства использования и двух мероприятий — Game Jam. Нашей долгосрочной целью было не только внедрение поддержки вложенных префабов, но и переосмысление основных рабочих процессов с префабами, чтобы разные члены команды могли одновременно эффективно изменять префабы.

Повышенная гибкость

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

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

Повышение продуктивности

Это облегчает следующие задачи для команд любых размеров:

  • Разделение префабов на несколько объектов для повышения эффективности
  • Повторное использование любого контента, от маленького до крупного
  • Одновременная работа над разными частями контента

Гибкие возможности повышают эффективность

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

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

Избегайте отнимающих время ошибок

Основа новых рабочих процессов — режим префабов — позволяет вам редактировать префабы отдельно от остального проекта.

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

Узнайте, как члены команды Unity R&D Николин Ог и Стин Кьерболл отправились на поиски открытий: проведя тесты, опросы и пообщавшись напрямую со 150 клиентами, они собрали ценные данные, которые помогли фундаментальным образом улучшить процессы работы с префабами.

Смотрите наши официальные доклады на Unite и GDC

Запись краткого доклада с GDC 2020, где мы в общем рассказываем о префабах в Unity 2020. Технический евангелист Чиро Континисио (Ciro Continisio) расскажет об основных особенностях новых методов организации префабов (например, вложении, вариации и режиме редактирования с изоляцией префаба). Кроме того, он расскажет о новых элементах интерфейса и об их смысле.

Как нужно привязать префаб к скрипту в Юнити, чтобы все объекты на сцене исполняли код?

Доброго времени суток.
Синим цветом на скриншоте обведены объекты, находящиеся на сцене(это две лестницы), которые при прикреплении к скрипту работают, но только по отдельности, так как в скрипте был задан только один GameObject.
public GameObject platform_ladder;

При попытке прикрепить в инспектор скрипта (выделено желтым цветом) Префаб (обведенный красным цветом) все перестает работать. Хотя объекты находящиеся на сцене являются этим префабом.

На этой почве возник вопрос:
Как, не создавая +100500 GameObject’ов, можно использовать префаб в качестве одного объекта? И можно ли вообще так сделать?

Введение в новый процесс работы с префабами

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

Вступление

Начнем с пересказа основ префабов в Unity. Фундаментально, ассеты префабов в Unity — это как шаблоны игровых объектов и их Child-ов. Вы можете создавать множество копий префабов на сцене. Если ассет был изменен, то все размещенные префабы на сцене также будут соответственно обновлены.

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

Для решения многих проблем были введены несколько важных новых фич. Была реализована обратная совместимость префабов, так что теперь они поддерживают вложенность и наследование. Была улучшена визуализация свойств и обьектов, которые переопредлеяются конкретным префабом размещенным на сцене. Также была добавлена возможность применения переопределения параметров на разном уровне: на каждое свойство, на весь компонент или игровой объект или как ранее на весь объект префаба на сцене. И напоследок — добавлен новый режим Prefab Mode для возможности изолированного редактирования префаба.

Prefab Mode

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

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

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

Работа с ассетами префабов

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

Работа с объектами префабов на сцене

Теперь для реализации наследования префабов вы больше не можете отсоеденить инстанс префаба для произведения структурных изменения. Вам необходимо удалить игровой объект, пересоздать с нужной иерархией через изменение связки с Transform или Rect Transform или чем-то подобным. Но вы теперь можете делать все эти вещи более удобным способом в режиме редактирования префабов — Prefab Mode. А также вы можете распаковать префаб, превратив его в обычный набор объектов на сцене и делать с ним все что угодно.

Предварительная сборка

Был введен новый термин — » stage» в редакторе, как концепт для набора игровых объектов изолированных от других объектов. Когда вы находитесь в режиме Prefab Mode, навигатор сверху окна сцены показывает разные уровни изменений. Каждый уровень (stage) представляет собой отдельный «мир». По-умолчанию, все имеет главный уровень (Main Stage), который является состоянием всей сцены, которую вы видите. Когда открывается режим работы с префабами, создается новый уровень изменений — «Prefab Stage» для контента префаба. При этом предыдущее изменение не выгружается из памяти и вы можете его наблюдать, не закрывая окно префаба.

Для навигации между состояниями (stages) вы можете использовать панель навигации сверху окна сцены.

Как нужно привязать префаб к скрипту в Юнити, чтобы все объекты на сцене исполняли код?

Доброго времени суток.
Синим цветом на скриншоте обведены объекты, находящиеся на сцене(это две лестницы), которые при прикреплении к скрипту работают, но только по отдельности, так как в скрипте был задан только один GameObject.
public GameObject platform_ladder;

При попытке прикрепить в инспектор скрипта (выделено желтым цветом) Префаб (обведенный красным цветом) все перестает работать. Хотя объекты находящиеся на сцене являются этим префабом.

На этой почве возник вопрос:
Как, не создавая +100500 GameObject’ов, можно использовать префаб в качестве одного объекта? И можно ли вообще так сделать?

Полностью отсоединить gameObject от префаба Unity

Из префаба я создаю группу объектов. У каждого из них разные свойства, кому то что то добавляем, у кого то что то убираем. Но у всех висит кнопочка Prefab Apply, и если я её нажму — главный префаб, от которого я это беру, изменится. Мне нужно, чтобы я мог создать объекты из префаба и между ними не было бы вообще никакой связи больше. И кнопка Apply исчезла.

1 ответ 1

Unity — не простой банальный редактор. В нем много есть своих полезных инструментов. Например в Unity есть кнопка в меню Game Object → Break Prefab Instance

С помощью неё можно открепить объект от оригинала. В теории. Дальше, в зависимости от версии (не знаю глюк или нет) может пропасть меню, а может не пропасть. Лично я считаю, что просто не стоит больше нажимать кнопку Apply и будет все хорошо))

Но если надо тотально избавиться от связи и еще и от кнопок Select — Revert — Apply, то еще парочка способов всё же есть.

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

  • Выбрать объект в иерархии. Пойти в меню и нажать Game Object → Break Prefab Instance
  • Перетащить этот самый объект с иерархии в панель проекта, чтоб создать новый префаб
  • Удалить этот префаб
  • Выбрать объект в иерархии (он станет подсвечен красным) и еще раз выбрать Game Object → Break Prefab Instance
  • Готово

Можно воспользоваться скриптом, который достаточно бросить в папку Assets

Скрипт позволяет убить связь как через меню сверху Game Object → Break Prefab Instance Definitive , так и через контекстное меню ( ПКМ на выбранном объекте) → Break Prefab Instance Definitive , при этом кнопки Select — Revert — Apply уже будут отсутствовать.

Рецепт: Создание новых объектов во время выполнения (Unity C#)

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

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

Давайте начнём, создайте куб на сцене и отредактируйте его так как хотите. Затем создайте папку Prefabs и перетащите туда куб. Это всё! Вы создали префаб, теперь вы можете удалить куб со сцены. У нас есть точная копия этого куба и мы будем её использовать во время выполнения.

Мастер Йода рекомендует:  РИА В Госдуме предложили создать кибердружины
Добавить комментарий