Determinare se gli oggetti si scontrano tra loro (2D)

Pagina aggiornata :
Data di creazione della pagina :

Ambiente di verifica

Finestre
  • Windows 11
Unity Editor
  • 2021.3.3f1
Pacchetto del sistema di input
  • 1.3.0

Prerequisiti per questo suggerimento

Le seguenti impostazioni sono state effettuate in anticipo come premessa per la descrizione di questo suggerimento.

Dapprima

Questo suggerimento spiega come determinare se due oggetti sono in contatto. Spostare un oggetto con la tastiera.

Preparazione

Dopo aver creato il progetto, prepara due immagini dello sprite che sarà l'oggetto. Se hai problemi a prepararti, puoi posizionare due sprite identici, ma questa volta li separeremo per chiarezza. I nomi sono rispettivamente "UnityTips" e "UnityTips_2".

Aggiungere due file di immagine rilasciandoli nella vista.

Aggiungere uno script per spostare l'oggetto sinistro con la tastiera. Il nome Player dello script è . Il contenuto dello script è simile ai suggerimenti descritti in Spostare, ruotare e ridimensionare uno 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);
    }
  }
}

Connettersi all'oggetto su cui si desidera eseguire lo script.

Esegui il gioco e controlla se funziona con i tasti cursore sulla tastiera.

Infine, posizionare un oggetto di testo per visualizzare lo stato di rilevamento delle collisioni. Il nome TextState dell'oggetto è .

Impostazioni di gestione delle collisioni

Da qui, è possibile configurare le impostazioni relative alle collisioni.

Innanzitutto, seleziona l'oggetto che desideri spostare, "UnityTips", e fai clic su "Aggiungi componente" dall'ispettore. Selezionare dall'elenco Physics 2D . Physics è un oggetto 3D, quindi non commettere errori.

Physics 2DBox Collider 2D Selezionare da . Poiché questo sprite è rettangolare, Box è selezionato, ma se è a forma di cerchio, ad esempio, selezionare altre forme come Cerchio.

Box Collider 2D Poiché il componente verrà aggiunto, selezionare "Make it trigger" dai parametri. Ciò ti consentirà di ottenere informazioni solo su "se colpisci o meno".

Rigidbody 2D Quindi aggiungere i componenti di . Puoi aggiungerlo da "Fisica 2D -> Rigidbody 2D". Rigidbody fornisce informazioniCollider fisiche all'oggetto e può anche determinare collisioni con oggetti che hanno .

Rigidbody Tuttavia, se si dispone di un componente, conterrà anche informazioni sulla gravità nella direzione -Y, quindi se lo si esegue, cadrà. Quindi imposta la "Scala di gravità" su 0 dai parametri.

A proposito, se si tratta di un gioco d'azione a scorrimento laterale, potrebbe essere conveniente usare la scala di gravità nel senso che è caduta libera.

Analogamente, aggiungere un componente all'altro Box Collider 2D oggetto "UnityTips_2". Questa volta questo è il lato interessato, quindi non è necessario modificare alcuna impostazione.

Player Aprire lo script e aggiungere ogni campo e metodo utilizzando come segue:

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

Poiché vogliamo visualizzare informazioni sul fatto che sia stato colpito o meno, renderemo possibile visualizzarlo in un oggetto di testo come segue.

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

Il processo di rilevamento delle collisioni è descritto come segue.

/// <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 Ciascuno degli eventi precedenti si verifica quando un oggetto che si è scontrato con un altro oggetto Collider 2D che ha . Ciò ti consentirà di determinare ed elaborare se è corretto o meno.

Ci sono tre eventi, ognuno dei quali è chiamato al seguente orario.

OnTriggerEnter2D Quando gli oggetti si colpiscono a vicenda
OnTriggerStay2D Mentre gli oggetti si colpiscono a vicenda
OnTriggerExit2D Quando gli oggetti lasciano lo stato di collisione

In entrambi i casi, l'oggetto avversario riceve l'oggetto dell'avversario come argomento, quindi puoi ottenere l'oggetto dell'avversario Collider2D cercando Collider2D.gameObject il tipo di bersaglio colpito da (nemico, oggetto, Collider2D.tag ecc.).

Dei OnTriggerEnter2D tre eventi precedenti, e sono chiamati una volta per collisione OnTriggerExit2D .

OnTriggerStay2D viene chiamato ogni fotogramma durante la collisione, ma l'evento non viene più chiamato dopo che è trascorso un certo periodo di tempo da quando entrambi gli oggetti si sono fermati. Questo perché si ritiene che sia entrato in uno stato di sonno, ed è considerato uno spreco di elaborazione calcolare le collisioni ogni fotogramma con qualcosa che non si muove.

Se non vuoi Rigidbody 2D che dorma, cambia la modalità di sospensione del parametro in "Non dormire".

Dopo aver modificato il codice, impostare il testo per la visualizzazione delle informazioni.

Esegui il gioco e sposta l'oggetto con la tastiera per toccare un altro sprite. Puoi vedere che sono chiamate tre funzioni per ciascuna.

A proposito, se tocchi un oggetto e poi smetti di muoverti, il metodo verrà chiamato per OnTriggerStay2D un breve periodo. Dovresti essere in grado di vedere che il metodo non viene più chiamato dopo OnTriggerStay2D un certo periodo di tempo.

Questo indica che sei entrato in uno stato di sospensione, ma se vuoi cambiare il tempo fino a quando non entri in questo sospensione, puoi modificarlo selezionando "Fisica 2D" dalle impostazioni del progetto e specificando il parametro "Tempo di sonno" in secondi. Non può essere impostato su 0, ma se OnTriggerStay2D è impostato su infinitamente piccolo, il metodo stesso non verrà chiamato.