Determinar se os objetos colidem entre si (2D)
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 2D
Box 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.