Determinar se os objetos colidem entre si (2D)

Página atualizada :
Data de criação de página :

Ambiente de verificação

Windows
  • Janelas 11
Unity Editor
  • 2021.3.3f1
Pacote do sistema de entrada
  • 1.3.0

Pré-requisitos para esta dica

As configurações a seguir foram feitas com antecedência como premissa para a descrição desta dica.

Inicialmente

Esta dica explica como determinar se dois objetos estão em contato. Mover um objeto com o teclado.

Preparação

Depois de criar o projeto, prepare duas imagens do sprite que será o objeto. Se você é problemático para preparar, você pode colocar dois sprites idênticos, mas desta vez vamos separá-los para clareza. Os nomes são "UnityTips" e "UnityTips_2", respectivamente.

Adicione dois arquivos de imagem soltando-os na exibição.

Adicione um script para mover o objeto esquerdo com o teclado. O nome Player do script é . O conteúdo do script é semelhante às dicas em Mover, girar e dimensionar um 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);
    }
  }
}

Anexe ao objeto no qual você deseja executar o script.

Execute o jogo e verifique se ele funciona com as teclas do cursor no teclado.

Finalmente, coloque um objeto de texto para exibir o status de detecção de colisão. O nome do TextState objeto é .

Configurações de manipulação de colisão

A partir daqui, você pode definir as configurações relacionadas a colisões.

Primeiro, selecione o objeto que deseja mover, "UnityTips", e clique em "Add Component" no inspetor. Physics 2D Selecione na lista. Physics é um objeto 3D, então não se engane.

Physics 2DBox Collider 2D Selecione a partir de . Como esse sprite é retangular, Box é selecionado, mas se ele estiver em forma de círculo, por exemplo, selecione outras formas, como Circle.

Box Collider 2D Como o componente será adicionado, marque "Acioná-lo" nos parâmetros. Isso permitirá que você obtenha informações apenas sobre "se você acertou ou não".

Rigidbody 2D Em seguida, adicione os componentes do . Você pode adicioná-lo a partir de "Physics 2D -> Rigidbody 2D". Rigidbody dá informaçõesCollider físicas ao objeto e também pode determinar colisões com objetos que têm .

Rigidbody No entanto, se você tiver um componente, ele também conterá informações de gravidade na direção -Y, portanto, se você executá-lo, ele cairá. Portanto, defina a "Escala de gravidade" como 0 a partir dos parâmetros.

A propósito, se for um jogo de ação de rolagem lateral, pode ser conveniente usar a escala de gravidade no sentido de que é queda livre.

Da mesma forma, adicione um componente ao Box Collider 2D outro objeto "UnityTips_2". Este é o lado afetado desta vez, então você não precisa alterar nenhuma configuração.

Player Abra o script e adicione cada campo e método usando o seguinte:

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 exibir informações sobre se ele foi atingido ou não, faremos com que seja possível exibi-lo em um objeto de texto da seguinte maneira.

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

O processo de detecção de colisão é descrito a seguir.

/// <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 um dos eventos acima ocorre quando um objeto que colide com outro objeto Collider 2D que tem . Isso permitirá que você determine e processe se está correto ou não.

Há três eventos, cada um dos quais é chamado no momento seguinte.

OnTriggerEnter2D Quando os objetos batem uns nos outros
OnTriggerStay2D Enquanto os objetos estão batendo uns nos outros
OnTriggerExit2D Quando os objetos saem do estado de colisão

Em ambos os casos, o objeto do oponente recebe o objeto do oponente como um argumento, então você pode obter o objeto do Collider2D oponente procurando Collider2D.gameObject o tipo de alvo atingido por (inimigo, item, Collider2D.tag etc.).

Dos OnTriggerEnter2D três eventos acima, e OnTriggerExit2D são chamados uma vez por colisão.

OnTriggerStay2D é chamado de cada quadro durante a colisão, mas o evento não é mais chamado depois de um certo período de tempo desde que ambos os objetos pararam. Isso ocorre porque é considerado ter entrado em um estado de sono, e é considerado um desperdício de processamento calcular colisões a cada quadro com algo que não está se movendo.

Se você Rigidbody 2D não quiser que ele entre em suspensão, altere o modo de suspensão do parâmetro para "Não dormir".

Depois de alterar o código, defina o texto para exibir informações.

Execute o jogo e mova o objeto com o teclado para tocar em outro sprite. Você pode ver que três funções são chamadas para cada uma.

A propósito, se você tocar em um objeto e, em seguida, parar de se mover, o método será chamado por OnTriggerStay2D um curto período de tempo. Você deve ser capaz de ver que o método não é mais chamado após OnTriggerStay2D um certo período de tempo.

Isso indica que você entrou em um estado de suspensão, mas se quiser alterar o tempo até entrar nessa suspensão, poderá alterá-lo selecionando "Física 2D" nas configurações do projeto e especificando o parâmetro "Tempo de suspensão" em segundos. Ele não pode ser definido como 0, mas se for OnTriggerStay2D definido como infinitamente pequeno, o método em si não será chamado.