Χειρισμός σύγκρουσης με τυπική φυσική (2D)

Σελίδα ενημέρωση :
Ημερομηνία δημιουργίας σελίδας :

Περιβάλλον επαλήθευσης

παράθυρα
  • Παράθυρα 11
Επεξεργαστής ενότητας
  • 2021.3.3στ1
Πακέτο συστήματος εισόδου
  • 1.3.0

Προϋποθέσεις για αυτήν τη συμβουλή

Οι ακόλουθες ρυθμίσεις έχουν γίνει εκ των προτέρων ως προϋπόθεση για την περιγραφή αυτής της συμβουλής.

Αρχικά

Αυτή η συμβουλή τοποθετεί δύο αντικείμενα έτσι ώστε να μπορείτε να εφαρμόσετε τη συμπεριφορά του χειρισμού ενός αντικειμένου και της χρήσης της τυπικής φυσικής του Unity για να ωθήσετε το άλλο όταν έρχεται σε επαφή με το άλλο.

Παρεμπιπτόντως, οι περισσότερες από τις ρυθμίσεις είναι οι ίδιες με τη διαδικασία που περιγράφεται στο προηγούμενο άρθρο "Προσδιορισμός εάν τα αντικείμενα συγκρούονται μεταξύ τους (2D)".

Ετοιμασία

Η διαδικασία εδώ είναι σχεδόν η ίδια με τις προηγούμενες συμβουλές , οπότε ας το ρέουμε ομαλά.

Μετά τη δημιουργία του έργου, προετοίμασε δύο εικόνες αντικειμένων που θα είναι αντικείμενα και πρόσθεσε τις. Τα ονόματα είναι "UnityTips" και "UnityTips_2" αντίστοιχα.

Προσθέστε δύο αρχεία εικόνας αποθέτοντάς τα στην προβολή.

Προσθέστε μια δέσμη ενεργειών για να μετακινήσετε το αριστερό αντικείμενο με το πληκτρολόγιο. Το όνομα Player του σεναρίου είναι .

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);
    }
  }
}

Επισύναψη στο αντικείμενο στο οποίο θέλετε να εκτελέσετε τη δέσμη ενεργειών.

Εκτελέστε το παιχνίδι και ελέγξτε αν λειτουργεί με τα πλήκτρα δρομέα στο πληκτρολόγιό σας.

Τέλος, τοποθετήστε ένα αντικείμενο κειμένου για να εμφανίσετε την κατάσταση ανίχνευσης σύγκρουσης. Το όνομα TextState του αντικειμένου είναι .

Ρυθμίσεις χειρισμού σύγκρουσης

Από εδώ, μπορείτε να διαμορφώσετε τις ρυθμίσεις που σχετίζονται με συγκρούσεις.

Πρώτα, επιλέξτε το αντικείμενο που θέλετε να μετακινήσετε, "UnityTips" και κάντε κλικ στο "Add Component" από τον επιθεωρητή. Επιλέξτε από Physics 2D τη λίστα. Physics είναι ένα αντικείμενο 3D, οπότε μην κάνετε κανένα λάθος.

Physics 2DBox Collider 2D Επιλέξτε από . Δεδομένου ότι αυτό το αντικείμενο είναι ορθογώνιο, επιλέγεται το Box, αλλά αν έχει σχήμα κύκλου, για παράδειγμα, επιλέξτε άλλα σχήματα όπως Circle.

Την τελευταία φορά, ήθελα να λάβω πληροφορίες μόνο για το αν το χτύπησα ή όχι, οπότε έλεγξα "Make it trigger", αλλά αυτή τη φορά δεν θα το κάνω. Αυτό επιτρέπει το χειρισμό συγκρούσεων στη φυσική.

Rigidbody 2D Στη συνέχεια, προσθέστε τα στοιχεία του . Μπορείτε να το προσθέσετε από το "Physics 2D -> Rigidbody 2D". Rigidbody δίνει πληροφορίεςCollider φυσικής στο αντικείμενο και μπορεί επίσης να προσδιορίσει συγκρούσεις με αντικείμενα που έχουν .

Ρυθμίστε την κλίμακα βαρύτητας στο 0 για να αποφύγετε την ελεύθερη πτώση κάτω.

Ομοίως, προσθέστε ένα στοιχείο στο άλλο αντικείμενο "UnityTips_2" για να επισημάνετε Box Collider 2D επισκέψεις.

Επιπλέον, αυτή τη φορά είναι απαραίτητο να κινηθείτε με τη δύναμη του αντιπάλου,Rigidbody 2D οπότε προσθέστε . Η κλίμακα βαρύτητας πρέπει να είναι 0.

Αυτό είναι όλο. Δεν απαιτείται πρόγραμμα αυτήν τη στιγμή. Εκτελέστε το παιχνίδι και προσπαθήστε να αγγίξετε ένα άλλο αντικείμενο.

Νομίζω ότι μπορείτε να επιβεβαιώσετε ότι αν σπρώξετε τον αντίπαλο έτσι, ο αντίπαλος θα συμπεριφερθεί σαν να πιέζεται. Είναι πολύ εύκολο να χρησιμοποιήσετε τη φυσική της τυπικής συνάρτησης επειδή δεν απαιτείται πρόγραμμα.

Αποτροπή περιστροφής αντικειμένων

Μπορείτε να δείτε πότε το αγγίζετε, αλλά αν το σημείο επιτυχίας μετατοπιστεί έστω και ελαφρώς, κάθε αντικείμενο θα περιστραφεί. Ως παιχνίδι, συχνά γίνεται αφύσικο, οπότε πρέπει να το ρυθμίσετε έτσι ώστε να μην περιστρέφεται.

Rigidbody 2D Το στοιχείο έχει ένα στοιχείο που ονομάζεται "Σταθερή περιστροφή" στο "Περιορισμοί", οπότε ελέγξτε το Z. Τώρα μπορείτε να εργαστείτε έτσι ώστε να μην περιστρέφεται. Δοκιμάστε να το ορίσετε σε δύο αντικείμενα και να εκτελέσετε το παιχνίδι για να το ελέγξετε.

Νομίζω ότι μπορείτε να είστε σίγουροι ότι δεν περιστρέφεται ανεξάρτητα από τη γωνία από την οποία το πιέζετε.

Κάντε κάτι όταν τα αντικείμενα χτυπούν το ένα το άλλο

Για παράδειγμα, μπορεί να θέλετε να εφαρμόσετε μια σφαίρα που χτυπά έναν εχθρό ενώ σπρώχνει τον αντίπαλο μειώνοντας παράλληλα την υγεία του εχθρού. Αυτό είναι το ίδιο με τις προηγούμενες συμβουλές , καθώς το συμβάν θα συμβεί, ώστε να μπορείτε να το αντιμετωπίσετε.

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 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}";
  }
}

Δεδομένου ότι θέλουμε να εμφανίσουμε πληροφορίες σχετικά με το αν χτυπήθηκε ή όχι, θα καταστήσουμε δυνατή την εμφάνισή του σε ένα αντικείμενο κειμένου ως εξής.

/// <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}";
}

Παρόμοια με τις προηγούμενες συμβουλές------, αλλά το όνομα της μεθόδου είναι τώρα "OnCollision------2D" αντί για "OnTrigger2D".

Rigidbody 2D Κάθε ένα από τα παραπάνω συμβάντα συμβαίνει όταν ένα αντικείμενο που έχει συγκρούεται με ένα άλλο αντικείμενο Collider 2D που έχει . Αυτό θα σας επιτρέψει να προσδιορίσετε και να επεξεργαστείτε εάν είναι σωστό ή όχι.

Υπάρχουν τρία γεγονότα, καθένα από τα οποία καλείται στο ακόλουθο χρονοδιάγραμμα.

OnCollisionEnter2D Όταν τα αντικείμενα χτυπούν το ένα το άλλο
OnCollisionStay2D Ενώ τα αντικείμενα χτυπούν το ένα το άλλο
OnCollisionExit2D Όταν τα αντικείμενα εγκαταλείπουν την κατάσταση σύγκρουσης

Και στις δύο περιπτώσεις, το αντικείμενο του αντιπάλου λαμβάνει το αντικείμενο του αντιπάλου ως επιχείρημα, οπότε μπορείτε να πάρετε το αντικείμενο του Collision2D αντιπάλου αναζητώντας Collider2D.gameObject τον τύπο του στόχου που χτυπήθηκε από (εχθρός, Collider2D.collider.tag αντικείμενο κ.λπ.).

Από τα OnCollisionEnter2D παραπάνω τρία γεγονότα, και OnCollisionExit2D καλούνται μία φορά ανά σύγκρουση.

OnCollisionStay2D ονομάζεται κάθε καρέ κατά τη διάρκεια της σύγκρουσης, αλλά το συμβάν δεν καλείται πλέον αφού έχει περάσει ένα ορισμένο χρονικό διάστημα από τότε που σταμάτησαν και τα δύο αντικείμενα. Αυτό συμβαίνει επειδή θεωρείται ότι έχει εισέλθει σε κατάσταση ύπνου και θεωρείται σπατάλη επεξεργασίας για τον υπολογισμό συγκρούσεων κάθε καρέ με κάτι που δεν κινείται.

Εάν δεν θέλετε Rigidbody 2D να τεθεί σε αναστολή λειτουργίας, αλλάξτε τη λειτουργία αναστολής λειτουργίας της παραμέτρου σε "Μην κοιμάστε".

Αφού αλλάξετε τον κώδικα, ορίστε το κείμενο για την εμφάνιση πληροφοριών.

Τρέξε το παιχνίδι και μετακίνησε το αντικείμενο με το πληκτρολόγιο για να αγγίξεις ένα άλλο αντικείμενο. Μπορείτε να δείτε ότι καλούνται τρεις λειτουργίες για κάθε μία.

Παρεμπιπτόντως, εάν αγγίξετε ένα αντικείμενο και στη συνέχεια σταματήσετε να κινείστε, η μέθοδος θα κληθεί για OnCollisionStay2D μικρό χρονικό διάστημα. Θα πρέπει να μπορείτε να δείτε ότι η μέθοδος δεν καλείται πλέον μετά από OnCollisionStay2D ένα ορισμένο χρονικό διάστημα.

Αυτό υποδεικνύει ότι έχετε εισέλθει σε κατάσταση αναστολής λειτουργίας, αλλά εάν θέλετε να αλλάξετε την ώρα μέχρι να εισέλθετε σε αυτήν την κατάσταση αναστολής λειτουργίας, μπορείτε να την αλλάξετε επιλέγοντας "2D Physics" από τις ρυθμίσεις του έργου και καθορίζοντας την παράμετρο "Χρόνος ύπνου" σε δευτερόλεπτα. Δεν μπορεί να οριστεί σε 0, αλλά εάν OnCollisionStay2D έχει οριστεί σε απείρως μικρό, η ίδια η μέθοδος δεν θα κληθεί.