Manejo de colisiones con física estándar (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 coloca dos objetos para que puedas implementar el comportamiento de manipular un objeto y usar la física estándar de Unity para empujar el otro cuando entra en contacto con el otro.

Por cierto, la mayoría de las configuraciones son las mismas que el procedimiento descrito en el artículo anterior "Determinar si los objetos chocan entre sí (2D)".

Preparación

El procedimiento aquí es casi el mismo que los consejos anteriores , así que vamos a fluir sin problemas.

Después de crear el proyecto, prepare dos imágenes de sprites que serán objetos y agréguelas. 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 .

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

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.

La última vez, quería obtener información solo sobre si lo golpeé o no, así que marqué "Hacer que se dispare", pero esta vez no lo haré. Esto permite el manejo de colisiones en física.

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 .

Establezca la escala de gravedad en 0 para evitar la caída libre por debajo.

Del mismo modo, agregue un componente al otro objeto "UnityTips_2" para marcar Box Collider 2D los hits.

Además, esta vez es necesario moverse con la fuerza del oponente,Rigidbody 2D así que agregue . La escala de gravedad debe ser 0.

Eso es todo lo que hay que hacer. No se requiere ningún programa en este momento. Ejecuta el juego e intenta tocar otro objeto.

Creo que puedes confirmar que si empujas al oponente de esta manera, el oponente se comportará como si fuera empujado. Es muy fácil usar la física de la función estándar porque no se requiere ningún programa.

Impedir que los objetos giren

Puedes ver cuando lo tocas, pero si el punto de golpe cambia incluso ligeramente, cada objeto girará. Como juego, a menudo se vuelve antinatural, por lo que debe configurarlo para que no gire.

Rigidbody 2D El componente tiene un elemento llamado "Rotación fija" en "Restricciones", así que marque Z. Ahora puedes trabajar para que no gire. Intenta configurarlo en dos objetos y ejecutar el juego para comprobarlo.

Creo que puedes estar seguro de que no gira sin importar desde qué ángulo lo empujes.

Hacer algo cuando los objetos se golpean entre sí

Por ejemplo, es posible que desee implementar una bala que golpee a un enemigo mientras empuja al oponente mientras reduce la salud del enemigo. Esto es lo mismo que los consejos anteriores , ya que el evento ocurrirá, por lo que puede lidiar con él.

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

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

Similar a los consejos anteriores------, pero el nombre del método ahora es "OnCollision------2D" en lugar de "OnTrigger2D".

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.

OnCollisionEnter2D Cuando los objetos chocan entre sí
OnCollisionStay2D Mientras los objetos se golpean entre sí
OnCollisionExit2D 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 Collision2D oponente buscando Collider2D.gameObject el tipo de objetivo alcanzado por (enemigo, objeto, Collider2D.collider.tag etc.).

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

OnCollisionStay2D 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 OnCollisionStay2D un corto tiempo. Debería poder ver que el método ya no se llama después OnCollisionStay2D 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 OnCollisionStay2D establece en infinitamente pequeño, no se llamará al método en sí.