Feststellen, ob Objekte miteinander kollidieren (2D)

Diese Seite wurde aktualisiert :
Erstellungsdatum der Seite :

Verifizierungsumgebung

Fenster
  • Windows 11
Unity-Editor
  • 2021.3.3f1
Eingabesystem-Paket
  • 1.3.0

Voraussetzungen für diesen Tipp

Die folgenden Einstellungen wurden im Vorfeld als Prämisse für die Beschreibung dieses Tipps vorgenommen.

Zuerst

In diesem Tipp wird erläutert, wie Sie feststellen können, ob zwei Objekte in Kontakt sind. Verschieben Sie ein Objekt mit der Tastatur.

Präparat

Nachdem Sie das Projekt erstellt haben, bereiten Sie zwei Bilder des Sprites vor, das das Objekt sein wird. Wenn Sie sich mühsam vorbereiten müssen, können Sie zwei identische Sprites platzieren, aber dieses Mal werden wir sie aus Gründen der Übersichtlichkeit trennen. Die Namen lauten "UnityTips" bzw. "UnityTips_2".

Fügen Sie zwei Bilddateien hinzu, indem Sie sie in der Ansicht ablegen.

Fügen Sie ein Skript hinzu, um das linke Objekt mit der Tastatur zu verschieben. Der Skriptname Player lautet . Der Inhalt des Skripts ähnelt den Tipps unter Verschieben, Drehen und Skalieren eines Sprites.

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

Hängen Sie an das Objekt an, für das Sie das Skript ausführen möchten.

Starten Sie das Spiel und prüfen Sie, ob es mit den Cursortasten auf Ihrer Tastatur funktioniert.

Platzieren Sie abschließend ein Textobjekt, um den Status der Kollisionserkennung anzuzeigen. Der Objektname TextState lautet .

Einstellungen für die Kollisionsbehandlung

Von hier aus können Sie die Einstellungen für Kollisionen konfigurieren.

Wählen Sie zunächst das Objekt aus, das Sie verschieben möchten, "UnityTips", und klicken Sie im Inspektor auf "Komponente hinzufügen". Wählen Sie aus der Liste aus Physics 2D . Physics ist ein 3D-Objekt, also täuschen Sie sich nicht.

Physics 2DBox Collider 2D Wählen Sie aus . Da dieses Sprite rechteckig ist, ist Box ausgewählt, aber wenn es z. B. kreisförmig ist, wählen Sie andere Formen wie Kreis aus.

Box Collider 2D Da die Komponente hinzugefügt wird, aktivieren Sie in den Parametern die Option "Auslösen lassen". Auf diese Weise erhalten Sie nur Informationen darüber, "ob Sie getroffen haben oder nicht".

Rigidbody 2D Fügen Sie dann die Komponenten von . Sie können es aus "Physics 2D -> Rigidbody 2D" hinzufügen. Rigidbody Gibt dem Objekt physikalische InformationenCollider und kann auch Kollisionen mit Objekten bestimmen, die .

Rigidbody Wenn Sie jedoch eine Komponente haben, enthält sie auch Schwerkraftinformationen in -Y-Richtung, d. h. wenn Sie sie ausführen, fällt sie herunter. Setzen Sie also die "Gravity Scale" von den Parametern auf 0.

Übrigens, wenn es sich um ein Side-Scrolling-Actionspiel handelt, kann es praktisch sein, die Schwerkraftskala in dem Sinne zu verwenden, dass es sich um einen freien Fall handelt.

Fügen Sie auf Box Collider 2D ähnliche Weise eine Komponente zum anderen Objekt "UnityTips_2" hinzu. Dies ist diesmal die betroffene Seite, sodass Sie keine Einstellungen ändern müssen.

Player Öffnen Sie das Skript, und fügen Sie jedes Feld und jede Methode wie folgt hinzu:

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

Da wir Informationen darüber anzeigen möchten, ob es getroffen wurde oder nicht, ermöglichen wir es wie folgt, es in einem Textobjekt anzuzeigen.

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

Der Prozess der Kollisionserkennung wird wie folgt beschrieben.

/// <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 Jedes der oben genannten Ereignisse tritt auf, wenn ein Objekt, das über verfügt, mit einem anderen Objekt Collider 2D kollidiert, das . Auf diese Weise können Sie feststellen und verarbeiten, ob es korrekt ist oder nicht.

Es gibt drei Ereignisse, von denen jedes zum folgenden Zeitpunkt aufgerufen wird.

OnTriggerEnter2D Wenn Objekte aufeinander treffen
OnTriggerStay2D Während Objekte aufeinander treffen
OnTriggerExit2D Wenn Objekte den Kollisionszustand verlassen

In beiden Fällen erhält das gegnerische Objekt das gegnerische Objekt als Argument, so dass Sie das gegnerische Collider2D Objekt erhalten können, indem Sie die Art des getroffenen Ziels (Feind, Gegenstand usw.) nachschlagenCollider2D.gameObject. Collider2D.tag

Von den OnTriggerEnter2D drei oben genannten Ereignissen werden und OnTriggerExit2D werden einmal pro Kollision aufgerufen.

OnTriggerStay2D wird in jedem Frame während der Kollision aufgerufen, aber das Ereignis wird nicht mehr aufgerufen, nachdem eine bestimmte Zeit vergangen ist, seit beide Objekte gestoppt wurden. Dies liegt daran, dass davon ausgegangen wird, dass es in einen Ruhezustand eingetreten ist, und es wird als Verschwendung der Verarbeitung angesehen, Kollisionen mit jedem Frame mit etwas zu berechnen, das sich nicht bewegt.

Wenn Sie nicht möchten, dass es schläft, ändern Sie Rigidbody 2D den Schlafmodus des Parameters auf "Nicht schlafen".

Nachdem Sie den Code geändert haben, legen Sie den Text für die Anzeige von Informationen fest.

Führe das Spiel aus und bewege das Objekt mit der Tastatur, um ein anderes Sprite zu berühren. Sie können sehen, dass für jede drei Funktionen aufgerufen werden.

Übrigens, wenn Sie ein Objekt berühren und sich dann nicht mehr bewegen, wird die Methode für OnTriggerStay2D kurze Zeit aufgerufen. Sie sollten sehen können, dass die Methode nach OnTriggerStay2D einer bestimmten Zeit nicht mehr aufgerufen wird.

Dies zeigt an, dass Sie in einen Ruhezustand eingetreten sind, aber wenn Sie die Zeit bis zum Eintritt in diesen Ruhezustand ändern möchten, können Sie dies ändern, indem Sie in den Projekteinstellungen "2D-Physik" auswählen und den Parameter "Schlafzeit" in Sekunden angeben. Sie kann nicht auf 0 gesetzt werden, aber wenn sie OnTriggerStay2D auf unendlich klein gesetzt ist, wird die Methode selbst nicht aufgerufen.