Objektide üksteisega kokkupõrke kindlakstegemine (2D)

Lehekülg uuendatud :
Lehe loomise kuupäev :

Kontrollimise keskkond

Windows
  • Windows 11
Ühtsuse toimetaja
  • 2021.3.3f1
Sisendsüsteemi pakett
  • 1.3.0

Selle näpunäite eeltingimused

Selle vihje kirjeldamise eelduseks on eelnevalt tehtud järgmised sätted.

Alguses

See näpunäide selgitab, kuidas teha kindlaks, kas kaks objekti on kontaktis. Ühe objekti teisaldamine klaviatuuri abil

Ettevalmistus

Pärast projekti loomist valmistage ette kaks pilti spraidist, mis on objekt. Kui teil on tülikas valmistada, võite paigutada kaks identset spraiti, kuid seekord eraldame need selguse huvides. Nimed on vastavalt "UnityTips" ja "UnityTips_2".

Lisage kaks pildifaili, kukutades need vaatesse.

Lisage skript, et liigutada vasakut objekti klaviatuuriga. Skripti nimi Player on . Skripti sisu on sarnane spraidi teisaldamise, pööramise ja skaleerimise näpunäidetega.

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

Manustage objektile, millel soovite skripti käivitada.

Käivitage mäng ja kontrollige, kas see töötab klaviatuuri kursoriklahvidega.

Lõpuks asetage kokkupõrke tuvastamise oleku kuvamiseks tekstiobjekt. Objekti nimi TextState on .

Kokkupõrke käsitsemise seaded

Siit saate konfigureerida kokkupõrgetega seotud seadeid.

Esiteks valige objekt, mida soovite liigutada, "UnityTips" ja klõpsake inspektorilt "Lisa komponent". Valige loendist Physics 2D . Physics on 3D-objekt, nii et ärge tehke viga.

Physics 2DBox Collider 2D Valige . Kuna see sprait on ristkülikukujuline, on ruut valitud, kuid kui see on näiteks ringikujuline, valige muud kujundid, näiteks Ring.

Box Collider 2D Kuna komponent lisatakse, kontrollige parameetritest "Tee see päästikuks". See võimaldab teil saada teavet ainult selle kohta, kas sa tabasid või mitte.

Rigidbody 2D Seejärel lisage komponendid . Saate selle lisada jaotisest "Physics 2D -> Rigidbody 2D". Rigidbody annab objektile füüsikateavetCollider ja võib määrata ka kokkupõrkeid objektidega, millel on .

Rigidbody Kui teil on aga komponent, sisaldab see ka gravitatsiooniteavet Y-suunas, nii et kui te seda täidate, langeb see alla. Nii et seadke parameetritest "Gravitatsiooni skaala" väärtusele 0.

Muide, kui see on külglibisev põnevusmäng, võib olla mugav kasutada gravitatsiooniskaalat selles mõttes, et see on vaba kukkumine.

Samamoodi lisage komponent teisele objektile Box Collider 2D "UnityTips_2". See on seekord mõjutatud pool, nii et te ei pea seadeid muutma.

Player Avage skript ja lisage iga väli ja meetod, kasutades järgmist:

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

Kuna tahame kuvada teavet selle kohta, kas see tabas või mitte, võimaldame seda tekstiobjektis kuvada järgmiselt.

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

Kokkupõrke tuvastamise protsessi kirjeldatakse järgmiselt.

/// <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 Kõik ülaltoodud sündmused toimuvad siis, kui objekt, mis on kokku põrganud teise objektiga Collider 2D , millel on . See võimaldab teil kindlaks teha ja töödelda, kas see on õige või mitte.

On kolm sündmust, millest igaüks kutsutakse järgmisel ajal.

OnTriggerEnter2D Kui objektid üksteist tabavad
OnTriggerStay2D Samal ajal kui objektid üksteist löövad
OnTriggerExit2D Kui objektid lahkuvad kokkupõrke olekust

Mõlemal juhul saab vastase objekt argumendina vastase objekti, nii et saate vastase objekti, Collider2D otsides üles Collider2D.gameObject tabatud sihtmärgi tüübi (vaenlane, Collider2D.tag ese jne).

Ülaltoodud kolmest sündmusest OnTriggerEnter2D ja OnTriggerExit2D neid nimetatakse üks kord kokkupõrke kohta.

OnTriggerStay2D nimetatakse kokkupõrke ajal igaks kaadriks, kuid sündmust ei kutsuta enam pärast teatud aja möödumist mõlema objekti peatumisest. Seda seetõttu, et seda peetakse uneseisundisse sisenenuks ja seda peetakse töötlemise raiskamiseks, et arvutada iga kaadri kokkupõrked millegagi, mis ei liigu.

Kui te Rigidbody 2D ei soovi, et see magaks, muutke parameetri unerežiim "Ära maga".

Pärast koodi muutmist määrake teabe kuvamiseks tekst.

Käivitage mäng ja liigutage objekti klaviatuuriga, et puudutada teist spraiti. Näete, et igaühe jaoks on vaja kolme funktsiooni.

Muide, kui puudutate objekti ja seejärel lõpetate liikumise, kutsutakse meetod lühikeseks OnTriggerStay2D ajaks. Teil peaks olema võimalik näha, et meetodit teatud aja pärast OnTriggerStay2D enam ei kutsuta.

See näitab, et olete sisenenud uneolekusse, kuid kui soovite muuta aega, kuni sisestate selle une, saate seda muuta, valides projekti seadetest "2D füüsika" ja määrates parameetri "Uneaeg" sekundites. Seda ei saa seada väärtusele 0, kuid kui see OnTriggerStay2D on seatud lõpmata väikeseks, siis meetodit ise ei kutsuta.