Determinar si los objetos chocan entre sí (2D)
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 2D
Box 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í.