Определите, сталкиваются ли объекты друг с другом (2D)

Страница обновлена :
Дата создания страницы :

Среда верификации

Виндоус
  • Windows 11
Редактор Unity
  • 2021.3.3f1
Входной системный пакет
  • 1.3.0

Предпосылки для этого совета

Следующие настройки были сделаны заранее в качестве предпосылки для описания этого совета.

Сначала

Этот совет объясняет, как определить, находятся ли два объекта в контакте. Перемещение одного объекта с помощью клавиатуры.

Подготовка

После создания проекта подготовьте два образа спрайта, который будет объектом. Если вам сложно подготовиться, вы можете разместить два одинаковых спрайта, но на этот раз мы разделим их для наглядности. Названия — «UnityTips» и «UnityTips_2» соответственно.

Добавьте два файла изображений, перетащив их в представление.

Добавьте сценарий для перемещения левого объекта с помощью клавиатуры. Имя Player скрипта — . Содержимое сценария аналогично подсказкам в разделе Перемещение, поворот и масштабирование спрайта.

using UnityEngine;
using UnityEngine.InputSystem;

public class Player : MonoBehaviour
{
  // 一定時間ごとに呼ばれます
  void FixedUpdate()
  {
    // キーボードの情報を取得
    var keyboard = Keyboard.current;
    if (keyboard == null)
    {
      Debug.Log("キーボードがありません。");
      return;
    }

    // スプライトの移動処理
    // Translate メソッドでスプライトの位置が移動します
    // Space.World を指定すると回転の影響をうけません
    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 2DBox Collider 2D Выберите из . Поскольку этот спрайт имеет прямоугольную форму, выбирается Box, но если он имеет форму круга, например, выберите другие фигуры, такие как Circle.

Box Collider 2D Так как компонент будет добавлен, поставьте галочку напротив пункта «Сделать его срабатывающим» в параметрах. Это позволит получить информацию только о том, «попали вы или нет».

Rigidbody 2D Затем добавьте компоненты . Вы можете добавить его из "Физика 2D -> Жесткое тело 2D". Rigidbody дает физическую информациюCollider объекту, а также может определять столкновения с объектами, имеющими .

Rigidbody Однако, если у вас есть компонент, он также будет содержать информацию о гравитации в направлении -Y, поэтому, если вы его выполните, он упадет вниз. Поэтому установите «Шкалу гравитации» на 0 из параметров.

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

Аналогичным образом добавьте компонент к другому объекту Box Collider 2D «UnityTips_2». На этот раз это пострадавшая сторона, поэтому вам не нужно менять какие-либо настройки.

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 OnTriggerEnter2D(Collider2D partner)
  {
    TextState.text = $"OnTriggerEnter2D : {partner.tag} {DateTime.Now:HH:mm:ss.fff}{Environment.NewLine}{TextState.text}";
  }

  /// <summary>衝突している間呼ばれます。ただしスリープモードになった場合は呼ばれません。</summary>
  /// <param name="partner">衝突した相手のコリジョン情報。</param>
  private void OnTriggerStay2D(Collider2D partner)
  {
    TextState.text = $"OnTriggerStay2D : {partner.tag} {DateTime.Now:HH:mm:ss.fff}{Environment.NewLine}{TextState.text}";
  }

  /// <summary>衝突状態でなくなったタイミングで呼ばれます。</summary>
  /// <param name="partner">衝突した相手のコリジョン情報。</param>
  private void OnTriggerExit2D(Collider2D partner)
  {
    TextState.text = $"OnTriggerExit2D : {partner.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 OnTriggerEnter2D(Collider2D partner)
{
  TextState.text = $"OnTriggerEnter2D : {partner.tag} {DateTime.Now:HH:mm:ss.fff}{Environment.NewLine}{TextState.text}";
}

/// <summary>衝突している間呼ばれます。ただしスリープモードになった場合は呼ばれません。</summary>
/// <param name="partner">衝突した相手のコリジョン情報。</param>
private void OnTriggerStay2D(Collider2D partner)
{
  TextState.text = $"OnTriggerStay2D : {partner.tag} {DateTime.Now:HH:mm:ss.fff}{Environment.NewLine}{TextState.text}";
}

/// <summary>衝突状態でなくなったタイミングで呼ばれます。</summary>
/// <param name="partner">衝突した相手のコリジョン情報。</param>
private void OnTriggerExit2D(Collider2D partner)
{
  TextState.text = $"OnTriggerExit2D : {partner.tag} {DateTime.Now:HH:mm:ss.fff}{Environment.NewLine}{TextState.text}";
}

Rigidbody 2D Каждое из приведенных выше событий происходит, когда объект, имеющий Collider 2D . Это позволит вам определить и обработать, правильно это или нет.

Есть три события, каждое из которых вызывается в следующее время.

OnTriggerEnter2D Когда предметы ударяются друг о друга
OnTriggerStay2D В то время как предметы ударяются друг о друга
OnTriggerExit2D Когда объекты выходят из состояния столкновения

В обоих случаях объект противника получает объект противника в качестве аргумента, поэтому вы можете получить объект противникаCollider2D, посмотрев Collider2D.gameObject тип пораженной цели (враг, Collider2D.tag предмет и т. д.).

Из вышеперечисленных OnTriggerEnter2D событий три вызываются и OnTriggerExit2D один раз на столкновение.

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

Если вы Rigidbody 2D не хотите, чтобы он переходил в спящий режим, измените спящий режим параметра на «Не спать».

После изменения кода задайте текст для отображения информации.

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

Кстати, если вы прикоснетесь к объекту, а затем перестанете двигаться, метод будет вызываться OnTriggerStay2D на короткое время. Вы должны увидеть, что метод больше не вызывается через OnTriggerStay2D определенное время.

Это указывает на то, что вы вошли в спящее состояние, но если вы хотите изменить время до перехода в этот спящий режим, вы можете изменить его, выбрав «2D-физика» в настройках проекта и указав параметр «Время сна» в секундах. Он не может быть установлен в 0, но если он OnTriggerStay2D установлен на бесконечно малый, сам метод не будет вызываться.