Визначте, чи стикаються об'єкти один з одним (2D)

Сторінка оновлюється :
Дата створення сторінки :

Середовище перевірки

Вікна
  • вікна 11
Редактор єдності
  • 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, але якщо він має форму кола, наприклад, виберіть інші фігури, наприклад Коло.

Box Collider 2D Оскільки компонент буде доданий, з параметрів відзначте пункт "Зробити тригер". Це дозволить отримати інформацію тільки про те, «потрапили ви чи ні».

Rigidbody 2D Потім додайте компоненти . Ви можете додати його з "Фізика 2D -> Rigidbody 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 нескінченно малий, сам метод викликати не буде.