Εφαρμογή ανίχνευσης χτυπήματος με tilemaps

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

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

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

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

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

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

Σχετικά με το δανεισμό υλικού χαρτών

Επεξεργαζόμαστε δανεισμό από τους ακόλουθους ιστότοπους.

Εφαρμογή χαρακτήρων πεζοπορίας

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

Εάν θέλετε να εφαρμόσετε κινούμενες εικόνες πεζοπορίας, ανατρέξτε στις παρακάτω συμβουλές:

Αφού δημιουργήσεις το έργο, πρόσθεσε μια εικόνα αντικειμένου του αντικειμένου που θέλεις να μετακινήσεις στο έργο.

Επιλέξτε την εικόνα και ορίστε την τιμή "Pixel Per Unit" σε 32 από το εργαλείο επιθεώρησης. Αυτό συμβαίνει επειδή το μέγεθος ενός τετραγώνου του mapchip είναι 32 pixel, οπότε ταιριάζει σε αυτό. Μόλις ρυθμιστεί, κάντε κλικ στο κουμπί "Εφαρμογή" παρακάτω.

Τοποθέτησε το αντικείμενο στην προβολή.

Δημιούργησε ένα σενάριο για να μετακινήσεις το αντικείμενο. Αυτό είναι παρόμοιο με τις ακόλουθες συμβουλές:

Αφήστε το όνομα 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);
    }
  }
}

Προσκολλήσου στο αντικείμενο που θέλεις να μετακινήσεις.

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

Προετοιμασία MapTips

Πρώτα απ 'όλα, θα ετοιμάσουμε ένα mapchip και θα δημιουργήσουμε έναν χάρτη. Αυτή η διαδικασία είναι παρόμοια με τις ακόλουθες συμβουλές: MapTips με 2D Tilemap Extras είναι επίσης σε θέση να ανίχνευση σύγκρουσης, αλλά δεν θα χρησιμοποιηθούν σε αυτό το άρθρο, επειδή η διαδικασία θα είναι μεγάλη.

Προετοιμάστε την αρχική εικόνα του MapTip και προσθέστε το στο έργο σας. Για να γίνει η λειτουργία πιο κατανοητή, προετοιμάστε ένα "walkable place" και ένα "non-walkable place" για το υλικό του τσιπ χάρτη.

Ρυθμίστε το για MapChips στον Επιθεωρητή και κάντε κλικ στο κουμπί Εφαρμογή. Μόλις ρυθμιστεί, άνοιξε το Sprite Editor.

Είναι ένα maptip 32 pixel, οπότε θα το χωρίσω στα 32.

Επιλέξτε την καρτέλα Παλέτα πλακιδίων. Εάν όχι, εμφανίστε το με "Window > 2D -> Tile Palette" από το μενού. Δημιουργήστε μια νέα παλέτα. Το όνομα είναι αυθαίρετο, αλλά προς το παρόν θα το ονομάσουμε "MapChipPalette".

Δημιουργήστε ένα φάκελο MapChipPalette στις σκηνές και καθορίστε τον.

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

Δημιουργία χάρτη

Αυτή τη φορά, η κρίση χτυπήματος χάρτη θα εκτελεστεί σε μονάδες του "Tilemap". Επομένως, θα δημιουργήσουμε δύο Tilemaps, "Tilemap χωρίς ανίχνευση χτυπήματος" και "Tilemap με ανίχνευση επίσκεψης".

Αρχικά, δημιουργήστε δύο Tilemap στην ιεραρχία. Μπορείτε να δημιουργήσετε δύο στο πλέγμα. Τα ονόματα είναι "TilemapObeject" και "TilemapGround" για λόγους σαφήνειας.

Αρχικά, δημιουργήστε ένα "TilemapGround". Δεδομένου ότι είναι ένα κινητό εύρος, μπορείτε απλά να βάλετε το έδαφος. Εάν βρίσκεται στο έδαφος, μπορείτε να αλλάξετε το μοτίβο.

Παρεμπιπτόντως, εάν ο χαρακτήρας είναι κρυφός, επιλέξτε το αντικείμενο χαρακτήρα και ορίστε τη σειρά επιπέδων του Sprite Renderer επιθεωρητή σε 2. Η σειρά των επιπέδων είναι 0 από προεπιλογή και το Tilemap είναι 0, οπότε αν το αυξήσετε πάνω από αυτήν την τιμή, θα εμφανιστεί στο προσκήνιο.

Στη συνέχεια, επιλέξτε TilemapObject και τοποθετήστε το maptip που θέλετε να κάνετε ακίνητο. Ορίστε πρώτα τη σειρά επιπέδων σε 1. Αυτό γίνεται για να εμφανιστεί μπροστά στο έδαφος.

Έτσι μοιάζει αν κρύβετε το έδαφος.

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

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

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

Επιλέξτε ένα αντικείμενο χαρακτήρα από την ιεραρχία και επιλέξτε Physics 2D -> Circle Collider 2D από το Add Component. Εάν το σχήμα του αντικειμένου είναι ορθογώνιο, το "Box Collider 2D" είναι εντάξει.

Ομοίως, προσθέστε "Physics 2D -> Rigidbody 2D".

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

Τσέκαρε το Z κάτω από τους Περιορισμούς για να αποτρέψεις την περιστροφή του αντικειμένου όταν συγκρούεται.

Στη συνέχεια, επιλέξτε "TilemapObject" που θέλετε να χτυπήσετε και επιλέξτε "Tilemap -> Tilemap Collider 2D" από το "Add Component".

Αυτό είναι όλο. Δεν χρειάζεστε καν προγραμματισμό. Εκτελέστε το παιχνίδι και προσπαθήστε να χτυπήσετε το αντικείμενο που γίνεται ο τοίχος. Νομίζω ότι μπορείτε να βεβαιωθείτε ότι σταματά σωστά.

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

Άβολη συμπεριφορά ανίχνευσης χτυπήματος με το χάρτη και τις λύσεις

Όταν χτυπάτε έναν τοίχο, μπορεί να βρείτε μερικά πράγματα που σας ενοχλούν.

Αν κινηθείτε ενάντια στον τοίχο, θα πιαστείτε στη μέση

Box Collider 2D Νομίζω ότι θα συμβεί αν χρησιμοποιείτε ένα αντικείμενο.

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

Αναγνωρίστε τα βαθουλώματα στους τοίχους ανά θέση

Circle Collider 2D Νομίζω ότι είναι εύκολο να καταλάβουμε αν επισυνάψετε . Ο τοίχος πρέπει να είναι επίπεδος, αλλά αν τον μετακινήσετε στον τοίχο, θα δείτε ότι ο τοίχος κινείται σαν να είναι ανομοιογενής.

Αιτίες και λύσεις σε χτυπήματα και προσκρούσεις

Ο λόγος για τον οποίο συμβαίνουν αυτά φαίνεται να είναι ότι "ο προσδιορισμός χτυπήματος εκτελείται σε βάση mapchip". Στην πραγματικότητα, όταν επιλέγετε TilemapObject, εμφανίζεται μια πράσινη γραμμή στο σημείο όπου βρίσκεται η ανίχνευση επίσκεψης και μπορείτε να δείτε ότι αυτή είναι μια γραμμή που σχεδιάζεται σε μονάδες MapTip.

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

Νομίζω ότι ο καλύτερος τρόπος για να λύσετε αυτό το πρόβλημα είναι να συνδυάσετε την ανίχνευση χτυπήματος με τα συνημμένα mapchips. Δείτε πώς να το κάνετε:

ΕπιλέξτεTilemap Collider 2D "TilemapObject" με ανίχνευση χτυπήματος από τον επιθεωρητή και ελέγξτε "Χρήση σε σύνθετο" από το .

Όπως αναφέρεται στην προειδοποίηση, αυτό από μόνο του δεν έχει καμία επίδραση, οπότε επιλέξτε "Physics 2D -> Composite Collider 2D" από το "Add Component".

Το Rigidbody 2D προστίθεται μαζί με το Composite Collider 2D.

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

Δεν θέλω να μετακινηθεί το tilemap, οπότε θα Rigidbody 2D αφήσω τον τύπο σώματος του συστατικού ως "στατικό".

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

Εξαλείψτε τις ωθήσεις χαρακτήρων πίσω από τοίχους

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

Για να το λύσετε,Rigidbody 2D επιλέξτε το αντικείμενο χαρακτήρα και αλλάξτε την "Ανίχνευση σύγκρουσης" σε "Συνεχής" από το στοιχείο.

Η διαφορά μεταξύ "ασυνεχούς" και "συνεχούς" έχει ως εξής.

Ασυνεχής

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

Συνεχής

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

Παγιδευμένο στη γωνία ενός αντικειμένου χάρτη

Ανάλογα με το πρόγραμμα και την τοποθεσία, μερικοί πιάνονται και μερικοί όχι, και η αιτία δεν έχει αλλάξει πολύ. Παρεμπιπτόντως, συμβαίνει με γωνιακές γωνίες όπως το Box Collider 2D και όχι με στρογγυλεμένους κύκλους.

Ακόμα κι αν συμβεί ένα τέτοιο μυστηριώδες φαινόμενο, καλό είναι να έχετε στρογγυλεμένες γωνίες του επιταχυντή για να αποφύγετε τα χτυπήματα. Περιορίζεται στο Box Collider 2D, αλλά για να το κάνετε στρογγυλό, το στοιχείο Box Collider 2D του αντικειμένου χαρακτήρα έχει μια "ακτίνα ακμής" και βάζετε μια τιμή εκεί. Εάν εισαγάγετε το 1 ως αριθμητική μονάδα, θα πραγματοποιηθεί στρογγυλοποίηση για το μέγεθος του αντικειμένου. Εξαρτάται από το μέγεθος, αλλά είναι καλό να βάλετε περίπου 0,1.

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

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