Determinați dacă obiectele se ciocnesc între ele (2D)

Pagina actualizată :
Data creării paginii :

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 2DBox 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ă.