Управление столкновениями со стандартной физикой (2D)
Среда верификации
- Виндоус
-
- Windows 11
- Редактор Unity
-
- 2021.3.3f1
- Входной системный пакет
-
- 1.3.0
Предпосылки для этого совета
Следующие настройки были сделаны заранее в качестве предпосылки для описания этого совета.
Сначала
Этот совет помещает два объекта, чтобы вы могли реализовать поведение манипулирования одним объектом и использования стандартной физики Unity для подталкивания другого, когда он вступает в контакт с другим.
Кстати, большинство настроек такие же, как и процедура, описанная в предыдущей статье «Определение того, сталкиваются ли объекты друг с другом (2D)».
Подготовка
Процедура здесь почти такая же, как и в предыдущих советах , поэтому давайте плавно ее проследим.
После создания проекта подготовьте два изображения спрайтов, которые будут объектами, и добавьте их. Названия — «UnityTips» и «UnityTips_2» соответственно.
Добавьте два файла изображений, перетащив их в представление.
Добавьте сценарий для перемещения левого объекта с помощью клавиатуры. Имя Player
скрипта — .
using UnityEngine;
using UnityEngine.InputSystem;
public class Player : MonoBehaviour
{
// 一定時間ごとに呼ばれます
void FixedUpdate()
{
// キーボードの情報を取得
var keyboard = Keyboard.current;
// スプライトの移動処理
if (keyboard.leftArrowKey.isPressed)
{
transform.Translate(-0.1f, 0, 0, Space.World);
}
if (keyboard.rightArrowKey.isPressed)
{
transform.Translate(0.1f, 0, 0, Space.World);
}
if (keyboard.upArrowKey.isPressed)
{
transform.Translate(0, 0.1f, 0, Space.World);
}
if (keyboard.downArrowKey.isPressed)
{
transform.Translate(0, -0.1f, 0, Space.World);
}
}
}
Присоединитесь к объекту, на котором требуется выполнить сценарий.
Запустите игру и проверьте, работает ли она с помощью клавиш курсора на клавиатуре.
Наконец, поместите текстовый объект, чтобы отобразить состояние обнаружения столкновения.
Имя TextState
объекта: .
Настройки обработки столкновений
Отсюда вы можете настроить параметры, связанные с коллизиями.
Сначала выберите объект, который вы хотите переместить, «UnityTips», и нажмите «Добавить компонент» в инспекторе.
Выберите из Physics 2D
списка. Physics
это 3D-объект, так что не заблуждайтесь.
Physics 2D
Box Collider 2D
Выберите из . Поскольку этот спрайт имеет прямоугольную форму, выбирается Box, но если он имеет форму круга, например, выберите другие фигуры, такие как Circle.
В прошлый раз я хотел получить информацию только о том, попал ли я в нее или нет, поэтому я поставил галочку «Сделать это триггером», но на этот раз я этого не сделаю. Это позволяет справляться с столкновениями в физике.
Rigidbody 2D
Затем добавьте компоненты . Вы можете добавить его из "Физика 2D -> Жесткое тело 2D".
Rigidbody
дает физическую информациюCollider
объекту, а также может определять столкновения с объектами, имеющими .
Установите шкалу силы тяжести на 0, чтобы предотвратить свободное падение ниже.
Точно так же добавьте компонент к другому объекту «UnityTips_2», чтобы отметить Box Collider 2D
попадания.
Кроме того, на этот раз необходимо двигаться с силой соперника, поэтому добавьте.Rigidbody 2D
Шкала силы тяжести должна быть равна 0.
Вот и все. В настоящее время программа не требуется. Запустите игру и попробуйте прикоснуться к другому предмету.
Я думаю, вы можете подтвердить, что если вы толкнете противника таким образом, противник будет вести себя так, как будто его толкают. Использовать физику стандартной функции очень просто, потому что программа не требуется.
Предотвращение вращения объектов
Вы можете видеть, когда прикасаетесь к нему, но если точка попадания сместится даже незначительно, каждый объект будет вращаться. Как игра, она часто становится неестественной, поэтому нужно настроить ее так, чтобы она не вращалась.
Rigidbody 2D
В компоненте есть пункт под названием «Фиксированное вращение» в «Ограничениях», поэтому отметьте Z.
Теперь можно работать так, чтобы он не вращался. Попробуйте установить его на два объекта и запустить игру, чтобы проверить это.
Я думаю, вы можете быть уверены, что он не вращается, независимо от того, под каким углом вы его толкаете.
Делайте что-нибудь, когда предметы ударяются друг о друга
Например, вы можете захотеть реализовать пулю, которая поражает врага, толкая противника, уменьшая при этом здоровье врага. Это то же самое, что и в предыдущих советах , так как событие произойдет, так что вы можете с ним справиться.
Player
Откройте скрипт и добавьте каждое поле и метод, используя следующее:
using System;
using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.UI;
public class Player : MonoBehaviour
{
<summary>状態表示用テキストオブジェクト。</summary>
[SerializeField] private Text TextState;
// 中略
<summary>衝突した瞬間に呼ばれます。</summary>
<param name="partner">衝突した相手のコリジョン情報。</param>
private void OnCollisionEnter2D(Collision2D partner)
{
TextState.text = $"OnCollisionEnter2D : {partner.collider.tag} {DateTime.Now:HH:mm:ss.fff}{Environment.NewLine}{TextState.text}";
}
<summary>衝突している間呼ばれます。ただしスリープモードになった場合は呼ばれません。</summary>
<param name="partner">衝突した相手のコリジョン情報。</param>
private void OnCollisionStay2D(Collision2D partner)
{
TextState.text = $"OnCollisionStay2D : {partner.collider.tag} {DateTime.Now:HH:mm:ss.fff}{Environment.NewLine}{TextState.text}";
}
<summary>衝突状態でなくなったタイミングで呼ばれます。</summary>
<param name="partner">衝突した相手のコリジョン情報。</param>
private void OnCollisionExit2D(Collision2D partner)
{
TextState.text = $"OnCollisionExit2D : {partner.collider.tag} {DateTime.Now:HH:mm:ss.fff}{Environment.NewLine}{TextState.text}";
}
}
Поскольку мы хотим отобразить информацию о том, был ли он поражен или нет, мы сделаем возможным отображение его в текстовом объекте следующим образом.
<summary>状態表示用テキストオブジェクト。</summary>
[SerializeField] private Text TextState;
Процесс обнаружения столкновений описан следующим образом.
<summary>衝突した瞬間に呼ばれます。</summary>
<param name="partner">衝突した相手のコリジョン情報。</param>
private void OnCollisionEnter2D(Collision2D partner)
{
TextState.text = $"OnCollisionEnter2D : {partner.collider.tag} {DateTime.Now:HH:mm:ss.fff}{Environment.NewLine}{TextState.text}";
}
<summary>衝突している間呼ばれます。ただしスリープモードになった場合は呼ばれません。</summary>
<param name="partner">衝突した相手のコリジョン情報。</param>
private void OnCollisionStay2D(Collision2D partner)
{
TextState.text = $"OnCollisionStay2D : {partner.collider.tag} {DateTime.Now:HH:mm:ss.fff}{Environment.NewLine}{TextState.text}";
}
<summary>衝突状態でなくなったタイミングで呼ばれます。</summary>
<param name="partner">衝突した相手のコリジョン情報。</param>
private void OnCollisionExit2D(Collision2D partner)
{
TextState.text = $"OnCollisionExit2D : {partner.collider.tag} {DateTime.Now:HH:mm:ss.fff}{Environment.NewLine}{TextState.text}";
}
Аналогично предыдущим советам------, но имя метода теперь «OnCollision------2D» вместо «OnTrigger2D».
Rigidbody 2D
Каждое из приведенных выше событий происходит, когда объект, имеющий Collider 2D
.
Это позволит вам определить и обработать, правильно это или нет.
Есть три события, каждое из которых вызывается в следующее время.
OnCollisionEnter2D | Когда предметы ударяются друг о друга |
OnCollisionStay2D | В то время как предметы ударяются друг о друга |
OnCollisionExit2D | Когда объекты выходят из состояния столкновения |
В обоих случаях объект противника получает объект противника в качестве аргумента, поэтому вы можете получить объект противникаCollision2D
, посмотрев Collider2D.gameObject
тип пораженной цели (враг, Collider2D.collider.tag
предмет и т. д.).
Из вышеперечисленных OnCollisionEnter2D
событий три вызываются и OnCollisionExit2D
один раз на столкновение.
OnCollisionStay2D
вызывается каждый кадр во время столкновения, но событие больше не вызывается по прошествии определенного времени с момента остановки обоих объектов.
Это связано с тем, что считается, что он вошел в спящее состояние, и считается пустой тратой времени на вычисление столкновений каждого кадра с чем-то, что не движется.
Если вы Rigidbody 2D
не хотите, чтобы он переходил в спящий режим, измените спящий режим параметра на «Не спать».
После изменения кода задайте текст для отображения информации.
Запустите игру и переместите объект с помощью клавиатуры, чтобы коснуться другого спрайта. Вы можете видеть, что для каждой вызывается три функции.
Кстати, если вы прикоснетесь к объекту, а затем перестанете двигаться, метод будет вызываться OnCollisionStay2D
на короткое время.
Вы должны увидеть, что метод больше не вызывается через OnCollisionStay2D
определенное время.
Это указывает на то, что вы вошли в спящее состояние, но если вы хотите изменить время до перехода в этот спящий режим, вы можете изменить его, выбрав «2D-физика» в настройках проекта и указав параметр «Время сна» в секундах.
Он не может быть установлен в 0, но если он OnCollisionStay2D
установлен на бесконечно малый, сам метод не будет вызываться.