Kollisionsbehandlung mit Standardphysik (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

Mit diesem Tipp werden zwei Objekte so platziert, dass Sie das Verhalten implementieren können, ein Objekt zu manipulieren und die Standardphysik von Unity zu verwenden, um das andere Objekt zu pushen, wenn es mit dem anderen in Kontakt kommt.

Die meisten Einstellungen sind übrigens die gleichen wie im vorherigen Artikel "Feststellen, ob Objekte miteinander kollidieren (2D)" beschrieben.

Präparat

Das Verfahren hier ist fast das gleiche wie in den vorherigen Tipps , also lassen Sie es uns reibungslos fließen lassen.

Nachdem Sie das Projekt erstellt haben, bereiten Sie zwei Sprite-Bilder vor, die Objekte sein sollen, und fügen Sie sie hinzu. 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 .

using UnityEngine;
using UnityEngine.InputSystem;

public class Player : MonoBehaviour
{
  // 一定時間ごとに呼ばれます
  void FixedUpdate()
  {
    // キーボードの情報を取得
    var keyboard = Keyboard.current;

    // スプライトの移動処理
    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.

Beim letzten Mal wollte ich nur Informationen darüber erhalten, ob ich es getroffen habe oder nicht, also habe ich "Auslösen lassen" aktiviert, aber dieses Mal werde ich es nicht tun. Dies ermöglicht die Kollisionsbehandlung in der Physik.

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 .

Setzen Sie die Schwerkraftskala auf 0, um einen freien Fall darunter zu verhindern.

Fügen Sie auf ähnliche Weise dem anderen Objekt "UnityTips_2" eine Komponente hinzu, um Treffer zu markieren Box Collider 2D .

Außerdem ist es diesmal notwendig, sich mit der Kraft des Gegners zu bewegen,Rigidbody 2D also fügen Sie hinzu. Die Gravitationsskala sollte 0 sein.

Das ist alles, was dazu gehört. Derzeit ist kein Programm erforderlich. Starten Sie das Spiel und versuchen Sie, ein anderes Objekt zu berühren.

Ich denke, Sie können bestätigen, dass, wenn Sie den Gegner auf diese Weise hineinschieben, sich der Gegner so verhält, als ob er gestoßen würde. Es ist sehr einfach, die Physik der Standardfunktion zu verwenden, da kein Programm erforderlich ist.

Verhindern des Drehens von Objekten

Du kannst es sehen, wenn du es berührst, aber wenn sich der Trefferpunkt auch nur geringfügig verschiebt, dreht sich jedes Objekt. Als Spiel wird es oft unnatürlich, daher müssen Sie es so einstellen, dass es sich nicht dreht.

Rigidbody 2D Die Komponente hat ein Element namens "Feste Drehung" in "Abhängigkeiten", also aktivieren Sie Z. Jetzt können Sie so arbeiten, dass es sich nicht dreht. Versuchen Sie, es auf zwei Objekte einzustellen und das Spiel auszuführen, um es zu überprüfen.

Ich denke, Sie können sicher sein, dass es sich nicht dreht, egal aus welchem Winkel Sie es drücken.

Tun Sie etwas, wenn Gegenstände aufeinander treffen

Du könntest zum Beispiel eine Kugel einsetzen, die einen Feind trifft, während sie den Gegner stößt und gleichzeitig die Gesundheit des Gegners verringert. Dies ist dasselbe wie bei den vorherigen Tipps , da das Ereignis eintreten wird, sodass Sie damit umgehen können.

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 OnCollisionEnter2D(Collision2D partner)
  {
    TextState.text = $"OnCollisionEnter2D : {partner.collider.tag} {DateTime.Now:HH:mm:ss.fff}{Environment.NewLine}{TextState.text}";
  }

  /// <summary>衝突している間呼ばれます。ただしスリープモードになった場合は呼ばれません。</summary>
  /// <param name="partner">衝突した相手のコリジョン情報。</param>
  private void OnCollisionStay2D(Collision2D partner)
  {
    TextState.text = $"OnCollisionStay2D : {partner.collider.tag} {DateTime.Now:HH:mm:ss.fff}{Environment.NewLine}{TextState.text}";
  }

  /// <summary>衝突状態でなくなったタイミングで呼ばれます。</summary>
  /// <param name="partner">衝突した相手のコリジョン情報。</param>
  private void OnCollisionExit2D(Collision2D partner)
  {
    TextState.text = $"OnCollisionExit2D : {partner.collider.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 OnCollisionEnter2D(Collision2D partner)
{
  TextState.text = $"OnCollisionEnter2D : {partner.collider.tag} {DateTime.Now:HH:mm:ss.fff}{Environment.NewLine}{TextState.text}";
}

/// <summary>衝突している間呼ばれます。ただしスリープモードになった場合は呼ばれません。</summary>
/// <param name="partner">衝突した相手のコリジョン情報。</param>
private void OnCollisionStay2D(Collision2D partner)
{
  TextState.text = $"OnCollisionStay2D : {partner.collider.tag} {DateTime.Now:HH:mm:ss.fff}{Environment.NewLine}{TextState.text}";
}

/// <summary>衝突状態でなくなったタイミングで呼ばれます。</summary>
/// <param name="partner">衝突した相手のコリジョン情報。</param>
private void OnCollisionExit2D(Collision2D partner)
{
  TextState.text = $"OnCollisionExit2D : {partner.collider.tag} {DateTime.Now:HH:mm:ss.fff}{Environment.NewLine}{TextState.text}";
}

Ähnlich wie bei den vorherigen Tipps------, aber der Methodenname lautet jetzt "OnCollision------2D" statt "OnTrigger2D".

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.

OnCollisionEnter2D Wenn Objekte aufeinander treffen
OnCollisionStay2D Während Objekte aufeinander treffen
OnCollisionExit2D Wenn Objekte den Kollisionszustand verlassen

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

Von den OnCollisionEnter2D drei oben genannten Ereignissen werden und OnCollisionExit2D werden einmal pro Kollision aufgerufen.

OnCollisionStay2D 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 OnCollisionStay2D kurze Zeit aufgerufen. Sie sollten sehen können, dass die Methode nach OnCollisionStay2D 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 OnCollisionStay2D auf unendlich klein gesetzt ist, wird die Methode selbst nicht aufgerufen.