Determinare se gli oggetti si scontrano tra loro (2D)
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 2D
Box 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.