Feststellen, ob Objekte miteinander kollidieren (2D)
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 2D
Box 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.