Определяне дали обектите се сблъскват един с друг (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 е избран, но ако е с кръгла форма, например, изберете други фигури като Circle.

Box Collider 2D Тъй като компонентът ще бъде добавен, проверете "Make it trigger" от параметрите. Това ще ви позволи да получите информация само за това "дали сте ударили или не".

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 е настроен на безкрайно малък, самият метод няма да бъде извикан.