Bepalen of objecten met elkaar botsen (2D)

Pagina bijgewerkt :
Aanmaakdatum van pagina :

Verificatieomgeving

Ramen
  • Voor Windows 11
Unity Editor
  • 2021.3.3f1
Input systeem pakket
  • 1.3.0

Vereisten voor deze tip

De volgende instellingen zijn vooraf gemaakt als uitgangspunt voor de beschrijving van deze tip.

Eerst

In deze tip wordt uitgelegd hoe u kunt bepalen of twee objecten met elkaar in contact zijn. Eén object verplaatsen met het toetsenbord.

Voorbereiding

Nadat u het project hebt gemaakt, bereidt u twee afbeeldingen voor van de sprite die het object zal zijn. Als je lastig te bereiden bent, kun je twee identieke sprites plaatsen, maar deze keer zullen we ze voor de duidelijkheid scheiden. De namen zijn respectievelijk "UnityTips" en "UnityTips_2".

Voeg twee afbeeldingsbestanden toe door ze in de weergave neer te zetten.

Voeg een script toe om het linkerobject met het toetsenbord te verplaatsen. De scriptnaam Player is . De scriptinhoud is vergelijkbaar met de tips in Een sprite verplaatsen, roteren en schalen.

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

Koppel aan het object waarop u het script wilt uitvoeren.

Voer het spel uit en controleer of het werkt met de cursortoetsen op uw toetsenbord.

Plaats ten slotte een tekstobject om de botsingsdetectiestatus weer te geven. De objectnaam TextState is .

Instellingen voor botsingsafhandeling

Vanaf hier kunt u de instellingen met betrekking tot botsingen configureren.

Selecteer eerst het object dat u wilt verplaatsen, "UnityTips", en klik op "Component toevoegen" in de inspecteur. Maak een keuze uit Physics 2D de lijst. Physics is een 3D-object, dus vergis je niet.

Physics 2DBox Collider 2D Kies uit . Aangezien deze sprite rechthoekig is, is Box geselecteerd, maar als deze bijvoorbeeld cirkelvormig is, selecteert u andere vormen zoals Cirkel.

Box Collider 2D Aangezien de component wordt toegevoegd, vinkt u "Make it trigger" aan in de parameters. Hiermee kunt u alleen informatie krijgen over "of u raakt of niet".

Rigidbody 2D Voeg vervolgens de componenten van . Je kunt het toevoegen vanuit "Physics 2D -> Rigidbody 2D". Rigidbody geeft natuurkundige informatieCollider aan het object en kan ook botsingen bepalen met objecten die .

Rigidbody Als je echter een component hebt, bevat deze ook zwaartekrachtinformatie in de -Y-richting, dus als je het uitvoert, valt het naar beneden. Dus stel de "Gravity Scale" in op 0 van de parameters.

Trouwens, als het een side-scrolling actiespel is, kan het handig zijn om de zwaartekrachtschaal te gebruiken in de zin dat het een vrije val naar beneden is.

Voeg op dezelfde manier een component toe aan het Box Collider 2D andere object "UnityTips_2". Dit is deze keer de getroffen kant, dus u hoeft geen instellingen te wijzigen.

Player Open het script en voeg elk veld en elke methode als volgt toe:

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

Omdat we informatie willen weergeven over het al dan niet raken ervan, maken we het mogelijk om het als volgt in een tekstobject weer te geven.

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

Het botsingsdetectieproces wordt als volgt beschreven.

/// <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 Elk van de bovenstaande gebeurtenissen treedt op wanneer een object dat is gebotst met een ander object Collider 2D dat . Hiermee kunt u bepalen en verwerken of het correct is of niet.

Er zijn drie gebeurtenissen, die elk op het volgende tijdstip worden aangeroepen.

OnTriggerEnter2D Wanneer objecten elkaar raken
OnTriggerStay2D Terwijl objecten elkaar raken
OnTriggerExit2D Wanneer objecten de botsingsstatus verlaten

In beide gevallen ontvangt het object van de tegenstander het object van de tegenstander als argument, zodat je het object van Collider2D de tegenstander kunt krijgen door het type doel op Collider2D.gameObject te zoeken dat door wordt geraakt (vijand, item, Collider2D.tag enz.).

Van de OnTriggerEnter2D bovenstaande drie gebeurtenissen, en OnTriggerExit2D worden één keer per botsing genoemd.

OnTriggerStay2D wordt tijdens de botsing elk frame aangeroepen, maar de gebeurtenis wordt niet meer aangeroepen nadat er een bepaalde tijd is verstreken sinds beide objecten zijn gestopt. Dit komt omdat het wordt beschouwd als in een slaaptoestand en het wordt beschouwd als een verspilling van verwerking om botsingen elk frame te berekenen met iets dat niet beweegt.

Als u niet wilt dat het slaapt, wijzigt u Rigidbody 2D de slaapmodus van de parameter in "Niet slapen".

Nadat u de code hebt gewijzigd, stelt u de tekst in voor het weergeven van informatie.

Voer het spel uit en verplaats het object met het toetsenbord om een andere sprite aan te raken. Je kunt zien dat er voor elk drie functies worden aangeroepen.

Trouwens, als u een object aanraakt en vervolgens stopt met bewegen, wordt de methode voor OnTriggerStay2D een korte tijd aangeroepen. Je zou moeten kunnen zien dat de methode na OnTriggerStay2D een bepaalde tijd niet meer wordt aangeroepen.

Dit geeft aan dat u een slaapstand hebt ingevoerd, maar als u de tijd wilt wijzigen totdat u deze slaapstand invoert, kunt u deze wijzigen door "2D-fysica" te selecteren in de projectinstellingen en de parameter "Slaaptijd" in seconden op te geven. Het kan niet worden ingesteld op 0, maar als het OnTriggerStay2D is ingesteld op oneindig klein, wordt de methode zelf niet aangeroepen.