Determinar si los objetos chocan entre sí (2D)

Actualización de la página :
Fecha de creación de la página :

Entorno de verificación

Windows
  • Ventanas 11
Unity Editor
  • 2021.3.3F1
Paquete del sistema de entrada
  • 1.3.0

Requisitos previos para esta sugerencia

Los siguientes ajustes se han realizado de antemano como premisa para la descripción de este consejo.

Al principio

Este consejo explica cómo determinar si dos objetos están en contacto. Mueva un objeto con el teclado.

Preparación

Después de crear el proyecto, prepare dos imágenes del sprite que será el objeto. Si le resulta difícil prepararse, puede colocar dos sprites idénticos, pero esta vez los separaremos para mayor claridad. Los nombres son "UnityTips" y "UnityTips_2" respectivamente.

Agregue dos archivos de imagen soltándolos en la vista.

Agregue un script para mover el objeto izquierdo con el teclado. El nombre Player del script es . El contenido del script es similar a las sugerencias de Mover, rotar y escalar un sprite.

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);
    }
  }
}

Adjunte al objeto en el que desea ejecutar el script.

Ejecuta el juego y comprueba si funciona con las teclas del cursor del teclado.

Finalmente, coloque un objeto de texto para mostrar el estado de detección de colisión. El nombre TextState del objeto es .

Configuración de manejo de colisiones

Desde aquí, puede configurar los ajustes relacionados con las colisiones.

Primero, seleccione el objeto que desea mover, "UnityTips", y haga clic en "Agregar componente" en el inspector. Seleccione de Physics 2D la lista. Physics es un objeto 3D, así que no te equivoques.

Physics 2DBox Collider 2D Seleccione entre . Dado que este sprite es rectangular, se selecciona Caja, pero si tiene forma de círculo, por ejemplo, seleccione otras formas como Círculo.

Box Collider 2D Dado que se agregará el componente, marque "Hacer que se active" en los parámetros. Esto le permitirá obtener información solo sobre "si golpea o no".

Rigidbody 2D A continuación, agregue los componentes de . Puedes añadirlo desde "Física 2D -> Rigidbody 2D". Rigidbody Proporciona informaciónCollider física al objeto y también puede determinar colisiones con objetos que tienen .

Rigidbody Sin embargo, si tiene un componente, también contendrá información de gravedad en la dirección -Y, por lo que si lo ejecuta, se caerá. Así que establezca la "Escala de gravedad" en 0 a partir de los parámetros.

Por cierto, si se trata de un juego de acción de desplazamiento lateral, puede ser conveniente usar la escala de gravedad en el sentido de que es caída libre.

Del mismo modo, agregue un componente al Box Collider 2D otro objeto "UnityTips_2". Este es el lado afectado esta vez, por lo que no necesita cambiar ninguna configuración.

Player Abra el script y agregue cada campo y método de la siguiente manera:

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}";
  }
}

Como queremos mostrar información sobre si fue golpeado o no, haremos posible mostrarlo en un objeto de texto de la siguiente manera.

/// <summary>状態表示用テキストオブジェクト。</summary>
[SerializeField] private Text TextState;

El proceso de detección de colisiones se describe a continuación.

/// <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 Cada uno de los eventos anteriores se produce cuando un objeto que ha colisionado con otro objeto Collider 2D que tiene . Esto le permitirá determinar y procesar si es correcto o no.

Hay tres eventos, cada uno de los cuales se llama en el siguiente momento.

OnTriggerEnter2D Cuando los objetos chocan entre sí
OnTriggerStay2D Mientras los objetos se golpean entre sí
OnTriggerExit2D Cuando los objetos abandonan el estado de colisión

En ambos casos, el objeto oponente recibe el objeto del oponente como argumento, por lo que puede obtener el objeto del Collider2D oponente buscando Collider2D.gameObject el tipo de objetivo alcanzado por (enemigo, objeto, Collider2D.tag etc.).

De los OnTriggerEnter2D tres eventos anteriores, y OnTriggerExit2D se llaman una vez por colisión.

OnTriggerStay2D se llama cada fotograma durante la colisión, pero el evento ya no se llama después de que haya pasado un cierto período de tiempo desde que ambos objetos se detuvieron. Esto se debe a que se considera que ha entrado en un estado de suspensión, y se considera un desperdicio de procesamiento calcular colisiones cada fotograma con algo que no se mueve.

Si no desea que Rigidbody 2D se duerma, cambie el modo de suspensión del parámetro a "No dormir".

Después de cambiar el código, establezca el texto para mostrar información.

Ejecuta el juego y mueve el objeto con el teclado para tocar otro sprite. Puede ver que se llaman tres funciones para cada una.

Por cierto, si toca un objeto y luego deja de moverse, se llamará al método por OnTriggerStay2D un corto tiempo. Debería poder ver que el método ya no se llama después OnTriggerStay2D de un cierto período de tiempo.

Esto indica que ha entrado en un estado de suspensión, pero si desea cambiar la hora hasta que entre en esta suspensión, puede cambiarla seleccionando "Física 2D" en la configuración del proyecto y especificando el parámetro "Tiempo de suspensión" en segundos. No se puede establecer en 0, pero si se OnTriggerStay2D establece en infinitamente pequeño, no se llamará al método en sí.