Unity Collision 2D and 3D: Super Simple Guide
Collision detection is required for all types of games. Detecting and utilizing the collision is implemented in a different manner in different game engines. Unity Collision works based on the collider component that can be added to any Gameobject. Also, you need to understand how colliders and Rigidbody work together to efficiently use them. Without a basic understanding of how Unity Colliders work, it will be very difficult to code the game mechanics. In this post, we will see how to use colliders in Unity and where to use OnCollisionEnter and OnTriggerEnter functions.
Introduction to Unity Colliders
Unity colliders are very simple to use. Unity has divided the colliders into 2D and 3D. So, you have to be very careful which collider you are using. All your codes and collision detection will change to 2D and 3D. Further, there are types of colliders, static collider, Rigidbody collider, kinematic Rigidbody collider, etc. The collider used in all these are the same, the type is for how the object to which the collider is added behaves when collided with.
Unity Collider Types
Static collider
Static colliders are considered to be non-moving objects by Unity. Do not confuse static Gameobject with the static collider. If a Rigidbody is not attached to a collider then it’s a static collider. They do not move when an object Collides to with them. Though, they can be moved using transform, moving a static collider leads to performance loss during runtime.
Rigidbody collider or Dynamic Collider
A Rigidbody collider works like a real-world object. It is governed by the forces of physics. If you apply force on it, it will move. In Unity, Rigidbody is used on an object which will move a lot during gameplay. Check the screenshot for how a Rigidbody is attached to a game object.
Kinematic Rigidbody collider
A kinematic Rigidbody is a Rigidbody that behaves like a static object. So, the next question is then why use a kinematic Rigidbody. The main reason to use a kinematic Rigidbody is to tell Unity that the object does not respond to forces but will be movable by script during runtime. The performance loss is very less in moving a kinematic Rigidbody compared to a Static object.
Unity Collision Detection 3D
Non-trigger and Trigger collider
In Unity you can mark a collider as trigger using the check box in the inspector window. The behavior of the object changes if it is marked as a trigger.
Unity Colliders not marked as trigger
Unity will detect a collision only if one of the objects is a Rigidbody. That is, if you have two Gameobject marked as static colliders then collision between them will not be detected. It’s the same case with two kinematic Rigidbody. If you use the OnCollisionEnter function in any of the above cases, the function will not be called during a Collision. Find the collision matrix for unity colliders in the image below.

Unity collider marked as Trigger
When you mark a collider as a trigger, it no longer behaves like a solid object. It allows the other object to pass through it. But the time of one object entering another object’s space can trigger a function. With that, you can know if a collision has happened without actually creating a collision. You have to use the OnTriggerEnter function if the collider is Marked as a trigger. The collision matrix is a little different in the case of triggers.

Trigger collision doesn’t work in Unity if both the colliders are static colliders. In all the other cases the OnTriggerEnter is called. Knowing these basic things about colliders will help you set them up easily in your game.
If you did not understand the matrix completely then here is a simple comparison to help you. Consider static colliders as objects that don’t move like walls. Rigidbody collider denotes a moving object like a ball. Kinematic Rigidbody denotes that the object is not moved by physics but can be moved by script or animation.
Unity does not want to detect collision between two static objects so normal collision is detected only if one of the Gameobject is movable by physics. Whereas trigger function works a little differently. It works only if one of the colliders is marked as trigger and can be moved either by physics or script.
Setting Collision Layers in Unity
One you have added your colliders and Rigidbody now it’s time to set the layers. Unity gives you control to decide which layers collide with each other.
This setting is available in Edit>Project settings> Physics

You can just uncheck the layers that you don’t want to collide. For example, if you don’t want the friend layer to collide with the water layer. Then just uncheck the box in water row of the Friend colomn.
Remember to create all your layers first before editing this setting.
3D collider shapes in Unity

As you can see the parameters of Rigidbody2D are slightly different compared to a regular 3D Rigidbody. You can set the Rigidbody type as Static, Dynamic or Kinematic based on how your Gameobject will behave in your game.
Also, in 3D Rigidbody the physics material needs to be set from the collider but in case of Rigidbody2D, you can set the material from Rigidbopdy2D.
Adding a 2D collider
Select your Gameobject and click on Add Component in the inspector window. Add a 2D collider from the component list.

Use this comparison table and add the required collider.

Functions in Unity Collision 2D
OnCollisionEnter2D
This can be used to detect collision between two colliders that are not set as Trigger and at least one of them has a Rigidbody attached to it.
OnTriggerEnter2D
OnTiggerEnter2D is used to detect collision between 2D collides that are set as a trigger. You need to use this even if one of the Collider is set as Trigger.
Other Unity 2D collider functions
Non-Trigger 2D Collision
- OnCollisionExit2D- Is called when the Collider2D exits a Collision.
- OnCollisionStay2D – Is called when the Collider2D is still colliding with another object.
Trigger 2D Collision
- OnTriggerExit2D- Is called when the Trigger Collider2D exits a Collision.
- OnTriggerStay2D- Is called when the Trigger Collider2D is still colliding with another object.
Sample script for 2D collision detection functions
If you have any other questions regarding Unity collider then leave them in the comment box below.
Урок 13 — Определение столкновений с триггером
В уроке рассказывается, как определить столкновения между невидимыми для игрока объектами, используя неосязаемые «триггер коллайдеры» (trigger colliders).
Если вы хотите определить столкновения, но не ходите, чтоб столкнувшийся объект остановился, вам требуется использовать триггер (trigger)
Триггеры позволяют вам определить, где именно расположен объект на сцене (во время запуска приложения).
На нашей сцене имеется куб («box» с rigidbody), который падает на синюю платформу («platform»).
Естественно платформа останавливает куб, поскольку среди ее компонентов присутствует box collider.
У компонента box collider есть чекбокc Is Trigger. Если включить
его и запустить сцену снова, то куб провалиться через платформу.
Таким образом мы можем создавать столкновения, которые не должны быть видны пользователю. Например, отключим компонент Mesh Renderer у нашей платформы. Мы по прежнему видем зеленый контур объекта, если выделим его в Hierarchy View.
Если мы нажмем play, то куб провалиться через нивидимую платформу, но пока мы не можем ничего узнать о произошедшем.
Создадим скрипт, назовем его Trigger и добавим в тело класса следующий код
// Обнаруживаем столновение с триггером
// myTrigger – коллайдер, который столкнулся
void OnTriggerEnter(Collider myTrigger)
if (myTrigger.gameObject.name == “box”)
Debug.Log(“Box went through!”);
Добавим скрипт к платформе. Теперь, как тольку куб пройдет сквозь платформу, вы увидете сообщение «Box went through!» в консоли.
[Unity] How to Process Trigger and Collision Event

In the process of making games with Unity, we usually need to deal with some collisions of game objects. For example: Get items, Hit the wall… and so on in different situations. At this time, we can OnCollisionEnter() and OnTriggerEnter() to handle collisions and trigger events.
The following record how to write collisions and trigger program, and the different Body Type situations.
Is trigger unity что это
Главная » Введение в скрипты Unity — часть 1
Введение в скрипты Unity — часть 1
Создание скриптов — неотъемлемая часть даже самых простых игр. Эти небольшие наборы кода работают вместе, чтобы делать самые разные вещи.
Версия: C# 7.3, Unity 2019.2, Unity
Создание скриптов — неотъемлемая часть даже самых простых игр. Эти небольшие наборы кода работают вместе, чтобы делать самые разные вещи: от перемещения персонажа по экрану до отслеживания инвентаря. Разработчики игр пишут скрипты в Unity на C#, мощном объектно-ориентированном языке программирования, разработанном Microsoft около 2000 года. С тех пор он стал одним из самых популярных языков программирования. Команда Unity выбрала C# в качестве основного языка программирования Unity, поскольку он хорошо документирован, прост в освоении и гибок.
В основе Unity лежит хорошо документированный API, с которым могут взаимодействовать скрипты. В этом уроке вы создадите простую игру — начав с нескольких моделей и изучив, как использовать наиболее важные части Unity API. Вы узнаете, как создавать скрипты C#, которые:
- Создают переменные, которые можно изменить в редакторе.
- Обнаруживают ввод игрока и реагируют на него.
- Используют физику для создания взаимодействий.
- Изменяют значения с течением времени несколькими способами.
Перед началом убедитесь, что вы соответствуете следующим требованиям:
- На вашем компьютере установлена последняя стабильная версия Unity.
- На вашем компьютере установлена среда разработки скриптов, поддерживающая C#. Я рекомендую Visual Studio Community для Windows и Visual Studio Code для macOS и Linux.
- Вы знаете основы C#. Если вы новичок в программировании, сначала ознакомьтесь с видеокурсом Brian’s Beginning Programming with C#. Если вы хотите сразу же погрузиться в C#, возьмите копию (или загрузите бесплатную версию в формате PDF) Желтой книги по программированию на C#, так я научился использовать C#.
Итак, вы готовы открыть для себя Unity API, создав простую игру!
Приступая к работе
Скачайте материалы для проекта с помощью кнопки «Скачать материалы урока» вверху страницы, распакуйте их куда-нибудь и откройте стартовый проект в Unity.
Для начала обратите внимание на окно Project и разверните папку RW. Этот проект поставляется с набором готовых ассетов, которые вы будете использовать, чтобы вдохнуть жизнь в игру с помощью скриптов:

Чтобы сосредоточиться на написании скриптов, вот включенные папки ресурсов и их содержимое:
- Materials: Единый материал, используемый всеми моделями для оптимальной работы.
- Models: Некоторые модели варьируются от небольших дымовых облаков до больших наземных моделей.
- Music: Фоновая музыка для игры. Песня — Flying Kerfuffle Кевина Маклэода.
- Prefabs: Набор готовых префабов, чтобы упростить внесение изменений в игровых объектов, уже присутствующих в сценах.
- Scenes: Сцены Game и Title.
- Scripts: Пусто! Здесь вы разместите скрипты, которые будете создавать.
- Sounds: Несколько 8-битных звуковых эффектов, созданных с помощью bfxr.
- Sprites: Здесь есть одна таблица спрайтов для некоторых небольших элементов пользовательского интерфейса.
- Textures: Одна текстура, которая используется в общем материале.
Теперь откройте сцену Game в папке RW / Scenes, если она еще не открыта, и посмотрите вокруг в режиме просмотра Scene.

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

Вот краткий обзор игровых объектов:
- Music: источник звука, воспроизводящий счастливую мелодию в цикле.
- Main Camera: камера, которая направлена вниз на сцену, чтобы обеспечить хороший обзор.
- Directional Light: единственный источник света, имитирующий солнце.
- Scenery: этот игровой объект удерживает землю и ветряные мельницы.
- Hay Machine: это синяя машина, сидящая на рельсах, которая состоит из нескольких игровых объектов, чтобы ее можно было легко настроить в дальнейшем.
Затем нажмите кнопку воспроизведения в верхней части редактора и посмотрите на представление Game, чтобы увидеть, что происходит.
Единственные признаки жизни на данный момент — частицы дыма, вылетающие из сеноуборочной машины. В ближайшее время такая игра не получит ни одной награды за игру года, но это хорошая основа для дальнейшего развития.
Нажмите кнопку play еще раз, чтобы остановить тестирование «игры».
Теперь, когда вы знакомы с проектом, пора приступить к написанию скриптов!
Ваш первый скрипт
Создавать новые скрипты в Unity довольно просто. Щелкните правой кнопкой мыши папку RW / Scripts, выберите Create > C# Script и назовите скрипт Rotate.

Теперь Unity создает и немедленно компилирует голый скрипт MonoBehaviour.
Хотя скрипт еще ничего не делает, вы уже можете использовать его как компонент, прикрепив его к игровому объекту. В этом случае скрипт Rotate будет вращать колеса всех ветряных мельниц.
Компоненты — это экземпляры скриптов, что означает, что вы можете добавить столько компонентов к любому игровому объекту, сколько захотите. Любые изменения, внесенные в скрипт, отразятся на всех его компонентах.
Разверните Scenery в Иерархии, чтобы раскрыть его потомков. Откройте Windmill в редакторе префабов, щелкнув стрелку рядом с его названием.

Примечание. Редактор Unity недавно обновил систему префабов. Чтобы получить более подробное представление о новой системе, ознакомьтесь с этим замечательным руководством!
Выберите Wheel, это потомок Windmill. Теперь нажмите кнопку Add Component в нижней части Инспектора, начните вводить «rotate», пока в списке не появится компонент Rotate, и выберите его.
Это добавит компонент Rotate к колесам всех ветряных мельниц.
Чтобы отредактировать скрипт, вам нужно открыть его в редакторе кода, таком как Visual Studio. Есть несколько способов открыть скрипт, но самый простой — найти исходный файл в окне Project и дважды нажать на него. Двойной щелчок по полю Script любого компонента также работает:

Используйте любой из описанных выше методов, чтобы открыть скрипт Rotate в редакторе кода по умолчанию. Вот как это выглядит в Visual Studio:

Сам скрипт представляет собой единый класс, производный от MonoBehaviour, базового класса Unity, от которого должны быть унаследованы все скрипты, если их нужно использовать в качестве компонентов.
MonoBehaviour является частью пространства имен UnityEngine и реализует несколько общедоступных методов, но, что более важно, огромный список функций событий.
Примечание. Функции — это другое название методов, все они являются подпрограммами. В языках ООП, таких как C#, вам следует использовать термин «метод», но Unity предпочитает вместо этого использовать функцию при описании большинства своих встроенных методов.
Unity по умолчанию добавляет методы Start и Update во все новые скрипты. На самом деле это функции событий, они вызываются, когда их запускает определенное действие. Вот несколько наиболее распространенных функций обработки событий, и когда они вызываются:
- Start: при первой инициализации компонента.
- Update: каждый кадр.
- OnEnable: когда компонент включен (повторно).
- OnDestroy: когда компонент уничтожен.
В ходе этого урока вы будете использовать гораздо больше таких функций-обработчиков, поскольку они являются важной частью создания скриптов. Вы можете проверить полный список функций событий в документации Unity.
Добавьте следующую строку внутри метода Update :
Эта строчка кода, которая постоянно создает вращение по оси Y с течением времени, уже демонстрирует некоторые возможности Unity API:
- transform является унаследованным свойством MonoBehaviour и возвращает Transform игрового объекта, к которому прикреплен компонент. Класс Transform позволяет вам читать и изменять положение, поворот и масштаб игрового объекта.
- Rotate — один из общедоступных методов класса Transform , одна из его сигнатур используется здесь для передачи поворота в градусах по осям X, Y и Z соответственно.
- По оси Y передается значение 50 * Time.deltaTime . Time.deltaTime является частью пространства имен UnityEngine и возвращает время в секундах между последним и текущим кадром. Это значение может меняться со временем независимо от частоты кадров. По сути, это предотвращает замедление движения на медленных машинах и гиперрежим на более быстрых. Умножение значения Time.deltaTime на 50 означает, что вы хотите, чтобы значение увеличивалось на 50 в секунду. В данном случае это поворот на 50 градусов по оси Y в течение секунды.
Поскольку эта строка была добавлена в Update , она запускается каждый кадр, пока компонент включен. Это приводит к плавному и постоянному вращению.
Примечание. Редактор Unity использует углы Эйлера для изменения поворота игрового объекта — это знакомые оси X, Y и Z. На самом деле движок Unity внутренне использует кватернионы, которые состоят из значений X, Y, Z и W. Эти значения очень сложно интерпретировать, и они не предназначены для прямого использования. Чтобы узнать больше о различиях, взгляните на документацию Unity по этому вопросу.
Сохраните этот скрипт и вернитесь в редактор.
Вы заметите, что редактор не будет отвечать в течение очень короткого времени, пока он компилирует скрипт. Вы можете проверить, когда происходит эта компиляция, посмотрев в нижний правый угол редактора, там будет небольшой анимированный значок:

Если вы еще не вышли из режима редактирования префаба, сделайте это сейчас, щелкнув стрелку влево рядом с префабом Windmill в Иерархии. Вам будет предложено сохранить или отменить изменения. Нажмите на кнопку Save.

Теперь запустите воспроизведение сцены. Вы заметите, что колеса ветряной мельницы теперь медленно вращаются, так расслабляюще.
Теперь предположим, что вы хотите настроить скорость вращения колес или добавить компонент Rotate к другому игровому объекту, который должен вращаться по другой оси. Было бы неплохо, если бы вы могли изменить эти значения в редакторе?
Вот тут-то и пригодятся переменные!
Переменные
Переменные — это контейнеры данных, в которых хранится информация. Они могут варьироваться от жизней и денег игрока до ссылки на префаб, который появляется в сцене. Как только вы добавите их в скрипт, вы можете редактировать их значения в редакторе.
Откройте скрипт Rotate в вашем любимом редакторе кода и добавьте следующую строку прямо над методом Start :
Эта переменная изменит скорость и по какой оси будет происходить вращение.
Модификатор public в контексте Unity означает, что эта переменная будет доступна редактору и другим классам.
Vector3 — это структура, в которой хранятся значения X, Y и Z, Vector3 может использоваться для передачи положения, поворота или масштаба игрового объекта.
Теперь замените эту строку:
Скорость вращения теперь передается в метод Rotate с помощью переменной, что упрощает ее изменение. Векторы можно умножать на типы переменных с одним значением, такие как deltaTime , для одновременного изменения всех включенных значений вектора. Например, Vector3 со значением (X: 1, Y: 2, Z: 3), умноженное на float со значением 3, приведет к Vector3 со значением (X: 3, Y: 6, Z : 9).
Всегда выбирайте переменную вместо «магического числа», такого как 50, которые вы добавили ранее. Это позволит вам изменять и повторно использовать значения, не открывая скрипт.
Теперь сохраните скрипт и вернитесь в редактор. Откройте префаб Windmill из Иерархии, как вы делали раньше, и снова выберите игровой объект Wheel.
Взгляните на Inspector, компонент Rotate теперь имеет поле, которое вы можете настроить:

Измените значение Y в поле Rotation Speed на 120 и выйдите из режима префаба, нажав на стрелку в верхнем левом углу Иерархии, и сохранив изменения при появлении запроса.

Теперь поиграйте в сцену. Колеса вращаются, как и раньше, но чуть быстрее.
Огромным преимуществом наличия переменных в редакторе является то, что вы можете изменять их в режиме воспроизведения! Выберите колесо одной из ветряных мельниц в окне Hierarchy и попробуйте изменить параметр скорости вращения Rotation Speed. Вы можете перемещать значение Y слева направо или изменять число напрямую.
Это приведет к тому, что колесо изменит свою скорость в реальном времени:
После выхода из режима игры все значения, которые вы установили для игровых объектов в Иерархии, будут сброшены. Это отличный способ поиграть со значениями и посмотреть, что работает лучше всего. Вы можете настроить высоту прыжка персонажа, количество здоровья вражеских орков или даже расположение элементов пользовательского интерфейса.
Конечно, как только вы найдете нужные значения, вы можете сохранить их, чтобы они применялись каждый раз при запуске игры. Самый надежный способ сделать это — скопировать и вставить значения в компоненты и использовать префабы.
Находясь в режиме игры, измените вращение одного из колес на все, что, по вашему мнению, выглядит хорошо, например, на 150 по оси Y. Теперь щелкните правой кнопкой мыши компонент Rotate вокруг его имени в Инспекторе или щелкните левой кнопкой мыши шестеренку параметров в правом верхнем углу компонента и выберите Copy Component. Это скопирует компонент и его значения в буфер обмена.
Далее остановите режим воспроизведения. Вы заметите, что скорость возвращается к своему прежнему значению в Inspector. Щелкните правой кнопкой мыши имя компонента Rotate и выберите Paste Component Values. Все значения, которые вы скопировали, теперь вставляются в компонент Rotate.
Хотя это изменило скорость вращения одной из ветряных мельниц, вы хотите применить такое значение ко всем. Для этого выберите ветряную мельницу, которую вы изменили, и выберите Overrides > Apply All в правом верхнем углу Inspector, чтобы применить все изменения к префабу Windmill.

Далее идет опрос ввода от игрока, чтобы заставить машину двигаться и стрелять!
Ввод игрока и создание экземпляров префабов
Игра не была бы игрой, если бы не требовалось определенного уровня участия игрока. Скрипты могут получать состояние клавиатуры, мыши и любых подключенных геймпадов. Первая цель — заставить эту маленькую машинку двигаться по рельсам слева направо.
Движение
Создайте новый скрипт C# в RW / Scripts, назовите его HayMachine и откройте его в редакторе кода.
Добавьте следующие переменные прямо над Start :
Эта переменная позволит вам указать скорость, с которой может двигаться машина.
Теперь добавьте этот метод ниже Update :
Этот фрагмент кода перемещает сеноуборочную машину, используя горизонтальный ввод игрока:

- Получить необработанный ввод горизонтальной оси с помощью класса Input и сохранить его в horizontalInput . Класс Input содержит все методы для опроса устройств ввода. GetAxisRaw возвращает текущее значение ввода, как определено в диспетчере ввода для горизонтальной оси:
В этом случае вы можете использовать клавиши со стрелками влево и вправо, клавиши A и D или левый аналоговый джойстик в качестве входа.
- Если horizontalInput меньше 0, это означает, что было обнаружено движение влево по оси X. В этом случае использовать translate (то есть переместить) машину влево со значением движения movementSpeed в секунду.
- Если вместо этого horizontalInput больше 0, переместить машину вправо.
Когда Unity не обнаруживает никаких вводных данных, horizontalInput останется на 0 и машина не будет двигаться.
Теперь, чтобы вызвать метод, который вы добавили для каждого кадра, добавьте к нему вызов в Update :
Затем сохраните этот скрипт и вернитесь в редактор. Выберите Hay Machine в Иерархии и добавьте к нему компонент Hay Machine.
Установите Movement Speed на 14 и воспроизведите сцену. Используйте клавиши со стрелками или A и D для перемещения машины слева направо. Все работает!
К сожалению, вы можете переместить машину за пределы рельсов и даже за пределы экрана, это не правильно. Вам нужно будет установить некоторые границы, чтобы машина не двигалась слишком далеко.
Снова откройте скрипт HayMachine и добавьте следующую переменную под другими:
Эта переменная будет использоваться для ограничения движения по оси X. В качестве значения по умолчанию присваивается 22, это будет начальное значение, которое также будет заполнено в редакторе.
Теперь отредактируйте оператор if-else в UpdateMovement , чтобы он использовал границу в своих проверках:
Вот что изменилось:
- Мало того, что горизонтальный ввод должен быть отрицательным, прежде чем разрешить движение влево, положение машины по оси X также должно быть выше, чем отрицательное значение horizontalBoundary .
- Чтобы переместиться вправо, горизонтальный ввод должен быть положительным, а положение X машины должно быть ниже horizontalBoundary .
Изображение ниже более наглядно иллюстрирует происходящее:

Белые линии слева и справа обозначают границы, линия, проходящая через машину, является ее центром. Перемещение машины в любом направлении «блокирует» ее при достижении границы:
Сохраните скрипт и вернитесь в редактор. Попробуйте воспроизвести сцену и еще раз переместить машину влево и вправо. Машина останавливается, как только она перемещается к одному из краев.
Далее вы будете реализовывать скрипт стрельбы тюками сена!
Создание и стрельба снарядами
Прежде чем вы сможете начать что-либо запускать, вам нужно создать игровой объект для сена. Начните с создания нового пустого игрового объекта в окне Hierarchy, нажав правой кнопкой мыши на пустое пространство и выбрав Create Empty. Это создаст пустой игровой объект с именем GameObject в корне Иерархии.
Не снимая выделения с пустого GameObject, измените его имя на Hay Bale в Инспекторе и сбросьте его компонент Transform, щелкнув правой кнопкой мыши на компонент Transform и выбрав Reset.
Теперь добавьте 3D-модель в Hay Bale, перетащив модель Hay Bale из RW / Models на Hay Bale в Иерархии. Не снимая выделения с модели Hay Bale, назовите ее Hay Bale Model и сбросьте ее компонент Tranform. Теперь вы заметите сено, твердо стоящее на поверхности, как в режиме сцены, так и в режиме игры.

Затем выберите Hay Bale и добавьте следующие компоненты с помощью кнопки Add Component:
- Box Collider
- Rigidbody
- Rotate
Теперь, когда сено имеет необходимые компоненты для использования физики и может вращаться для анимации, пришло время настроить его.
Тюк будет сброшен сеноуборочной машиной и полетит прямо вперед, не подвергаясь воздействию силы тяжести. Позже в этом уроке, когда вы добавите овец, они будут использоваться, чтобы овцы не причиняли себе вреда.
Для начала установите флажок Is Trigger на Box Collider, чтобы тюк не мог толкать твердые тела. Затем установите флажок Is Kinematic на его Rigidbody, чтобы сено не провалилось сквозь поверхность. Наконец, установите Rotation Speed при вращении на (X: 300, Y: 50, Z: 0).
Сохраните сцену и нажмите кнопку воспроизведения. Вы заметите, что сено крутится на месте.
Чтобы сено двинулось вперед, вам нужно написать еще один служебный скрипт. Создайте новый скрипт C# в RW / Scripts, назовите его Move и откройте его в редакторе кода.
Добавьте следующие объявления переменных в начало класса прямо над методом Start :
Вот для чего они нужны:
- Присоединенный игровой объект будет двигаться со скоростью в метрах в секунду по осям X, Y и Z.
- Пространство, в котором будет происходить движение: World или Self. Пространство World трансформирует игровой объект в мировом пространстве Unity, игнорируя вращение игрового объекта, в то время как Self учитывает вращение игрового объекта в своих вычислениях.
Теперь добавьте в Update следующее:
Это то, что на самом деле перемещает игровой объект с помощью translation, это геометрический термин, который означает преобразование точки на расстояние в заданном направлении. По сути, это означает перемещение игрового объекта в контексте Unity.
Метод Translate принимает два параметра: первый — это направление и скорость, а второй — пространство, в котором происходит движение. Движение умножается на Time.deltaTime, чтобы обеспечить плавное движение в течение определенного периода времени.
Сохраните этот скрипт и вернитесь в редактор. Добавьте компонент Move в Hay Bale, установите для него Movement Speed на (X: 0, Y: 0, Z: 20) и оставьте Space равным World.
Теперь запустите воспроизведение сцены, и вы увидите, как тюк сена летит к мостам и исчезает с экрана, отлично!
Перетащите Hay Bale в папку RW / Prefabs, чтобы превратить его в префаб, и удалите оригинал из иерархии. Теперь вы сможете ссылаться на этот префаб, чтобы создавать больше игровых объектов типа Hay Bale, когда захотите.
Чтобы сеноуборочная машина выбрасывала тюки, вам нужно написать скрипт. Откройте скрипт HayMachine и добавьте следующие объявления переменных прямо над Start :
Вот краткое объяснение переменных:
- Ссылка на префаб Hay Bale.
- Точка, с которой будет стрелять сено.
- Наименьшее время между выстрелами. Это не дает игроку спамить кнопку стрельбы и заполнить экран тюками сена.
- Таймер, который постоянно уменьшается, чтобы отслеживать, может ли машина стрелять или нет.
Теперь добавьте метод ShootHay под UpdateMovement :
Метод Instantiate создает экземпляр заданного префаба или игрового объекта и помещает его в сцену. Он принимает три параметра: префаб или игровой объект, позицию и поворот. В этом случае ссылка на префаб Hay Bale используется для создания экземпляра с его начальной позицией, такой же, как у haySpawnpoint Transform. Quaternion.identity используется для поворота, это значение поворота по умолчанию и похоже на Vector3.Zero , поскольку оно устанавливает поворот на (X: 0, Y: 0, Z: 0).
Чтобы вызвать приведенный выше код, вам понадобится код для запроса ввода. Добавьте следующий метод чуть выше ShootHay :
Вот что делает этот блок кода:
- Вычитает время между предыдущим кадром и текущим из shotTimer , это будет уменьшать его значение на 1 каждую секунду.
- Если значение shotTimer равно или меньше 0, и клавиша пробела нажата .
- Сбросить таймер стрельбы.
- Стрелять в тюк сена!
И наконец, добавьте эту строку в Update , прямо под UpdateMovement () ; :
Это вызывает метод над каждым кадром.
Теперь сохраните скрипт и вернитесь в редактор. Выберите Hay Machine в Иерархии, разверните его, щелкнув стрелку слева, и посмотрите на окно Inspector.

Новые общедоступные переменные, которые вы только что добавили, стали полями, которые можно назначать. Перетащите Hay Bale из RW \ Prefabs в слот Hay Bale Prefab, перетащите дочерний игровой объект Hay Spawnpoint, который находится в Hay Machine, в слот Hay Spawnpoint и установите интервал стрельбы на 0,8.

Теперь сохраните сцену и нажмите кнопку воспроизведения. Перемещайте сеноуборочную машину с помощью клавиш со стрелками и стреляйте сеном с помощью клавиши пробела!
Все должно работать как на GIF-изображении выше.
Возможно, вы заметили, что тюки никогда не разрушаются и продолжают бесконечно улетать в никуда.
Чтобы исправить это, вы разумно примените триггеры, теги и пару строк кода.
Теги и реакция на физику
Чтобы идентифицировать типы GameObject, вы можете использовать теги. Теги — это справочные слова, такие как «Player» или «Collectible», которые вы можете назначить игровым объектам, чтобы легко их находить и отличать от других игровых объектов. В качестве тега можно использовать любое слово или короткое предложение.
Создать новый тег довольно просто: выберите Edit > Project Settings. в верхнем меню и откройте вкладку Tags and Layers в окне Project Settings. Теперь разверните список тегов, и вы заметите, что в проекте уже есть два предварительно загруженных тега: DestroyHay и DropSheep.

Нажмите кнопку + под списком тегов, назовите новый тег Hay и нажмите кнопку Save, чтобы добавить этот новый тег в список.
После добавления тега Hay закройте окно настроек проекта и выберите Hay Bale в папке RW \ Prefabs. Откройте раскрывающееся меню Tag прямо под полем имени и выберите Hay.
![]()
Теперь разница между тюками сена и другими игровыми объектами очевидна: вы можете добавить область, которая разрушает сено при соприкосновении с ним. Добавьте новый пустой игровой объект в Hierarchy и назовите его Triggers. Сбросьте его Transform и добавьте пустой GameObject в качестве его дочернего элемента. Назовите этого потомка Hay Destroyer.
![]()
Выберите Hay Destroyer, установите его положение на (X: 0, Y: 4, Z: 68) и добавьте к нему Box Collider. Установите флажок Is Trigger на Box Collider и установите Size на (X: 60, Y: 8, Z: 12). Затем измените тег на DestroyHay. Теперь вы должны увидеть огромный коллайдер в форме прямоугольника, появившийся в представлении сцены, прямо за пределами поля обзора камеры.

Теперь, чтобы этот триггер уничтожил любое сено, вам нужно написать еще один служебный скрипт. Создайте новый сценарий C # внутри RW \ Scripts, назовите его DestroyOnTrigger и откройте его в редакторе кода. Полностью удалите методы Start и Update и добавьте вместо них это объявление переменной:
Эта строка позволит вам ввести имя любого тега, который уничтожит этот игровой объект.
Теперь добавьте этот метод под только что добавленной переменной:
Вот что происходит:
- onTriggerEnter — это функция MonoBehaviour, это один из специальных методов, которые движок Unity вызывает в определенных обстоятельствах. В этом случае onTriggerEnter вызывается, когда игровой объект с Rigidbody и Collider входит в область триггера игрового объекта.
- Проверяется, есть ли у игрового объекта, входящего в триггер, тег, определенный в tagFilter .
- Уничтожить игровой объект, к которому прикреплен этот скрипт.
Сохраните этот скрипт и вернитесь в редактор. Время проверить!
Выберите Hay Bale в RW \ Prefabs, добавьте компонент Destroy On Trigger и измените Tag Filter на DestroyHay.

Теперь нажмите кнопку play и попробуйте снова коснуться сена. Вы заметите, что любое сено, попавшее в Hay Destroyer, мгновенно уничтожается.
Теперь, когда у вас есть полный контроль над сеноуборочной машиной и ее снарядами, пора познакомить с пушистыми друзьями.
Скрипты для овец
В игре, которую вы создаете, стая овец в панике бежит к вам, ни перед чем не останавливаясь. К несчастью для них, это касается выступа сразу за машиной, ага!
Для начала создайте новый пустой GameObject в окне Hierarchy и назовите его Sheep. Сбросьте его Transform, установите его поворот по оси Y на 180 и добавьте Box Collider и Rigidbody. Установите флажок Is Trigger для Box Collider и измените его центр и размер на (X: 0, Y: 1,4, Z: -0,3) и (X: 2,5, Y: 2, Z: 4) соответственно. Наконец, установите флажок Is Kinematic на Rigidbody.
Теперь овца в Инспекторе должна выглядеть так:

Перетащите модель Sheep из RW \ Models на Sheep, чтобы придать ей визуальные эффекты. Назовите игровой объект, который вы только что добавили, Sheep Model, сбросьте его Transform и установите поворот по оси X на -90, чтобы голова выходила из поверхности.
Теперь эта овца готова к написанию скрипта!
Примечание. До сих пор вы создавали общие скрипты, которые можно повторно использовать для любого игрового объекта или даже других проектов. Скрипт, который вы собираетесь написать, намного более конкретен, потому что его взаимодействие довольно уникально и со временем будет усложняться по мере добавления в игру дополнительных функций.
Создайте новый скрипт C# с именем Sheep в RW \ Scripts и откройте его в редакторе кода.
Для начала овце просто нужно бежать вперед и исчезнуть, когда ее ударит тюк сена. Добавьте следующие объявления переменных прямо над Start :
Вот для чего они нужны:
- Скорость бега овцы в метрах в секунду.
- Задержка в секундах перед тем, как овца будет уничтожена после удара сеном.
- Логическое значение, которое принимает значение true, когда овца попала в сено.
Разобравшись с этим, добавьте эту строку в Update :
Это заставляет овцу бежать к своему прямому вектору (локальной оси Z) со скоростью, установленной в переменной runSpeed .
Затем добавьте этот метод ниже Update :
Вот суть этого метода:
- Установить для hitByHay значение true , это будет полезно, чтобы проверить, был ли уже вызван метод, чтобы он не вызывался дважды или более.
- Установить скорость бега на 0, это остановит овцу.
- Вы уже видели этот вызов метода, но на этот раз есть дополнительный параметр. Метод Destroy принимает второй параметр — задержку в секундах перед уничтожением игрового объекта. В этом случае используется переменная delay, которую вы добавили выше.
Последняя часть заставляет овцу реагировать на физику, с добавлением следующего кода:
Вот что это делает:
- Этот метод вызывается, когда триггер входит в этот игровой объект (или наоборот).
- Если объекту GameObject, который попал в этот объект, назначен тег Hay, и овца уже не попала в сено .
- Уничтожить другой игровой объект (тюк сена).
- Вызвать метод HitByHay , который вы добавили перед этим.
На этом пока что, сохраните скрипт и вернитесь в редактор. Выберите Sheep в Иерархии и добавьте компонент Sheep. Установите Run Speed на 10 и Got Hay Destroy Delay на 1.

Теперь запустите воспроизведение сцены, выстрелите в овцу и посмотрите, что произойдет!
Потрясающие! Овца перестает двигаться и исчезает, как вы это и закодировали. Что произойдет, если овца пробежит мимо, а вы ее не пристрелите? Перезапустите сцену и проверьте это.
Овечка пролетает через край как по волшебству, это никуда не годится! Вам нужно будет создать еще одну зону срабатывания, чтобы скрипт Sheep мог обнаруживать столкновения с ней и соответствующим образом реагировать.
Создайте новый пустой игровой объект как дочерний для Triggers, назовите его Sheep Dropper и сбросьте его Transform. Установите его положение на (X: 0, Y: 4, Z: -54) и добавьте Box Collider с установленным флажком Is Trigger и размером (X: 60, Y: 8, Z: 12). Теперь измените его тег на DropSheep, и у вас будет хороший большой триггер позади машины для сена, готовый к использованию.

Когда овца касается этого триггера, она должна упасть и исчезнуть из поля зрения. Чтобы реализовать это, вам необходимо внести некоторые изменения в скрипт Sheep. Снова откройте его в редакторе кода и добавьте следующие объявления переменных ниже существующих:
Они говорят сами за себя, но вот краткий обзор:
- Время в секундах до того, как овца будет уничтожена, когда она выйдет за край и начнет падать.
- Ссылка на компонент Collider овцы.
- Ссылка на Rigidbody овцы.
Теперь назначьте необходимые ссылки, добавив это в Start :
Это находит и кэширует collider и rigidbody овцы для дальнейшего использования.
Затем необходимо настроить коллайдер овцы, чтобы на него повлияла гравитация. Для этого добавьте этот метод:
Этот метод прост:
- Сделать rigidbody овцы некинематическим, чтобы на него воздействовала сила тяжести.
- Отключить триггер, чтобы овца превратилась в твердый объект.
- Уничтожить овцу после задержки, указанной в dropDestroyDelay .
Теперь добавьте следующее в onTriggerEnter прямо под существующим оператором if:
Если овца была сбита чем-то другим, кроме тюка сена, она проверяет, имеет ли столкнувшийся коллайдер тег DropSheep; Если это так, вызывается Drop .
Теперь сохраните этот скрипт и вернитесь в редактор. Выберите Sheep и измените значение Drop Destroy Delay на 4.
Запустите воспроизведение сцены еще раз и позвольте овце пройти мимо машины, чтобы посмотреть, что произойдет.
Работает! Овца теперь падает и исчезает, когда игроку не удается ее спасти. Вот это мотивирует!
Теперь, когда овца действует так, как задумано, перетащите ее из Иерархии в папку RW \ Prefabs, чтобы превратить ее в префаб, и удалите оригинал из Иерархии.
Это первая часть урока по написанию скриптов. Похвалите себя, вы узнали основы создания скриптов для реализации игрового процесса в Unity.
Куда двигаться дальше?
Вы можете скачать готовый проект, нажав на кнопку «Скачать материалы урока» вверху страницы.
Если вы хотите узнать больше об API Unity, ознакомьтесь с этими полезными ресурсами:
Когда вы будете готовы сделать еще один шаг в написании скриптов с помощью Unity, ознакомьтесь со второй частью урока, вы пригласите целую стаю пушистых друзей и научитесь:
- Создавать списки и перебирать их.
- Обновлять элементы пользовательского интерфейса.
- Использовать систему событий.
- Использовать шаблон Singleton.
- Передавать данные между сценами, чтобы настроить игру.
Мы надеемся, что вам понравился этот урок. Если у вас есть какие-либо вопросы или комментарии, то присоединяйтесь к обсуждению, а также делитесь в соцсетях, чтобы сохранить урок в репостах и закладках.