Как сделать треугольник в unity

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

Здравствуйте! В этом уроке мы создадим нашего персонажа и научим его двигаться.

Для этого нам нужен спрайт персонажа. Для себя я выбрал вот такой пак со спрайтами:

Дальше переносим спрайт на сцену, который мы хотим:

Теперь нам надо добавить физику нашему персонажу, для этого в окне Инспектора нажимаем Add Component и выбираем RigidBody2D :

Также необходимо добавить само тело . Добавляем Box Collider 2D и нажимаем на значок:

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

Теперь же необходимо добавить тело земле , чтобы персонаж не проваливался сквозь неё: добавляем TileMap Collider 2D . Можно заметить, что у земли добавились зелёные линии, а если еще лучше присмотреться, то можно заметить, что эти линии находятся между тайлами, а это нам не нужно. Поэтому мы добавляем ещё Composite Collider 2D , а в TileMap Collider 2D ставим галочку у параметра Used By Composite . И о чудо, как теперь всё прекрасно выглядит!

Теперь можно запустить Игровой режим . Но что мы видим! Наша земля падает. Это случилось из-за автодобавления Rigid Body 2D , просто вместо Dynamic ставим Static . Вуа-ля, земля не падает!

Метод Start() исполняется, когда мы запускаем игру, а Update() выполняется каждый кадр .

Давайте проинициализируем переменные fox типа Rigidbody2D и speed типа float :

Теперь нам надо добавить движение нашей Лисе. Для этого в методе Update() (а лучше в FixedUpdate() , т.к. мы взаимодействуем с физическим объектом в скрипте; за уточнение спасибо Василию Курбатову , комментарий которого закреплен под этой статьёй; также уточню, что все взамидойсвтия с физ. объектами, которые будут в следующих уроках следует также добавлять именно в FixedUpdate() ) добавим одну сточку:

Не пугайтесь, сейчас расскажу, что она делает:

  1. fox.velocity - это скорость Лисы, и, как известно, у скорости есть направление, т.е. вектор ( new Vector2() );
  2. Input.GetAxisRaw() - это первый параметр вектора ( X ). Он принимает соответствующие нажатия для передвижения вправо/влево;
  3. *speed - это коэффициент скорости, который можем сами задать в интерфейсе Unity;
  4. fox.velocity.y - это координата Y Лисы.

Таким образом, эта строка создаёт вектор, который начинается на координатах Лисы и который направлен влево/вправо.

Теперь необходимо добавить прыжок . Для этого надо отслеживать нажатие клавиши (например Space ). Чтобы это делать, надо в методе Update() добавить проверку нажатия:

В условии мы проверяем на нажатие Space . Если произошло нажатие, то мы Лисе добавляем вектор, направленный вверх.

Но нам не хватает одной детали: проверки на "опору":

В условии мы добавили grounded , т.е. если мы нажали на Space и Лиса на земле , то только тогда будет прыжок. Сам же Grounded только тогда принимает значение true , когда в радиусе находится слой ground .

Чтобы добавить этот слой в Unity выбираем группу тайлов земли и нажимаем в Инспекторе Layer, Add layer (Добавить Слой):

Дальше создаём дочерний от нашего персонажа пустой игровой объект и переносим его в ноги. Затем возвращаемся к нашему персонажу.

В Ground Check я добавил пустой объект , а в Ground добавил тот слой, который только что создал.

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

В следующем уроке мы добавим анимацию нашему персонажу при движении.

Геометрические шейдеры Unity

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

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

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

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

Предисловие

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

конвейер рендеринга из Vulkan

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

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

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

Как писать геометрические шейдеры Unity

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

Давайте посмотрим на код:

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

Сначала в строке 56 мы создаем объект g2f, который будем использовать для постоянного изменения его полей, а затем добавляем объект в поток.

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

Фрагментный шейдер в шаблоне

Выдавливание пирамид

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

Наглядный пример того, что мы будем делать с каждым треугольником:

геометрические шейдеры Unity, выдавливание пирамид из треугольников

Посмотрим на код:

Перед геометрическим шейдером

Геометрический шейдер

Вот где на этот раз творится волшебство! Во-первых, вы можете заметить, что в строке 12 я упоминаю в качестве максимального количества для вывода в этом шейдере 12 вершин. Однако вы можете подумать, что это неправильно, поскольку мы добавляем только одну дополнительную вершину наверху пирамиды. По крайней мере, меня это изначально смутило. Но дело в том, что раз мы добавляем новые треугольники, нам придется добавлять каждую новую вершину, которая образует новый треугольник. Поэтому, поскольку мы добавим новый треугольник для каждого ребра, у нас будет 3 новых треугольника из 3 вершин в каждом, плюс исходный треугольник сетки с еще 3 вершинами. То есть 3 * 3 + 3 = 12 новых вершин. Видите, как это число может быстро выйти из-под контроля?

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

Затем я перехожу к созданию пирамид. Алгоритм выглядит так:

Для каждой из точек треугольника

Именно это происходит в первом цикле for. В строке 69 я получаю индекс следующей точки, увеличивая i на единицу и используя модуль 3, чтобы не выходить за пределы диапазона массива. Затем в строках 71-75 я добавляю новую вершину точно так же, как в примере выше, только в этот раз я еще установил для нее значение цвета черным (в строке 74).

Затем в строках 83-87 я делаю то же самое для следующей точки, также окрашивая ее в черный цвет.

Так как здесь мы фактически добавляем новый треугольник в каждый цикл, я добавил triStream.RestartStrip (); в конце цикла.

Наконец, после цикла в строках 92-99 я добавляю вершины исходного треугольника, также окрашивая его в черный цвет. И все готово:

результат

Фрагментный шейдер

Заключение

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

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

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





Так что же такое Bolt? А главное – зачем и кому может пригодится?

Зачем же тогда Unity создали этот инструмент?

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

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

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

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

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

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


Эксперт в медицинских тренажерах VR на Unity, физических симуляциях и сетевых играх.

Что такое Unity

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

Наглядный пример игры, созданной на Unity, которая поддерживает разные устройства, — Genshin Impact, успешный мультиплатформенный проект китайской студии miHoYo Limited. Более популярной стала ее мобильная версия, но пользователи могут войти в аккаунт, например, с компьютера и продолжить играть с того же момента, на котором остановились в мобильной версии. Кроме Genshin Impact, на Unity созданы такие известные проекты, как Hearthstone, Outlast, Cuphead, Pokemon GO и многие другие.

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

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

Посмотрите также: Как установить Unity

Как создать простую игру

При создании собственного проекта важно помнить, что разработка кода — это примерно 20% игры; гораздо большее значение в ней имеют другие аспекты:

Разработчик игр на Unity

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

Русского языка в настройках нет, так что придется совершенствовать технический английский. Всего Unity занимает 11,3 Гб,поэтому перед установкой лучше проверить свободное место на диске и почистить его при необходимости.

Следующий шаг — создание Unity ID. Можно регистрироваться с помощью почты или использовать предложенные аккаунты, например Google, Facebook или Apple. Важно поставить первые две галочки: согласие с условиями использования Unity и признание политики конфиденциальности. Третья галочка — это согласие на маркетинговые рассылки, ее ставить не обязательно.

После регистрации Unity предложит создать тестовый проект Microgame. На выбор предлагается пять шаблонов:

  • LEGO Microgame;
  • шутер от первого лица;
  • картинг;
  • платформер;
  • пустой 3D-шаблон.

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

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

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

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

Настройка интерфейса

В стандартном интерфейсе проекта шесть элементов рабочей области:

  1. Верхняя панель инструментов— в ней находятся стандартные вкладки File, Edit, Help, как во многих других интерфейсах, а также вкладки Assets, GameObject, Components и Window.
  2. Scene — окно сцены, в котором выстраивается игровое пространство (элементы игрового мира, текстуры, фигурки персонажей и прочее).
  3. Games — это окно игры, в котором можно посмотреть глазами пользователя, как будут двигаться элементы и работать игровые механики.
  4. Hierarchy — окно иерархии, в нем перечислен список всех элементов (GameObject), которые помещены в окно Scene.
  5. Project — это система папок, в которых хранятся ассеты по категориям (текстуры, шрифты, звуки и т.д.).
  6. Inspector — окно для изменения элементов игры, их размера, цвета, положения в пространстве и других характеристик.


Добавление объекта

Объекты на экран Scene можно добавить из Asset Store. Для этого на панели инструментов нужно кликнуть на вкладку Window –> General –> Asset Store.

В строке поиска можно по названиям найти нужные компоненты, например, сет Free Platform Game Assets.

Как и другие ассеты, он загружается с помощью кнопки Import.

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

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

Шаг 2. Перенести в область Scene

Работа со скриптами

За поведение игровых объектов отвечают присоединенные к ним компоненты (Components). Базовый компонент любого объекта — Transform, он отвечает за положение элемента в окне Scene, возможность поворачивать и масштабировать его. К базовому компоненту можно добавить, например, Renderer, который меняет цвет, или RigidBody, который отвечает за массу и физику объекта. Но кроме базовых компонентов, объектам можно задавать особые условия, и для этого как раз используются скрипты.

Базовые элементы скриптов — это:

  • using — элемент в коде, который подключает библиотеки;
  • public class — в этой строке обычно прописан класс MonoBehaviour, он содержит набор функций, необходимых для работы скрипта;
  • void — те самые функции, с их помощью прописываются действия, происходящие в игре.

Рассмотрим, например, функцию start. Любое действие в ней произойдет только один раз, когда запустится игра. Пропишем здесь print (“Hi”).

И можно заметить, что в консоли это слово выводится один раз.

Функция update — повторяющаяся, ее можно использовать, например, для передвижения объекта. Для этого в скрипте задается переменная int i = 0, она выводится на экран с помощью функции print (i) и увеличивается на одну единицу за каждый шаг с помощью i++.

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

Настройка триггеров

Для понимания сути триггеров важно усвоить, что такое коллайдер (Collider). Это компонент, который присваивается объекту в пространстве игры, задает форму и делает его твердым, недоступным для прохождения сквозь него. Например, если мы разместим монетку в 2D-пространстве и захотим сделать так, чтобы она упала на платформу, то без использования компонента Collider ничего не получится — монетка пролетит сквозь платформу.

Поэтому обоим объектам необходимо присвоить компонент Box Collider 2D — это тонкая зеленая линия, которая обводит элементы по контуру, и за счет этой рамки они становятся твердыми, то есть один не может пройти сквозь другой.

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

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

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

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

  • OnTriggerEnter — объект зашел в зону;
  • OnTriggerStay — объект находится в зоне;
  • OnTriggerExit — объект покинул зону.

Что дальше?

Разработчик игр на Unity

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

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