Determinați dacă obiectele se ciocnesc între ele (2D)
Mediul de verificare
- Windows
-
- Ferestre 11
- Unity Editor
-
- 2021.3.3F1
- Pachet sistem de intrare
-
- 1.3.0
Cerințe preliminare pentru acest sfat
Următoarele setări au fost făcute în avans ca premisă pentru descrierea acestui sfat.
La început
Acest sfat explică cum să determinați dacă două obiecte sunt în contact. Mutați un obiect cu tastatura.
Pregătire
După crearea proiectului, pregătiți două imagini ale personajului care va fi obiectul. Dacă sunteți dificil de pregătit, puteți plasa două personaje identice, dar de data aceasta le vom separa pentru claritate. Numele sunt "UnityTips" și, respectiv, "UnityTips_2".
Adăugați două fișiere imagine plasându-le în vizualizare.
Adăugați un script pentru a muta obiectul din stânga cu tastatura. Numele Player
scriptului este .
Conținutul scriptului este similar cu sfaturile din Mutarea, rotirea și scalarea unui personaj.
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);
}
}
}
Atașați la obiectul pe care doriți să executați scriptul.
Rulați jocul și verificați dacă funcționează cu tastele cursorului de pe tastatură.
În cele din urmă, plasați un obiect text pentru a afișa starea de detectare a coliziunii.
Numele TextState
obiectului este .
Setări de gestionare în caz de coliziune
De aici, puteți configura setările legate de coliziuni.
Mai întâi, selectați obiectul pe care doriți să îl mutați, "UnityTips", și faceți clic pe "Adăugați componentă" din inspector.
Selectați din Physics 2D
listă. Physics
este un obiect 3D, deci nu vă înșelați.
Physics 2D
Box Collider 2D
Selectați din . Deoarece acest personaj este dreptunghiular, este selectată opțiunea Casetă, dar dacă este în formă de cerc, de exemplu, selectați alte forme, cum ar fi Cerc.
Box Collider 2D
Deoarece componenta va fi adăugată, bifați "Declanșați-o" din parametri.
Acest lucru vă va permite să obțineți informații numai despre "dacă ați lovit sau nu".
Rigidbody 2D
Apoi adăugați componentele . Îl puteți adăuga din "Physics 2D -> Rigidbody 2D".
Rigidbody
oferă informațiiCollider
fizice obiectului și poate determina, de asemenea, coliziuni cu obiecte care au .
Rigidbody
Cu toate acestea, dacă aveți o componentă, aceasta va conține, de asemenea, informații gravitaționale în direcția -Y, deci dacă o executați, aceasta va cădea.
Deci, setați "Scara gravitației" la 0 din parametri.
Apropo, dacă este un joc de acțiune cu derulare laterală, poate fi convenabil să folosiți scara gravitațională în sensul că este cădere liberă.
În mod similar, adăugați o componentă la Box Collider 2D
celălalt obiect "UnityTips_2".
Aceasta este partea afectată de data aceasta, deci nu trebuie să modificați nicio setare.
Player
Deschideți scriptul și adăugați fiecare câmp și metodă utilizând după cum urmează:
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}";
}
}
Deoarece dorim să afișăm informații dacă a fost sau nu lovit, vom face posibilă afișarea acestuia într-un obiect text după cum urmează.
<summary>状態表示用テキストオブジェクト。</summary>
[SerializeField] private Text TextState;
Procesul de detectare a coliziunilor este descris după cum urmează.
<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
Fiecare dintre evenimentele de mai sus apare atunci când un obiect care s-a ciocnit cu un alt obiect Collider 2D
care are .
Acest lucru vă va permite să determinați și să procesați dacă este corect sau nu.
Există trei evenimente, fiecare dintre ele fiind convocat la următoarea oră.
OnTriggerEnter2D | Când obiectele se lovesc reciproc |
OnTriggerStay2D | În timp ce obiectele se lovesc reciproc |
OnTriggerExit2D | Când obiectele părăsesc starea de coliziune |
În ambele cazuri, obiectul adversarului primește obiectul adversarului ca argument, astfel încât să puteți obține obiectul adversarului Collider2D
căutând Collider2D.gameObject
tipul de țintă lovit de (inamic, Collider2D.tag
obiect etc.).
Dintre cele trei evenimente de OnTriggerEnter2D
mai sus, și OnTriggerExit2D
sunt apelate o dată pe coliziune.
OnTriggerStay2D
este numit fiecare cadru în timpul coliziunii, dar evenimentul nu mai este apelat după ce a trecut o anumită perioadă de timp de când ambele obiecte s-au oprit.
Acest lucru se datorează faptului că se consideră că a intrat într-o stare de somn și este considerat o risipă de procesare pentru a calcula coliziunile fiecărui cadru cu ceva care nu se mișcă.
Dacă nu doriți Rigidbody 2D
să doarmă, schimbați modul de repaus al parametrului la "Nu dormi".
După modificarea codului, setați textul pentru afișarea informațiilor.
Rulați jocul și mutați obiectul cu tastatura pentru a atinge un alt spirit. Puteți vedea că sunt necesare trei funcții pentru fiecare.
Apropo, dacă atingeți un obiect și apoi opriți mișcarea, metoda va fi apelată pentru OnTriggerStay2D
o perioadă scurtă de timp.
Ar trebui să puteți vedea că metoda nu mai este apelată după OnTriggerStay2D
o anumită perioadă de timp.
Aceasta indică faptul că ați introdus o stare de repaus, dar dacă doriți să modificați timpul până când intrați în acest somn, îl puteți schimba selectând "Fizică 2D" din setările proiectului și specificând parametrul "Timp de somn" în secunde.
Nu poate fi setat la 0, dar dacă OnTriggerStay2D
este setat la infinit de mic, metoda însăși nu va fi numită.