Προσδιορισμός εάν τα αντικείμενα συγκρούονται μεταξύ τους (2D)
Περιβάλλον επαλήθευσης
- παράθυρα
-
- Παράθυρα 11
- Επεξεργαστής ενότητας
-
- 2021.3.3στ1
- Πακέτο συστήματος εισόδου
-
- 1.3.0
Προϋποθέσεις για αυτήν τη συμβουλή
Οι ακόλουθες ρυθμίσεις έχουν γίνει εκ των προτέρων ως προϋπόθεση για την περιγραφή αυτής της συμβουλής.
Αρχικά
Αυτή η συμβουλή εξηγεί πώς μπορείτε να προσδιορίσετε εάν δύο αντικείμενα βρίσκονται σε επαφή. Μετακινήστε ένα αντικείμενο με το πληκτρολόγιο.
Ετοιμασία
Αφού δημιουργήσεις το έργο, προετοίμασε δύο εικόνες του αντικειμένου που θα είναι το αντικείμενο. Εάν είστε ενοχλητικοί για να προετοιμαστείτε, μπορείτε να τοποθετήσετε δύο πανομοιότυπα sprites, αλλά αυτή τη φορά θα τα χωρίσουμε για λόγους σαφήνειας. Τα ονόματα είναι "UnityTips" και "UnityTips_2" αντίστοιχα.
Προσθέστε δύο αρχεία εικόνας αποθέτοντάς τα στην προβολή.
Προσθέστε μια δέσμη ενεργειών για να μετακινήσετε το αριστερό αντικείμενο με το πληκτρολόγιο. Το όνομα Player
του σεναρίου είναι .
Το περιεχόμενο του σεναρίου είναι παρόμοιο με τις συμβουλές στο Move, rotate and scale a sprite.
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);
}
}
}
Επισύναψη στο αντικείμενο στο οποίο θέλετε να εκτελέσετε τη δέσμη ενεργειών.
Εκτελέστε το παιχνίδι και ελέγξτε αν λειτουργεί με τα πλήκτρα δρομέα στο πληκτρολόγιό σας.
Τέλος, τοποθετήστε ένα αντικείμενο κειμένου για να εμφανίσετε την κατάσταση ανίχνευσης σύγκρουσης.
Το όνομα TextState
του αντικειμένου είναι .
Ρυθμίσεις χειρισμού σύγκρουσης
Από εδώ, μπορείτε να διαμορφώσετε τις ρυθμίσεις που σχετίζονται με συγκρούσεις.
Πρώτα, επιλέξτε το αντικείμενο που θέλετε να μετακινήσετε, "UnityTips" και κάντε κλικ στο "Add Component" από τον επιθεωρητή.
Επιλέξτε από Physics 2D
τη λίστα. Physics
είναι ένα αντικείμενο 3D, οπότε μην κάνετε κανένα λάθος.
Physics 2D
Box Collider 2D
Επιλέξτε από . Δεδομένου ότι αυτό το αντικείμενο είναι ορθογώνιο, επιλέγεται το Box, αλλά αν έχει σχήμα κύκλου, για παράδειγμα, επιλέξτε άλλα σχήματα όπως Circle.
Box Collider 2D
Δεδομένου ότι το στοιχείο θα προστεθεί, επιλέξτε "Κάντε το να ενεργοποιηθεί" από τις παραμέτρους.
Αυτό θα σας επιτρέψει να λάβετε πληροφορίες μόνο για το "αν χτυπήσατε ή όχι".
Rigidbody 2D
Στη συνέχεια, προσθέστε τα στοιχεία του . Μπορείτε να το προσθέσετε από το "Physics 2D -> Rigidbody 2D".
Rigidbody
δίνει πληροφορίεςCollider
φυσικής στο αντικείμενο και μπορεί επίσης να προσδιορίσει συγκρούσεις με αντικείμενα που έχουν .
Rigidbody
Ωστόσο, εάν έχετε ένα στοιχείο, θα περιέχει επίσης πληροφορίες βαρύτητας στην κατεύθυνση -Y, οπότε αν το εκτελέσετε, θα πέσει κάτω.
Ρυθμίστε λοιπόν την "Κλίμακα βαρύτητας" στο 0 από τις παραμέτρους.
Παρεμπιπτόντως, εάν πρόκειται για παιχνίδι δράσης πλευρικής κύλισης, μπορεί να είναι βολικό να χρησιμοποιήσετε την κλίμακα βαρύτητας με την έννοια ότι είναι ελεύθερη πτώση κάτω.
Ομοίως, προσθέστε ένα στοιχείο στο Box Collider 2D
άλλο αντικείμενο "UnityTips_2".
Αυτή είναι η πληγείσα πλευρά αυτή τη φορά, επομένως δεν χρειάζεται να αλλάξετε καμία ρύθμιση.
Player
Ανοίξτε τη δέσμη ενεργειών και προσθέστε κάθε πεδίο και μέθοδο χρησιμοποιώντας τα εξής:
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}";
}
}
Δεδομένου ότι θέλουμε να εμφανίσουμε πληροφορίες σχετικά με το αν χτυπήθηκε ή όχι, θα καταστήσουμε δυνατή την εμφάνισή του σε ένα αντικείμενο κειμένου ως εξής.
<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}";
}
Rigidbody 2D
Κάθε ένα από τα παραπάνω συμβάντα συμβαίνει όταν ένα αντικείμενο που έχει συγκρούεται με ένα άλλο αντικείμενο Collider 2D
που έχει .
Αυτό θα σας επιτρέψει να προσδιορίσετε και να επεξεργαστείτε εάν είναι σωστό ή όχι.
Υπάρχουν τρία γεγονότα, καθένα από τα οποία καλείται στο ακόλουθο χρονοδιάγραμμα.
OnTriggerEnter2D | Όταν τα αντικείμενα χτυπούν το ένα το άλλο |
OnTriggerStay2D | Ενώ τα αντικείμενα χτυπούν το ένα το άλλο |
OnTriggerExit2D | Όταν τα αντικείμενα εγκαταλείπουν την κατάσταση σύγκρουσης |
Και στις δύο περιπτώσεις, το αντικείμενο του αντιπάλου λαμβάνει το αντικείμενο του αντιπάλου ως επιχείρημα, οπότε μπορείτε να πάρετε το αντικείμενο του Collider2D
αντιπάλου αναζητώντας Collider2D.gameObject
τον τύπο του στόχου που χτυπήθηκε από (εχθρός, Collider2D.tag
αντικείμενο κ.λπ.).
Από τα OnTriggerEnter2D
παραπάνω τρία γεγονότα, και OnTriggerExit2D
καλούνται μία φορά ανά σύγκρουση.
OnTriggerStay2D
ονομάζεται κάθε καρέ κατά τη διάρκεια της σύγκρουσης, αλλά το συμβάν δεν καλείται πλέον αφού έχει περάσει ένα ορισμένο χρονικό διάστημα από τότε που σταμάτησαν και τα δύο αντικείμενα.
Αυτό συμβαίνει επειδή θεωρείται ότι έχει εισέλθει σε κατάσταση ύπνου και θεωρείται σπατάλη επεξεργασίας για τον υπολογισμό συγκρούσεων κάθε καρέ με κάτι που δεν κινείται.
Εάν δεν θέλετε Rigidbody 2D
να τεθεί σε αναστολή λειτουργίας, αλλάξτε τη λειτουργία αναστολής λειτουργίας της παραμέτρου σε "Μην κοιμάστε".
Αφού αλλάξετε τον κώδικα, ορίστε το κείμενο για την εμφάνιση πληροφοριών.
Τρέξε το παιχνίδι και μετακίνησε το αντικείμενο με το πληκτρολόγιο για να αγγίξεις ένα άλλο αντικείμενο. Μπορείτε να δείτε ότι καλούνται τρεις λειτουργίες για κάθε μία.
Παρεμπιπτόντως, εάν αγγίξετε ένα αντικείμενο και στη συνέχεια σταματήσετε να κινείστε, η μέθοδος θα κληθεί για OnTriggerStay2D
μικρό χρονικό διάστημα.
Θα πρέπει να μπορείτε να δείτε ότι η μέθοδος δεν καλείται πλέον μετά από OnTriggerStay2D
ένα ορισμένο χρονικό διάστημα.
Αυτό υποδεικνύει ότι έχετε εισέλθει σε κατάσταση αναστολής λειτουργίας, αλλά εάν θέλετε να αλλάξετε την ώρα μέχρι να εισέλθετε σε αυτήν την κατάσταση αναστολής λειτουργίας, μπορείτε να την αλλάξετε επιλέγοντας "2D Physics" από τις ρυθμίσεις του έργου και καθορίζοντας την παράμετρο "Χρόνος ύπνου" σε δευτερόλεπτα.
Δεν μπορεί να οριστεί σε 0, αλλά εάν OnTriggerStay2D
έχει οριστεί σε απείρως μικρό, η ίδια η μέθοδος δεν θα κληθεί.