Προσδιορισμός εάν τα αντικείμενα συγκρούονται μεταξύ τους (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 2DBox 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 έχει οριστεί σε απείρως μικρό, η ίδια η μέθοδος δεν θα κληθεί.