Как сделать триггер в юнити 2д

Обновлено: 07.07.2024

Здравствуйте! В этой статье мы научим Камеру следить за Персонажем и научимся переходить с одной сцены на другую.

Добавляем скрипт к Камере и пишем следующий код:

  • В первой строчке мы объявляем переменную target типа Transform . Ей мы будем передавать Transform (положение, Rotate (угол поворота) и масштабирование) нашего Персонажа в самом редакторе Unity .
  • Во второй мы объявляем насколько гладко будет движение Камеры.
  • В третьей мы объявляем вектор Камеры, но т.к. она сама по себе не движется, то вектор нулевой .
  • В четвертой мы объявляем точку , к которой будет стремиться Камера. В нашем случае это те же X и Y, но только "выше" (или "ниже", если смотреть на координаты).
  • В пятой мы меняем положение камеры с помощью метода SmoothDamp

Теперь не забудьте сохранить скрипт и в Unity в Target добавить нашего Персонажа. Давайте заценим результат:

Добавить камере Pixel Perfect Camera и поставить галочку у Pixel Snapping :

Если у Вас появляется ошибка, которая сообщает, что разрешение экрана число нечетное, просто подергайте границы между окном Game и окном Инспектора

Теперь можно подумать над расширением локации и создании новых. Но как переходить между ними?

Для этого сначала нам создать Prefab 'ы Персонажа и Камеры. Для этого создадим отдельную папку Prefab и из окна Иерархии перенести нужные нам объекты в эту папку.

Далее создаём новую Сцену и открываем её, далее попробуйте по памяти создать игровой уровень, где будет земля с небом. Затем удалите встроенную в сцену Камеру и добавьте Префабы Персонажа и Камеры.

Теперь осталось добавить " порталы " в другие сцены. Для этого или создаем карту тайлов и, соответственно, добавляем Тайлы или просто переносим спрайт " портала " (я использую карту тайлов).

Добавляем Тайлам все те же Composite 'ы, что и земле. Только поставим галочку:

Для тех, кто не очень ладит с английским есть:
Способ подключить грубо переведенные автоматическим переводчиком субтитры к видео урокам - в плеере нажмите "настройки" (шестеренка) -> нажмите "субтитры" -> английский -> снова "субтитры" -> перевести -> выберите русский язык.

Способ подключить удобный автоматический переводчик к браузеру, что даст возможность перевести либо отдельные фразы, либо всю страницу полностью, без нужды перехода на страницу онлайн переводчика.
Есть масса способов это сделать к каждому браузеру, как вариант можно использовать связку Google Chrome + расширение Google Translate - в браузере в правом верхнем углу нажмите на три вертикальные точки, войдите в "настройки" -> расширения -> еще расширения -> ввести в поиске "переводчик" -> выбрать Google Translate.
Использовать его просто - выделяете строчку, которую нужно перевести и в зависимости от её длинны вы либо щелкаете на появившуюся иконку переводчика, либо щелкаете правой кнопкой мыши и переходите на страницу переводчика, выбрав "Google переводчик"
Так же есть возможность перевести всю страницу - переводчик либо спросит об этом сам, либо в правом верхнем углу браузера нажмите на иконку переводчика и выберите "перевести страницу" (но со страницами с iFrame вложениями это не работает, допустим вы не переведете страницу с документацией API скриптов Unity этим способом)

Во вторых - если вам либо лень погружаться в рутину изучения документации, либо вы уже знаете азы и даже работаете над какими то проектами, могу объяснить некоторые прописные истины работы с движком:
1. Физика 3D
Во первых, если вы хотите использовать физику в своих проектах, то не используйте при перемещении и вращении физических объектов обращение к transform объекта, используйте вместо этого обращение к rigidbody, это даст физическом движку правильную информацию о движении объекта, оно будет сглаженным и в случае столкновения объект правильно среагирует на него. Обращение же к transform, по сути просто "телепортирует" объект без использовании физики, даже если это выглядит гладко, его движение состоит из тысяч "телепортаций", вместо настоящего движения.

1) Статические объекты - это объекты, которые определяют некоторые границы уровня, такие как стены или земля, эти объекты никогда не двигаются и для физического движка являются одним целым. Для движка это объект, имеющий коллайдер, не используемый как триггер и не имеющий Rigidbody. Такие объекты, сколько бы их не находилось на сцене, движок подсчитывает единожды и не обращается к ним при пересчете физики в каждом time step, определенным для физики. То есть допустим, если вы двигаете скриптом transform объекта, имеющий коллайдер, но не имеющий Rigidbody, движку приходится пересчитывать абсолютно все статические объекты, чтобы вновь построить сцену, это конечно же не эффективно для производительности.

2) Кинематические объекты - объекты, выполняющие роль статических объектов, но которые мы все же двигаем/вращаем обращаясь к ним через скрипт. Допустим это секретная стена, отодвигающаяся при определенном действии, но в обычном состоянии это типичная стена, как и все стены уровня. Для движка это объект, имеющий коллайдер, не используемый как триггер, но имеющий Rigidbody, настроенный как Kinematic. На этот объект, хоть он и имеет Rigidbody, не будут воздействовать внешние силы (гравитация или столкновения), в то же время он будет останавливать любые динамические объекты, столкнувшиеся с ним. Хоть этот объект и выполняет функцию статического объекта, все же движком он обсчитывается отдельно - всегда используйте для объектов, которые выполняют роль статических объектов, но все же изменяют свое положение в пространстве этот способ, так же перемещая их обращайтесь к их rigidbody, а не transform, это опять же даст правильный просчет физики при их перемещении. Скажем динамический объект, стоящий на кинематическом объекте, который двигается, будет двигаться вместе с ним. Обращение же к transform двигало бы кинематический объект, но не затрагивало бы стоящий на нем динамический объект.

3) Динамические объекты - это объекты, подверженные воздействию гравитации и воздействию других динамических объектов, т.е. они взаимодействуют со всем как настоящий физический объект. Для движка это объект, имеющий коллайдер, не используемый как триггер и имеющий Rigidbody, не помеченный как Is Kinematic. В игровом мире это может быть игрок, стрела пущенная им или допустим коробка, которую можно толкать. У таких объектов можно отключать воздействие гравитации, но они так же будут взаимодействовать с окружающим миром, их все еще можно будет толкнуть, хоть они и будут висеть в воздухе, как какой нибудь статический объект, если ранее им не придали ускорение.

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

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


Это блог про аниме?

Intermedius — находящийся посередине. Думаю, что все, кто смотрел хотя бы одну серию аниме, замечали небольшую вставку в середине, которая обычно служит для перехода между сценами и рекламного блока (англ. - bumper, яп. - アイキャッチ aikyatchi). Картинка из заголовка статьи является таким переходом в одной из серий тайтла “New Game!!", про небольшую игровую студию. Ах да, раз это блог про Unity, то в данном посте мы рассмотрим оформление перехода между сценами именно в нём. =)

Сцены в Unity являются основной единицей деления игры на части и сам по себе переход между ними не является чем-то сложным. Переход реализуется через класс SceneManager, при помощи методов LoadScene() или LoadSceneAsync(), но без дополнительного оформления эти переходы будут резкими и это будет выглядеть странно. Попробуем сгладить этот переход, добавив проекту немного визуальной привлекательности.

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

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

Задача

Оформить переход между тремя сценами через затемнение. Первая сцена появляется моментально и через 2 секунды переходит во вторую. Переходы между второй и третьей зациклены и осуществляется плавно по клику.

Подготовка

  1. Создадим три сцены:
    • BootScene - самая первая сцена, на которую попадает игра, покажем её сразу без затемнения
    • FirstScene и SecondScene - две сцены, переходы между которыми буду зациклены между друг другом
  2. Добавим сцены в Build Settings
  3. Создадим ещё один объект Canvas с именем SceneTransition . Выставим ему Render Mode - Screen Space - Camera и добавим Main Camera . Выставим Order in Layer равным 999 , чтобы он всегда был поверх всего остального
  4. Добавим к SceneTransition объект типа Image и назовём его Fade . Полностью чёрный, перекрывающий всю площадь экрана. Можно его отключить, чтобы он не загораживал экран

Анимация

  1. Создадим папку Animations
  2. Откроем панель Animation . Выделив элемент Fade нажмём кнопку Create и создадим анимацию FadeIn , также создадим анимацию FadeOut
  3. Настроим анимацию FadeIn . Выделяем ассет FadeIn . Убираем галочку Loop Time . Выделяем элемент Fade . В закладке Animation нажатием кнопки Enable/Disable keyframe recording mode включаем запись действий. Включаем компонент Image . Переходим в закладке Animation на отметку в 1 секунду. Выставляем в настройке цвета alpha = 0 . Выключаем компонент Image . В закладке Animation выключаем запись действий. Проверяем анимацию плавного появления UI из затемнения
  4. Настраиваем анимацию FadeOut , но в обратном порядке: включаем Image , альфа-канал от 0 до 100 . Этот пункт остаётся в качестве тренировки
  5. Настраиваем переход между анимациями. Во вкладке Animator добавляем триггер FadeOut . Добавляем переход между FadeIn и FadeOut . На переходе выключаем Has Exit Time , Transition duration выставляем в 0. В Conditions добавляем созданный триггер FadeOut
  6. Создадим скрипт TransitionHandler для переключения сцены после завершения анимации FadeOut

  1. Добавим созданный скрипт к объекту Fade . В конец анимации FadeOut добавим Event . Выберем функцию FadeOutFinished() из скрипта TransitionHandler

Настройка переходов

  1. Для BootScene создадим скрипт, который будет запускать переход на FirstScene через 2 секунды
  1. Настроим BootScene . Добавим префаб SceneTransition . Настроим камеру. Укажем следующую сцену - FirstScene . Отключим анимацию появления сцены
  2. Добавим на сцену пустой объект назовём его BootHandler и добавим соответствующий скрипт. Настроим для нового объекта animator
  3. После запуска BootScene должна иметь затемнение перед переключением
  4. Создадим скрипт ClickHandler для остальных сцен, который будет запускать переход по клику
  1. Настроим FirstScene . Добавим префаб SceneTransition . Настроим камеру. Укажем следующую сцену - SecondScene
  2. Добавим на сцену пустой объект назовём его ClickHandler и добавим соответствующий скрипт. Настроим для нового объекта animator
  3. Настроим SecondScene . Проделываем те же самые шаги, что и для FirstScene , только указываем следующей сцену - FirstScene
  4. Наслаждаемся результатом

Заключение

После всех наших манипуляций мы получили префаб, который можно использовать для настройки переходов между сценами. Навряд ли вы будете его использовать для продакшена, так как используемая синхронная загрузка сцен не очень красивое решение, а также необходима тонкая настройка условий перехода, необходимо продумать остановку игры, в момент начала анимации. Да и сами анимации желательно сделать более интересными, например, в Homescapes(Playrix) переход между загрузкой ресурсов и запуском меню скрыт за опускающейся вдоль стены дома камерой. Однако, после повторения данных шагов собственными руками, у вас должно сложиться представление, как сделать переходы красиво. Пока! =)

using UnityEngine;
using System.Collections;

public class TriggerText : MonoBehaviour

using UnityEngine;
using System.Collections;

public class TriggerText : MonoBehaviour

void OnTriggerEnter(Collider other) < // при входе в триггер
if(other.tag == "needTrigger") < // если это наш триггер
NoEnter.text = "Путь туда закрыт"; // выводим надпись
>
>
void OnTriggerExit(Collider other) < // при выходе из триггера
if(other.tag == "needTrigger") < // если это наш триггер
NoEnter.text = ""; // убираем надпись
>
>
>

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

Из чего состоит трехмерная сцена?

Трехмерная (3D) сцена состоит главным образом из трех основных визуальных компонентов: источников света (lights), рендеров мешей (mesh renderers) и шейдеров. Unity поддерживает четыре типа источников света. Вы найдете их в меню GameObject. Поэкспериментируйте, добавляя разные типы и изменяя их свойства. Самый простой из них — источник направленного света (directional light), который подобен солнцу на небе.

Меш (mesh), или модель, — это набор вершин, образующие многоугольники, из которых состоит какой-либо объект. Шейдер является скомпилированной подпрограммой, содержащей код для управления тем, как будет отображаться ваш объект или как он будет взаимодействовать с источником света. Некоторые шейдеры просто берут освещение и отражают его подобно зеркалу, другие — принимают текстуру (изображение, применяемое к мешу) и могут создавать тени и глубину, а некоторые даже позволяют прорезать визуальные дыры в ваших моделях (пример — изгородь).

Asset Store

Я вкратце рассказывал об Asset Store (магазине ресурсов) в своей первой статье, но по-настоящему полезным он становится при разработке 3D-игр. Я не художник и, поскольку это технический журнал, полагаю, что большинство из вас тоже не являются художниками. (Если же вы художник, пожалуйста, примите мои поздравления — это редкий дар.) Но, если вы хотите создать игру, например, с буйной растительностью и старыми полуразрушенными зданиями, это не проблема. Я могу купить то, что мне нужно, в Asset Store. Если мне нужны 15 видов зомби, я могу приобрести пакет от Mixamo в Asset Store. Потенциально возможные комбинации почти бесконечны, так что не волнуйтесь о том, что чья-то игра будет выглядеть похожей на вашу. А самое главное в том, что Asset Store интегрирован с Unity. Вы можете обновлять свои пакеты, щелкая Window | Asset Store, а затем значок корзины. Вы также можете просматривать рецензии и комментарии, чтобы быстрее понять, подойдет ли конкретный элемент для вашего проекта, например оптимизирован ли он для мобильного устройства. Настольные игры обычно используют гораздо больше объектов, текстур, вершин, памяти, чем мобильная игра, хотя некоторые из более новых чипов делают сегодня мобильные устройства близкими по своим возможностям к Xbox 360.

В типичной 3D-игре применяются многие из тех же концепций, что и в 2D-играх: коллайдеры, триггеры, абсолютно твердые тела (rigid bodies), игровые объекты/преобразования, компоненты и др. Независимо от типа 3D-игры обычно вам нужно контролировать ввод, перемещения и персонажей, использовать анимации и эффекты частиц, а также выстраивать воображаемый мир так, чтобы он был и фантастическим, и реалистическим. Мы обсудим некоторые способы, которыми Unity может помочь добиться всего этого.

Контроллеры ввода, перемещения и персонажей

Чтение ввода для перемещения в 3D немного усложняется, потому что вместо простого движения в плоскостях X и Y теперь можно двигаться в трех измерениях: X, Y и Z. Варианты 3D-перемещения включают (но не исчерпываются ими) движение сверху вниз, где персонаж двигается только горизонтально и вертикально; поворачивание камеры или персонажа при считывании ввода от мыши, как это делается во многих шутерах от первого лица (first-person shooter, FPS); смещение влево и вправо при чтении ввода по горизонтали; вращение вокруг себя при чтении ввода по горизонтали или простое движение в обратном направлении. Вариантов перемещения очень много, так что вам есть из чего выбирать.

Рис. 1. Различные методы перемещения объектов

У каждого подхода есть свои плюсы и минусы. При перемещении только с помощью преобразования производительность может пострадать (методы 1–2), хотя это очень простой способ перемещения. Unity предполагает: если у объекта нет компонента rigidbody, он, вероятно, не является перемещаемым объектом. Она создает на внутреннем уровне статическую матрицу столкновений (static collision matrix), чтобы знать, где находятся объекты; это повышает производительность. Когда вы перемещаете объекты с помощью преобразования, эту матрицу нужно пересчитывать, что приводит к уменьшению производительности. В простых играх вы никогда не заметите этого падения производительности, и такие варианты могут оказаться для вас самыми простыми, хотя по мере усложнения ваших игр важно перемещать само абсолютно твердое тело, как в методах 4–6.

Поворачивание объектов

Поворачивание объектов — операция сравнительно несложная, во многом аналогичная перемещению объектов, но теперь векторы представляют градусы, а не позицию или нормализованный вектор. Нормализованный вектор — это просто вектор с максимальным значением 1 для любого значения, и он может использоваться, когда вам нужно лишь ссылаться на направление по вектору. Вам доступны некоторые ключевые слова, относящиеся к векторам, например Vector3.right, back, forward, down, up, left, right, zero и one. Все, что будет перемещаться или поворачиваться в положительном горизонтальном направлении, может использовать Vector.right, под которым подразумевается (1,0,0), или одна единица вправо, а в случае поворачиваемого объекта это один градус. На рис. 2 я просто понемногу поворачиваю объект в каждом кадре.

Рис. 2. Метод для поворачивания объекта

У каждого из этих методов есть свои нюансы. Какой из них следует использовать вам? Я попытался бы по возможности приложить силы к rigidbody. Наверное, я просто немного запутал вас этим вариантом. Хорошая новость в том, что уже имеется код, способный делать за вас практически все из этого.

Вы обратили внимание на Quaternion в методе 3? Unity использует на внутреннем уровне эти Quaternion для представления всех поворачиваний. Quaternion — эффективные структуры, предотвращающие эффект, который называется шарнирной блокировкой (gimbal lock). Он возможен, если для поворачивания вы используете обычные углы Эйлера (Euler angles). Шарнирная блокировка происходит, когда две поворачиваемые оси оказываются в одной плоскости, после чего их нельзя разделить. (Наглядную демонстрацию см. в видеоролике по ссылке bit.ly/1mKgdFI.) Чтобы избежать этой проблемы, Unity использует структуры Quaternion вместо углов Эйлера, хотя вы можете задавать углы Эйлера в Unity Editor и он в конечном счете будет выполнять их преобразование в Quaternion. Многие никогда не сталкиваются с шарнирной блокировкой, но я хотел указать на то, что, если вы хотите напрямую задавать поворачивание в коде, то должны делать это через Quaternion; кроме того, вы можете сами преобразовывать углы Эйлера с помощью Quaternion.Euler.

Теперь, когда вы увидели множество вариантов, должен отметить, что самым простым методом я нахожу использование rigidbody и простое применение .AddForce к персонажу. По возможности я предпочитаю повторно использовать код, и, к счастью, Unity предоставляет целый ряд заготовок (prefabs).

Давайте не будем изобретать колесо

Unity предоставляет пакет Sample Assets в Asset Store (bit.ly/1twX0Kr), который содержит кросс-платформенный диспетчер ввода, элементы управления для контроля джойстиков на мобильных устройствах, некоторые анимации, эффекты частиц и, что самое важное, ряд заранее скомпилированных контроллеров персонажей.

В Unity (версии 4.6 на момент написания этой статьи) также включены некоторые более старые ресурсы. Эти ресурсы теперь распространяются как отдельный пакет, который Unity может обновлять индивидуально. Вместо написания всего кода для создания в игре персонажа от первого или третьего лица или даже самостоятельно движущегося автомобиля вы можете просто использовать заготовки (prefabs) из ресурсов-образцов. Перетащите заготовку в свою сцену и вы моментально получите персонаж с видом от третьего лица со множеством анимаций и полным доступом к исходному коду, как показано на рис. 3.

Заготовка персонажа от третьего лица


Рис. 3. Заготовка персонажа от третьего лица

Анимации

Системе анимации Mecanim в Unity можно было бы посвятить целую книгу (и такая книга уже написана, кстати). Анимации в 3D, как правило, сложнее, чем в 2D. В 2D файл анимации обычно изменяет спрайт для рендеринга в каждом ключевом кадре. В 3D данные, связанные с анимацией, гораздо сложнее. Вспомните: в предыдущей статье я говорил, что файлы анимации содержат ключевые кадры. В 3D может быть много ключевых кадров, каждый из которых содержит массу точек данных для движений пальцев, руки или ноги или для выполнения любого количества и типа перемещений. Кроме того, меши могут определять кости в них и использовать компоненты, называемые рендерами мешей со скинами (skinned mesh renderers), которые деформируют меши на основе того, как движутся кости; это во многом напоминает то, как движутся живые существа.

Файлы анимации обычно создаются в сторонней системе моделирования/анимации, хотя их можно создавать и в Unity.

Контроллер анимации для управления состояниями анимации персонажа


Рис. 4. Контроллер анимации для управления состояниями анимации персонажа

Помните, что персонажи и анимации можно получать из Unity Asset Store, создавать с помощью средств моделирования и использовать сторонние продукты вроде Fuse от Mixamo, которые позволяют быстро генерировать адаптированные под ваши потребности персонажи. Просмотрите мои видеоролики на Channel 9 — они дадут вам начальное представление об анимации в Unity.

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

В Unity встроена система террейнов для генерации миров. Можно создать террейн, а затем использовать имеющиеся инструменты для приданию террейну нужных форм, создания гор, размещения деревьев и травы, рисования текстур и др. Можно добавить в мир небо, импортировав пакет скайбоксов (Assets | Import Package | Skyboxes) и назначив их в Edit | Render Settings | Skybox Material. У меня ушло около пары минут на создание террейна с динамической отражающей водой, деревьями, песком, горами и травой (рис. 5).

Быстро созданный террейн


Рис. 5. Быстро созданный террейн

Системы координат в Unity

В Unity есть четыре метода для ссылки на какую-либо точку в игре или на экране (рис. 6). Существует экранное пространство, диапазон которого простирается от 0 до количества пикселей; оно обычно используется для получения местоположения, где пользователь коснулся экрана или щелкнул мышью.

Пространство области просмотра (viewport space) — просто значение от 0 до 1, благодаря которому можно сообщить, что полпути — это .5, а не делить пиксели на 2. Поэтому я могу разместить объект посреди экрана, указав в качестве его позиции координаты (.5, .5).

Мировое пространство (world space) относится к абсолютному позиционированию объекта в игре на основе трех координат: (0, 0, 0). Все игровые объекты верхнего уровня в сцене имеют свои координаты, перечисленные в мировом пространстве.

Наконец, локальное пространство (local space) всегда относительно родительскому игровому объекту. В случае игрового объекта верхнего уровня оно идентично мировому пространству. Все дочерние игровые объекты перечисляются в Editor с координатами относительно их предку, поэтому, например, в вашей модели у дома могут быть мировые координаты (200, 0, 35), тогда как у его передней двери (предполагая, что это дочерний игровой объект, принадлежащий дому) — только (1.5, 0, 0), поскольку они относительны предку. В коде, когда вы ссылаетесь на transform.position, всегда используются мировые координаты, даже если это дочерний объект. В данном примере у двери были бы мировые координаты (201.5, 0, 35), но, если вместо этого вы ссылаетесь на transform.localPosition, вы получили бы (1.5, 0, 0). В Unity есть функции для преобразований между различными системами координат.

Координаты в Unity


Рис. 6. Координаты в Unity

Screen space: Экранное пространство:
Viewport space: Пространство области просмотра:
World space: Мировое пространство:

Потоки и сопрограммы

Рис. 7. Применение сопрограммы для приостановки действия

Физика и обнаружение коллизий

Физика и средства обнаружения коллизий в 3D почти такие же, как в 2D, с тем исключением, что коллайдеры имеют другую форму и у компонента rigidbody есть несколько других свойств, таких как способность свободного вращения или перемещения по осям X, Y и Z. В 3D теперь имеется коллайдер меша, который обертывает всю фигуру модели как зону распознавания коллизии. Звучит грандиозно, и для коллизий это все весьма хорошо, но плохо для производительности. В идеале, нужно упростить формы коллайдеров и ограничить процессорные ресурсы, необходимые для их использования. У вас есть зомби? Нет проблем — используйте коллайдер капсулы (capsule collider). Сложный объект? Используйте несколько коллайдеров. По возможности избегайте коллайдера меша.

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

Методов гораздо больше, чем перечислено здесь, в частности есть методы OnTriggerExit и OnCollisionExit, почти идентичные своим аналогам в 2D.

Создание объектов

Когда вам нужно создать в период выполнения новые элементы на основе GameObject, не пользуйтесь конструкторами. Вместо них применяйте Instantiate. У вас определенно могут быть классы с конструкторами, которые в скриптах неявно наследуются от MonoBehavior; это происходит во всех скриптах верхнего уровня, назначенных любому GameObject. Однако эти скрипты могут вызывать конструкторы для других объектов:

Эффекты частиц

Если вы хотите, чтобы у вас были мерцающие звезды, пыль, снег, взрывы, огонь, туман, поднимающийся от водопада, всякие кровавые и другие эффекты, нужно использовать эффект частиц (particle effect). В Unity есть старая система частиц и более новая, лучше оптимизированная — Shuriken. С помощью Shuriken в Unity можно делать массу потрясающий вещей, в том числе заставить падающие частицы поддерживать коллизии. Поскольку на этот счет существует множество учебных пособий, например по ссылке bit.ly/1pZ71it, и эффекты, как правило, создаются в Editor с дизайнером, здесь я просто покажу, как можно создавать их экземпляры, когда, скажем, некий персонаж попадает в область триггера монеты, которую он должен подобрать.

Чтобы начать работу с частицами, выберите Game Object | Particle System и вы сразу же увидите, что в вашу сцену добавлен один из эффектов, как на рис. 8.

Эффект частиц


Рис. 8. Эффект частиц

Я предпочитаю создавать из своих систем частиц заготовки (о которых я рассказывал во второй статье), чтобы их можно было легко использовать повторно. Достаточно создать их экземпляры в коде, сначала назначив скрипт игровому объекту (предполагая, что его класс наследует от MonoBehavior, как и все компоненты script игровых объектов), а затем перетащив нужный эффект частиц в Editor из сцены или заготовки в проект, например, на предоставляемое свойство SmokeEffect (рис. 9).

Рис. 9. Предоставляемое свойство SmokeEffect

Создание UI

В Unity 4.6 добавили совершенно новую систему UI для создания элементов HUD (heads-up display) в игре с использованием текста, панелей, виджетов и др. Добавление текста в HUD вашей игры сводится к выбору GameObject | UI | Text и заданию шрифта и текста. Если вам нужно позднее управлять текстом в коде, например для обновления счета, вы просто используете:

Если мне требуется некое изображение в UI, я открываю GameObject | UI | Image и назначаю спрайтовое 2D-изображение этому новому компоненту. Значения задаются, как и в случае любого другого игрового объекта. Надеюсь, что к этому моменту вы уже заметили шаблон. Чтобы создать простой GUI, создайте UI-объекты через меню GameObject | UI, укажите начальные значения в Editor и позже контролируйте их, получая ссылки на данные UI-компоненты и изменяя значения или даже анимируя их. Я сформировал базовый GUI, показанный на рис. 10, создав элементы под новым компонентом Canvas. Новая UI-система в Unity 4.6 содержит ряд базовых типов объектов, таких как Panel, Button, Text, Image, Slider, Scrollbar и Toggle, и с ними невероятно легко работать при создании UI.

UI с изображением и текстов в HUD


Рис. 10. UI с изображением и текстов в HUD

Искусственный интеллект в вашей игре

Заключение

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

Когда я только начинал разрабатывать игры, я едва не сошел с ума в поисках множества моделей и текстур в Интернете. В Интернете есть некоторые великолепные торговые площадки, предлагающие такие ресурсы, но вы быстро поймете, что не все они годятся для игр. Как-то раз я скачал модель небольшого валуна, в которой оказалось почти 100 000 вершин! Ищите ресурсы, оптимизированные под мобильные устройства, или проверяйте количество вершин/многоугольников, чтобы они гарантированно работали в ваших играх. А иначе они значительно замедлят вашу игру. Существуют средства оптимизации моделей, в том числе Cruncher, включенный в Unity. В следующей статье я рассмотрю, как перенести игру или приложение из Unity на платформу Windows. Заходите в мой блог на Channel 9 (aka.ms/AdamChannel9), где я периодически выкладываю свои учебные видеоролики и ссылки на различный контент для скачивания.

Выражаю благодарность за рецензирование статьи экспертам Мэтту Ньюмену (Matt Newman) из Subscience Studios и Тоутвидасу Цилису (Tautvydas Žilys) из Unity.

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