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