Как сделать объект в юнити твердым
Некоторые игры имеют постоянное количество объектов на сцене, однако обычно персонажи, пули, сокровища и другие объекты создаются и удаляются во время игры. В Unity, игровой объект (GameObject) может быть создан через функцию Instantiate, которая делает копию существующего объекта. Объект, который мы будем клонировать, должен быть prefab’ом и сохранен в папке Resources.
Сейчас ты напишешь пару скриптов, с помощью которых можно научиться создавать (spawn’инть) игровые объекты, например, для того, чтобы реализовать механику вот такой ловушки:
Подготовка
Тебе понадобятся четыре игровых объекта и скрипт, с которым ты уже знаком:
- Камень, несколько копий которого мы будем сбрасывать на Игрока — Stone.
- Объект, который соответствует еще не сработавшей ловушке — TrapOn.
- Объект, который соответствует уже сработавшей ловушке — TrapOff.
- Объект, который будет запускать ловушку — TrapSwitch.
- Скрипт OnTriggerSceneLoader.7z — он будет перезагружать уровень, когда Stone упадет (коснется) Игрока.
Stone
По нашему плану нам понадобятся камни, которые будут создаваться над головой Игрока. Выбери 3D-модель, которая тебе понравилась, добавь ей компоненты Rigidbody и два коллайдера: Capsule и Box. Box коллайдер должен быть чуть больше, чем Capsule, а также иметь включенным свойство Trigger.
После этого добавь этому игровому объекту скрипт OnTriggerSceneLoader и укажи в его свойствах название текущей сцены (а еще не забудь добавить ее в Build Settings).
Не забудь сохранить объект Stone, как prefab, в папке Resources!
Программирование
Тебе понадобятся два новых скрипта, чтобы все работало как нужно: Spawner.cs и TrapSwitch.cs
Spawner
Как мы уже говорили, в Unity есть функция Instantiate, которая делает копию существующего объекта:
В нашем случаем наш объект будет физическим, так что ты можешь сразу объявить Rigidbody, также понадобится переменная, в которой ты будешь указывать необходимое количество клонов:
Теперь нужно написать публичный метод, который ты будешь вызывать скриптом TrapSwitch.cs, стандартные методы Update() и Start() нам не понадобятся, так что их можно удалить:
Чтобы выполнить функцию Instantiate несколько раз, используй цикл, например, do while:
Технически, скрипт готов, но, если оставить все как есть, то во время выполнения метода Spawn(), практически, одновременно в одной точке появятся все amount (число) клоны. Из-за того, что наши клоны содержат в себе компоненты Rigidbody и коллайдер, клоны просто разлетятся в разные стороны, что выглядит не очень. При этом, шанс, что хотя бы один клон-камень попадет в Игрока будет очень низок. Поэтому добавь немного рандома и сделай так, чтобы каждый следующий камень создавался выше предыдущего на i:
Теперь все работает как нужно. Продолжим.
TrapSwitch
TrapSwitch будет размещен на объекте с триггером, когда Игрок будет его касаться, TrapSwitch будет запускать метод Spawn() у объекта Spawner. Напомним про коллайдеры и триггеры:
Триггер — это зона срабатывания определенных действий, когда объект входит в эту зону, находится в ней или выходит за ее пределы.
Сейчас тебе понадобиться метод OnTriggerEnter. Он выполняется, когда объект только вошел в зону триггера один раз. Создай такой скрипт:
Ты собираешься взаимодействовать с двумя игровыми объектами и объектом Spawner. Их нужно объявить:
Теперь необходимо убедиться, что объект, который войдет в триггер является Игроком. Это можно сделать, используя тег, как в OnTriggerSceneLoader:
Теперь последовательно напиши все необходимые команды внутрь условия: удаление (уничтожение) объекта TrapOn, включение объекта TrapOff, выполнение метода Spawn() и удаление (уничтожения) себя.
Все скрипты написаны. Поздравляем! Осталось правильно разместить все объекты на сцене и не забыть указать им друг на друга.
В интернетах большое количество статей об интерфейсе и возможностях Unity. Пора и нам рассказать вам о том, насколько просто работать с основными объектами в сцене.
Рассматриваемые темы в статье
- Камеры
- Многоугольники, ребра, вершины и меши
- Материалы, текстуры, и шейдеры
- Физика твердых тел
- Столкновение (Collision)
- Идея Unity
- Путь падавана Unity
- Ассеты
- Игровой объект
- Компоненты
- Сценарии
- Шаблоны игрового проекта
Игровая сцена в разметке объектов Unity
Прим. Данные трактовки названий являются свободным переводом английских наименований в интерфейсе Unity. Если вам это не нравится или вы используете свою терминологию (или еще хуже неологизмы вроде "колижены" или "геймобджекты") - это ваши проблемы :)
Камеры
Камеры существуют в трехмерном мире, поскольку они являются портами вывода (View port) результирующего изображения на экран. Камеры могут быть расположены в любой точке игрового мира Unity, имеют поле зрения (FOV), которое представляет собой форму пирамиды. Они имеют много различных свойств и могут быть заскриптованы и вписываться в необходимый сценарий вашей игры.
С изменением параметра поля зрения (FOV) трехмерной камеры - меняется и порт вывода (view port).
В игровом движке вы можете заметить, что такие эффекты, как освещение, тени и пост эффекты применяются к камере. Чтобы помочь движку с моделированием реалистичного изображения, вы можете добавить несколько дополнительных кинематографических эффектов, такие как вспышки линзы при взгляде на солнце.
Большинство современных трехмерных игр использует сразу несколько камер, чтобы показать различные части мира игры, но действующей камерой является только одна. Unity позволяет с легкостью добавлять много камер на сцене, которые можно заранее подготовить и переключить, при необходимости, на главную в любой момент времени. Переключение между камерами можно использовать не только для смены вида игрового мира, но и для оптимизации. Например, объекты игровой сцены могут быть сгруппированы в различных слоях, и камерам можно назначить видимые слои.
Многоугольники, ребра, вершины, и меши
При построении трехмерных фигур все объекты в конечном счете составляются из связки обычных двухмерных форм, известных как многоугольники. При импорте моделей из среды моделирования в Unity, все многоугольники преобразуются в треугольники, они же полигоны. В свою очередь треугольник состоит из трех вершин, связанных ребрами. Зная эти вершины, движок игры в состоянии производить вычисления точек столкновений, используя сложный алгоритм обнаружения с коллайдером Меша. Такие вычисления позволяют точно определить местоположения пересечения, например точка попадания пули в контексте разработки шутера.
Комбинируя множество связанных между собой полигонов, используя трехмерное моделирование, позволяют Вам строить сложные формы, известные, как Меши (Mesh).
Во время разработки игры, разработчику крайне важно понимать важность количества отображаемых полигонов на экране. Чем выше число полигонов, тем больше работы требуется проделать компьютеру, прежде чем вывести все необходимые объекты на экран. Это именно то, что мы могли наблюдать в прошедшие пару десятков лет - увеличения уровня детализации от ранних трехмерных игр до сегодняшнего дня. Просто сравните визуальное оформление таких игр, как ХХХ (199*) и YYYY (200*) и ZZZZ (201*). Это происходит в результате появления более производительного оборудования, и теперь разработчики могут позволить размещать на экране более высокополигональные модели и эта тенденция будет неизбежно продолжаться. Но, всегда помните, что оптимизацией не стоит пренебрегать.
Материалы, текстуры, и шейдеры
Материалы (Materials) - общее понятие ко всем трехмерным формам, поскольку они дают возможность настроить визуальных характеристики трехмерной модели. От основных цветов до карты отражения, содержащей информацию об окружающих объектов. Материал работает с шейдером (Shader), который является сценарием, который отвечает за способ отрисовки того или иного объекта, на который он был применен.
В Unity очень легко использовать систему материалов. Любые материалы, созданные в пакете трехмерного моделирования, будут импортированы и обновлены движком автоматически и будут также созданы как ассеты (Assets), чтобы их можно было использовать позже. Вы можете с такой же простотой создавать свои собственные материалы, назначая изображения как файлы необходимые текстуры для материала и выбирая шейдер из большой встроенной библиотеки. Вы также можете написать свои собственные шейдеры, или использовать шейдеры, написанные другими разработчиками сообщества Unity.
Создавая текстуры для игры в графическом пакете, такие как Photoshop, вы должны знать о допустимых разрешениях, которые поддерживает игровой движок Unity. Текстуры, должны быть квадратными и размер стороны, должен являться степенью двойки. Например:
Создавая текстуры этих размеров будет означать, что они могут быть успешно наложены на модель без потери качества. Вы также должны знать, что чем больший файл текстуры вы будете использовать, тем больше потребуется времени и памяти для её обработки во время отрисовки, как следствие это повысит требования к компьютеру игрока. Поэтому, всегда пытайтесь прийти к наименьшему размеру текстуры, не сильно жертвуя качеством.
Физика твердых тел
Внутри игрового движка, встроен физический движок (Physics Engine), который позволяет промоделировать взаимодействие объектов между собой по основным физическим законам реального мира. В Unity используется Nvidia PhysX, самый популярный и весьма точный коммерческий физический движок.
В движке игры не каждый объект моделируется, как физический объект. Во-первых, потому что это требует большой обработки данных, и во-вторых, потому что это просто не имеет смысла. Например, в трехмерной игре, имеет смысл сделать объект "Автомобиль" настроить, как физический объект, но для окружающий объектов, таких, как деревья, стены и т.д. - это не имеет смысла, т.к. они являются статическими объектами на сцене. Поэтому, разрабатывая игру, добавляйте компонент Твердого тела (Rigidbody, не путать с Rigidbody 2D), только тем объектам, которые вы хотите отдать под контроль физического движка.
Физический движок для игр использует Динамику) для моделирования твердого тела, создавая реалистичное движение. Это означает, что вместо статичных объектов трехмерного мира, будут динамическое объекты, имеющие следующие дополнительные свойства:
В настоящее время, при высокой производительности оборудования, физика твердого тела широко применяется в большинстве игр и является основным атрибутом, поскольку это привносит в игру различное и реалистичное поведение для игровых объектов.
Обнаружение столкновения
Например, в игре боулинга с десятью кеглями имеется, шар, который может быть окружен с помощью сферического коллайдера, в то время, как сами кегли будут иметь либо простой коллайдер в форме капсулы или параллелепипеда, или более сложный коллайдер - коллайдер меша (о котором говорилось ранее). При воздействии на коллайдеры любого затронутого объекта, сообщается физическому движку, который промоделирует процесс столкновения, основываясь на настройках столкнувшихся объектов и других факторах окружающего мира.
В примере с боулингом, использование коллайдера меша для кегли является более правильным решением, это позволит более точно промоделировать столкновения, потому что форма сетки столкновений будет полностью соответствовать форме модели, но такой тип коллайдера является более дорогим в обработке столкновений. Это означает, что потребуется больше мощности от компьютера для обработки столкновения. Об этом стоит помнить всегда и искать золотую середину между стандартными примитивными формами коллайдера и коллайдером меша.
Идея Unity
Unity делает процесс разработки игры простым, давая Ваш ряд логических шагов, чтобы построить любой мыслимый сценарий игры. Чтобы ваша игра не была привязана к определенному жанру, Unity предлагает Вам чистый холст и ряд простых последовательных процедур, чтобы позволить Вашему воображению творить и раскрывать Ваш творческий потенциал. Вы в состоянии в процессе игры, изменить её часть, вы можете превратить обычный статический объект в вашей игре в управляемый, который будет состоять из многих отдельных составных частей. Вы в состоянии расширять свою игру в логично-прогрессивной манере. В свою очередь, каждая составная часть объекта имеет свои настройки и парамеры, которые позволяют управлять поведением объекта. Вы можете их регулировать, и тем самым у вас есть полный контроль над полученным результатом.
Давайте рассмотрим простой пример.
Путь падавана Unity
Если бы я хотел добавить в игру живой шар, то я начал бы со сферы. Это можно быстро и легко сделать с помощью меню Unity, это даст Ваш новый игровой объект с мешем сферы, и компонент Renderer, чтобы сделать этот объект видимым на экране. Также я могу добавить на мою сферу компонент твердого тела (Rigidbody). Это скажет Unity, что к данному объекту необходимо применить физический движок. С этим компонентом приходят такие настройки, как масса, сила тяжести, способы применения силы к объекту, коэффициенты трения и т.д.
Более того я хотел бы добавить небольшую плоскость и разместить её ниже уже созданного шара. Это делается также просто, как и создание шара - с помощью меню Unity. Если мы запустим игру, то увидим, что шар просто упадет плашмя на плоскость. Но, что, если я хочу, чтобы он повел себя, как обычный футбольный шар, который бы еще и подпрыгнул? Это просто! У компонента коллайдера (Collider) есть свойство, которое позволяет задать физический материал (Physics Material). Это свойство позволяет настраивать поведение объекта при столкновении с определенными поверхностями других объектов. Здесь мы можем выбрать уже существующие материалы, в данному случае нам подойдет - !!упругий". При повторном запуске, когда шар упадет на плоскость, он отскочит.
В итоге, простая сцена готова за пару щелчков мыши!
Такой подход является самым основном, во время разработки игры в Unity. Сперва все начинается с простых элементов и затем они постепенно обзаводятся дополнительными компонентами, или становятся часть составных. Разбивание сложной задачи на мелкие и последовательное их решение - вот основное правило разработки Unity.
Ассеты
Ассеты (Assets) - это стандартные блоки всех проектов Unity. От графики в форме файлов изображений до трехмерных моделей и звуковых файлов. Unity обращается к этим файлам, которые вы будете использовать во время создания игры, как ассеты. Это как раз та причина, почему в любой папке проекта Unity, все используемые файлы хранятся в основной папке "Assets"
Сцены
Во время разработки вашей игры в Unity, Вы должны думать о сценах, как об отдельных уровнях, или областях содержания игры (например, меню игры). Разрабатывая игру со множеством сцен, вы сможете контролировать и распределить время загрузки уровня, а так же сможете проверить различные части вашей игры отдельно друг от друга.
Игровые объекты (Game Objects)
Когда ассет используется на сцене игры, то он становится игровым объектом (Game Object). Все игровые объекты содержат по крайней мере один компонент для старта - компонент Transform. Данный компонент, позволяет движку игры управлять положением объекта в игровом мире, он указывает координаты позиционирования, вращения и масштабирования объекта для каждой из существующей в игре оси - X, Y, Z. Так же, вы можете передать это объект в параметры какого-либо скрипта и там управлять им, например установив ему необходимую позицию, угол вращения, или масштаб. От этого базового объекта вы сможете в дальнейшем с легкостью переходить к другим его компонентами. Вы так же в праве добавлять новые компоненты на игровой объект, добавляя необходимые функциональные возможности, чтобы воспроизводить сценарий игры, который Вы только можете вообразить.
Компоненты (Components)
Компоненты (Components) могут быть разных видов. Они могут быть сделаны для того, чтобы расширять поведение объекта, определять его, или влиять на другие аспекты функций объекта в игре. Прикрепляя компонент к объекту, Вы сможете немедленно применить новые части игрового движка к Вашему объекту.
Общие компоненты разработки игры уже реализованы, как встроенные в Unity, такие как компонент твердого тела (Rigidbody), освещение (Light), камеры (Camera), генераторы частиц (Particles Emitters), примитивные объекты (Primitives) и т.д. Для того, чтобы все это оживить необходимо разрабатывать сценарии (Scripts), которые также являются компонентами объектов в Unity.
Сценарии (Scripts)
Сценарии (Scripts) - это компоненты Unity, и основная часть разработки игры и поэтому заслуживают, отдельного ключевого понятия. Unity предлагает на выбор три разных языка программирования для разработки скриптов:
Unity не требует, чтобы Вы изучали программирование самого движка игры или способы его модификации. Вы будете использовать встроенный Scripting API в каждом вашем сценарии. Прелесть использования Unity Scripting состоит в том, что любой сценарий, который Вы пишите для своей игры, будет достаточно простым, потому что у Unity есть множество встроенных классов, которые позволяют упростить написание сценариев. Так же, одним из ключевых особенностей Unity является горячая замена кода, вы можете внести изменения в один файл сценария и они сразу же отразятся на результат в редакторе Unity.
Для написания сценариев возможно использовать любой текстовый редактор, но лучше использовать специальную среду разработки. Во время установки Unity предлагает сразу же установить такую среду - MonoDevelop, но вы вправе и использовать такие вещи, как Visual Studio, VSCode или Sublime. Использование специального обеспечения для написания сценариев упростить Вам процесс разработки, в данные среды входят такие замечательные вещи, как автоматическая проверка синтаксиса, авто-завершение и подсказки по существующим функциям. По умолчанию, Unity будет пытаться использовать MonoDevelop, но Вы сможете изменить это в настройках Unity.
Шаблон игрового объекта (Prefab)
Использование игрового движка Unity крутится вокруг использования различных игровых объектов (GameObject), размещенных в игровом мире. Unity предоставляет возможность хранить такие объекты со всеми их свойствами как ассеты (Assets) проекта, которые Вы сможете повторно использовать в различных частях Вашей игры. Вы сможете изменить параметры и компоненты игрового объекта, основанного на шаблоне, индивидуально.
Рассмотрим "Ящик" в качестве примера. Допустим, что Вы настроили вес вашего объекта, написали скрипт поведения для её разрушения и наверняка, Вы, захотите использовать этот объект в игре ни один раз. Шаблоны (Prefab) позволяют Вам хранить объект в полной комплектации, со всеми компонентами и текущими конфигурациями. Они сопоставимы понятию MovieClip в Adobe Flash, думайте о шаблонах (prefabs) просто как о пустых контейнерах, которые вы можете заполнять объектами, чтобы сформировать набор данных, который Вы вероятно переработаете, и все эти изменения отразятся на объектах сцены, основанных на этом шаблоне.
На этом основная вводная в понятия Unity заканчивается. Оставляйте ваши вопросы в комментариях.
Буду рад конструктивной критике.
Создание разрушаемого стекла в Blender
Заходим в Blender, выделяем куб и начинаем делать форму стекла. Для этого нажмите S и X,Y или Z, чтобы масштабировать по одной из осей. Должно получиться что-то подобное.
Текстурированием и созданием материалов мы займемся позже. Сейчас мы должны сохранить модель в формате FBX.
Вернемся к Блендеру, откроем панель инструментов (слева), нажав горячую клавишу T. Слева есть несколько вкладок: Tool, Create, Relations, Animation, Physics, Grease Pencil. Перед тем, как использовать Cell Fracture, нам нужно создать эффект пробития стекла пулей. Для этого нам нужен Grease Pencil. Заходим в эту вкладку, ставим галочку Continuous Drawing, в Data Source выбираем Object, в Stroke Placement > Surface. Затем нажимаем Draw. Если что-то не понятно, то выделите так, как на этом скриншоте.
Теперь нам нужно нарисовать два круга, как на скриншоте ниже.
Теперь можно приступить к разбитию стекла. Заходим в Cell Fracture (Tool > Cell Fracture). В открывшемся меню мы видим огромное количество функций, но мы будем работать только с теми, что выделены на фото ниже.
Source Limit отвечает за количество деталей, на которые мы разобьем модель. Noise - рандомизатор разрушений, от нуля до единицы. Material отвечает за то, какой материал будет в разрушенной модели, то есть в тех местах, где будет разлом. По умолчанию стоит 0, то есть тот материал, который вы сейчас используете. Если параметр Margin стоит не равный нулю, то в конечной модели у нас будут щели, поэтому выставляем Margin=0. В окне сцен рекомендуется поставить галочку в Next Layer, чтобы разрушенная модель была на новом слое. В итоге мы должны получить вот такие значения: Source Limit=50, Noise=0,25, Material=0, Margin=0,0 и самое главное - Grease Pencil.
Теперь жмем OK и дожидаемся конечного результата.
На этом этапе мы получили разрушенную модель, теперь нам нужно экспортировать ее в Unity 5. Также, как и в первый раз, заходим в File > Export > FBX.
Открываем Unity, создаем новый проект или открываем старый. Импортируем модели в Юнити, перенося их в папку Assets.
Настраиваем сцену в Unity
Сейчас мы должны настроить нашу сцену. Выделяем нашу модель, в окне Inspector добавляем Box Collider и Rigidbody. Также создаем материал, называем как вам угодно, пусть будет GlassMat. На фото ниже отмечены те настройки, которые нам понадобятся для создания прозрачного стекла.
Поменяем Rendering Mode на Transparent, Metallic=0,3, Smoothness=0,8. Нажмите на выбор цвета и поставьте такие значения: R=214, G=250, B=256, A=50. Последний параметр отвечает за прозрачность объекта, можете выставить больше или меньше, как вы считаете нужным. Должен получиться материал, похожий на этот:
На сцене для примера мы должны поставить 3 одинаковых целых стекла, над ними 3 сферы, на каждой должен висеть Rigidbody и SphereCollider. Данные три сферы будут разбивать наши стекла. Можно, конечно, добавить что-то другое, но смысл будет один и тот же. Перейдем к разрушенной модели. Модель состоит из множества осколков, которые не имеют не коллайдеров, ни Rigidbody. Выделив все части, добавим RigidBody и MeshCollider в окне Inspector. Теперь все готово к тесту.
Скрипт разбивания в Unity 5
Код можно будет скачать с GoogleDrive здесь, изучите его сами, мы расскажем вам только то, как им нужно пользоваться.
Скрипт содержит несколько переменных: Broken Prefabs, Collision Sounds, Breaking Sounds, Apply Collision Forcem Apply Hp, Max Hp, Current Hp, Apply Explosion Force и т.д. В Broken Prefabs можно вставить несколько сломанных версий, выбираться будут рандомно. Со звуками также, можно выбрать несколько. Обязательно ставим Apply Collision Force, Collision Force=1, можно добавить жизни объекту и так далее. Очень интересными будут последние переменные: Explosion Force и Radius. Можно поэкспериментировать с ними. Вот результат, который должен у нас получиться:
Редакция Devgam
Благодарим наших читателей и подписчиков за проявленный интерес. Поделитесь постом в социальных сетях.
В этой статье разберем как работать с группой физических объектов, рассчитывать и придавать им ускорение в разных направлениях.
В результате попробуем создать, что то похожее на взрывающихся ящиков, где на сцене, нажимая на любой физический объект он взрывается разбрасывая другие объекты которые находятся рядом.
Для начала подготовим сцену, добавим поверхности, стены и сам физический объект в виде ящика. Также добавляем ящику коллайдер BoxCollider2D и компонент Rigidbody2D .
Создаем новый скрипт Box , добавляем в него float переменную explodeForce, в которой будет указана сила взрыва ящика.
Далее запишем новый метод Explode, где будет происходить сам взрыв ящика. Этот метод ( Explode ) будет вызываться через нажатие на ящик.
- publicclass Box : MonoBehaviour
- [ Range ( 0 , 1000 )]
- publicfloat explodeForce = 100 ;
- publicvoid Explode ()
- >
- >
Сохраняем этот скрипт и возвращаемся в редактор. Чтобы не писать целый отдельный обработчик нажатий мыши по ящику, воспользуемся уже готовым инструментом под названием Physics 2D Raycaster . Этот компонент позволяет обрабатывать нажатия на физические объекты, что находятся на сцене. Добавим камере этот новый компонент ( Physics 2D Raycaster ).
и дополнительно создаем новый объект EventSystem , без которого обработчик нажатий ( Physics 2D Raycaster ) не сможет работать.
Теперь мы можем отловить любые действия мыши над любым физическим объектом, для этого достаточно добавить этому объекту компоненте Event Trigger и выбрать нужное действие.
Так и сделаем – выбираем ящик, добавляем новый компонент Event Trigger
после чего выбираем действие, нажав кнопку Add New Event Type .
Для обработки нажатия можно выбрать событие PointerClick и добавить нужное действие, в нашем случае это действие взрыва Explode .
Возвращаемся в скрипт Box и теперь поработаем над физикой взрыва.
Задача заключается в следующем: при нажатии на ящик, первым делом необходимо выполнить сбор всех рядом стоящих ящиков, и в зависимости от расстояния от взрыва, раскидать их в разных направлениях.
Теперь разобьем эту задачу на части:
- Получить список всех ящиков на сцене вокруг взрыва.
- Рассчитать расстояние и силу взрыва для каждого ящика отдельно.
- Приложить рассчитанную силу и направление движения для каждого отдельного ящика с помощью компонента Rigidbody2D .
- Уничтожить разорвавшийся ящик.
Для начала в методе Awake скрипта Box получим компонент Rigidbody2D самого ящика.
- publicclass Box : MonoBehaviour
- [ Range ( 0 , 1000 )]
- publicfloat explodeForce = 100 ;
- private Rigidbody2D body ;
- privatevoid Awake ()
- this . body = GetComponent Rigidbody2D >();
- >
- publicvoid Explode ()
- >
- >
Переходим к первому пункту задачи – необходимо получить список всех ящиков, стоящих рядом. Для этого воспользуемся специальным статическим методом OverlapCircleAll класса Physics2D , который вернет все коллайдеры, что находятся рядом.
- private Rigidbody2D body ;
- publicvoid Explode ()
- Vector2 position = this . body . position ;
- Collider2D [] colliders = Physics2D . OverlapCircleAll ( position, 3 );
- >
Для примера, попробуем найти все объекты в радиусе 3 ед . от взрыва. Теперь с помощью цикла переберем все объекты из полученного списка colliders .
- private Rigidbody2D body ;
- publicvoid Explode ()
- Vector2 position = this . body . position ;
- Collider2D [] colliders = Physics2D . OverlapCircleAll ( position, 3 );
- foreach ( Collider2D collider in colliders )
- Rigidbody2D other = collider . attachedRigidbody ;
- >
- >
Сперва необходимо уточнить, есть ли у выбранного объекта компонент Rigidbody2D , чтобы его получить у компонента Collider2D есть свойство attachedRigidbody .
- publicvoid Explode ()
- Vector2 position = this . body . position ;
- Collider2D [] colliders = Physics2D . OverlapCircleAll ( position, 3 );
- foreach ( Collider2D collider in colliders )
- Rigidbody2D other = collider . attachedRigidbody ;
- if ( other != null && other != this . body )
- >
- >
- >
Здесь мы выполняем даже две проверки: первая проверка на существование объекта Rigidbody2D , а вторая сравнивает, не является ли выбранный объект тем самым ящиком, который мы хотим взорвать. Переходим к следующему пункту задачи – рассчитываем силу и направления толчка. Чтобы вычислить направление от взрыва необходимо найти разность между позициями ящика и точкой взрыва.
- publicvoid Explode ()
- Vector2 position = this . body . position ;
- Collider2D [] colliders = Physics2D . OverlapCircleAll ( position, 3 );
- foreach ( Collider2D collider in colliders )
- Rigidbody2D other = collider . attachedRigidbody ;
- if ( other != null && other != this . body )
- Vector2 direction = ( other . position – position ). normalized ;
- >
- >
- >
В переменную direction записываем направление движения ящика от взрыва. Далее необходимо рассчитать дальность нахождения ящика от центра взрыва, так как в зависимости от расстояния будет меняться и сила толчка.
- publicvoid Explode ()
- Vector2 position = this . body . position ;
- Collider2D [] colliders = Physics2D . OverlapCircleAll ( position, 3 );
- foreach ( Collider2D collider in colliders )
- Rigidbody2D other = collider . attachedRigidbody ;
- if ( other != null && other != this . body )
- Vector2 direction = ( other . position – position ). normalized ;
- float distance = ( other . position – position ). sqrMagnitude ;
- >
- >
- >
В переменной distance получаем квадрат расстояние ящика от центра взрыва, после чего можно приступать к расчету силы толчка.
- publicvoid Explode ()
- Vector2 position = this . body . position ;
- Collider2D [] colliders = Physics2D . OverlapCircleAll ( position, 3 );
- foreach ( Collider2D collider in colliders )
- Rigidbody2D other = collider . attachedRigidbody ;
- if ( other != null && other != this . body )
- Vector2 direction = ( other . position – position ). normalized ;
- float distance = ( other . position – position ). sqrMagnitude ;
- Vector2 force = direction * this . explodeForce * this . body . mass / distance ;
- >
- >
- >
Для получения силы взрыва сперва умножаем направление толчка direction на силу взрыва explodeForce , далее умножаем полученное значение на массу объекта, ведь чем больше масса объекта тем сильнее взрыв, после чего делим все полученное значение на квадрат расстояния distance , так как чем дальше объект тем слабее сила взрыва.
Теперь можно приложить полученную силу толчка к ящику, но просто вызвать метод AddForce у компонента Rigidbody2D будет недостаточно, так как данный метод прикладывает силу к центру объекта, а нам необходимо, чтобы толчок происходил из центра взрыва.
Для того, чтобы приложить силу к физическому объекту относительно его положения на сцене воспользуемся методом AddForceAtPosition компонента Rigidbody2D .
- publicvoid Explode ()
- Vector2 position = this . body . position ;
- Collider2D [] colliders = Physics2D . OverlapCircleAll ( position, 3 );
- foreach ( Collider2D collider in colliders )
- Rigidbody2D other = collider . attachedRigidbody ;
- if ( other != null && other != this . body )
- Vector2 direction = ( other . position – position ). normalized ;
- float distance = ( other . position – position ). sqrMagnitude ;
- Vector2 force = direction * this . explodeForce * this . body . mass / distance ;
- other . AddForceAtPosition ( position, force, ForceMode2D . Impulse );
- >
- >
- >
В предпоследнем пункте задачи, в метод AddForceAtPosition необходимо передать точку из которой будет совершен толчок, для этого воспользуемся переменной position, где находится позиция взрыва, далее задаем саму силу толчка force и тип толчка в виде резкого импульса.
После чего завершаем выполнение задачи и удаляем со сцены взорвавшийся ящик.
- publicvoid Explode ()
- Vector2 position = this . body . position ;
- Collider2D [] colliders = Physics2D . OverlapCircleAll ( position, 3 );
- foreach ( Collider2D collider in colliders )
- Rigidbody2D other = collider . attachedRigidbody ;
- if ( other != null && other != this . body )
- Vector2 direction = ( other . position – position ). normalized ;
- float distance = ( other . position – position ). sqrMagnitude ;
- Vector2 force = direction * this . explodeForce * this . body . mass / distance ;
- other . AddForceAtPosition ( position, force, ForceMode2D . Impulse );
- >
- >
- Destroy ( this . gameObject );
- >
Сохраняем скрипт Box и переходим к тестированию.
Добавляем еще несколько ящиков на сцену.
Чтобы взрывы выглядели более эффектней можно добавить подготовить небольшую анимацию взрыва и добавить ее на сцену.
Заключение
В unity для физических объектов есть свои материалы, это не те материалы, в которых используются текстуры и шейдеры, а специальные физические материалы, где указываются параметры скольжения и упругости. Эти физические материалы помогают настраивать взаимодействие коллайдеров между объектами, заставляя их отпрыгивать от поверхностей или скользить по ним.
Читайте также: