Implementieren Sie die Treffererkennung mit Tilemaps
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.
Was sind die Voraussetzungen für diesen Tipp?
- Erstellen einer Top-Down-2D-Karte mit standardmäßigen Unity-Tilemaps
- Kollisionsbehandlung mit Standardphysik (2D)
Informationen zum Ausleihen von Kartenmaterialien
Wir verarbeiten Leihgaben von den folgenden Seiten.
Implementierung von Lauffiguren
Implementieren Sie zunächst eine Karte und einen Charakter, der die Treffererkennung durchführt. Dieses Zeichen kann mit den Cursortasten auf der Tastatur bewegt werden. Wenn Sie jedoch einen richtigen Spaziergang durchführen, wird er lang und weit von der Essenz der Buchtipps entfernt, daher werde ich dieses Mal nur ein einfaches einzelnes Bild verschieben.
Wenn Sie Gehanimationen implementieren möchten, beachten Sie die folgenden Tipps:
Nachdem Sie das Projekt erstellt haben, fügen Sie ein Sprite-Bild des Objekts hinzu, das Sie in das Projekt verschieben möchten.
Wählen Sie das Bild aus und stellen Sie die Pixel pro Einheit im Bereich "Informationen" auf 32 ein. Das liegt daran, dass die Größe eines Quadrats des Mapchips 32 Pixel beträgt, also passt es dazu. Klicken Sie nach der Konfiguration unten auf die Schaltfläche "Übernehmen".
Platzieren Sie die Figur in der Ansicht.
Erstellen Sie ein Skript, um die Figur zu verschieben. Dies ähnelt den folgenden Tipps:
Belassen Sie den Skriptnamen Player
auf .
Code wie folgt:
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);
}
}
}
Befestigen Sie es an der Figur, die Sie bewegen möchten.
Führen Sie das Spiel aus und prüfen Sie, ob Sie es mit der Tastatur bewegen möchten.
Vorbereiten von MapTips
Zuerst werden wir einen Mapchip vorbereiten und eine Karte erstellen. Dieses Verfahren ähnelt den folgenden Tipps: MapTips mit 2D-Tilemap Extras sind ebenfalls in der Lage, Kollisionen zu erkennen, werden aber in diesem Artikel nicht verwendet, da das Verfahren langwierig sein wird.
Bereiten Sie das Originalbild der MapTip vor, und fügen Sie es Ihrem Projekt hinzu. Um die Bedienung verständlicher zu machen, bereiten Sie bitte einen "begehbaren Ort" und einen "nicht begehbaren Ort" für das Kartenchip-Material vor.
Richten Sie es im Inspektor für MapChips ein und klicken Sie auf die Schaltfläche Übernehmen. Öffnen Sie nach der Konfiguration den Sprite-Editor.
Es ist ein 32-Pixel-Maptip, also werde ich ihn auf 32 aufteilen.
Wählen Sie die Registerkarte Kachelpalette aus. Wenn nicht, zeigen Sie es mit "Fenster > 2D -> Kachelpalette" aus dem Menü an. Erstellen Sie eine neue Palette. Der Name ist willkürlich, aber vorerst nennen wir es "MapChipPalette".
Erstellen Sie einen MapChipPalette-Ordner in Scenes, und geben Sie ihn an.
Fügen Sie einen Maptip hinzu, indem Sie ihn in die Palette ziehen. Speichern Sie es in dem MapChipPalette-Ordner, den Sie zuvor erstellt haben.
Erstellen einer Karte
Dieses Mal wird die Bewertung der Kartentreffer in Einheiten von "Tilemap" durchgeführt. Daher werden wir zwei Tilemaps erstellen, "Tilemap ohne Treffererkennung" und "Tilemap mit Treffererkennung".
Erstellen Sie zunächst zwei Tilemaps in der Hierarchie. Sie können zwei im Raster erstellen. Die Namen lauten "TilemapObeject" und "TilemapGround" zur Verdeutlichung.
Erstellen Sie zunächst einen "TilemapGround". Da es sich um einen beweglichen Bereich handelt, können Sie den Boden einfach verlegen. Wenn es sich auf dem Boden befindet, können Sie das Muster ändern.
Übrigens, wenn die Figur ausgeblendet ist, wählen Sie das Figurenobjekt aus und setzen Sie die Ebenenreihenfolge des Sprite Renderer
Inspektors auf 2.
Die Reihenfolge der Ebenen ist standardmäßig 0 und die Tilemap ist 0, d.h. wenn Sie sie über diesen Wert hinaus erhöhen, wird sie im Vordergrund angezeigt.
Wählen Sie dann TilemapObject aus, und platzieren Sie den Maptip, den Sie bewegungsunfähig machen möchten. Legen Sie zuerst die Ebenenreihenfolge auf 1 fest. Dies dient dazu, es vor dem Boden erscheinen zu lassen.
So sieht es aus, wenn man den Boden verbirgt.
Natürlich gibt es zu diesem Zeitpunkt keine Einstellungen für die Kollisionserkennung, sodass Sie normal auf hohem Gelände fahren können. Danach stellen wir die Kollisionserkennung ein.
Einstellungen für die Kollisionserkennung
Lassen Sie uns zunächst den Charakter einrichten. Diese Einstellung entspricht fast den folgenden Tipps, daher überspringe ich die Details und erkläre kurz das Verfahren.
Wählen Sie ein Figurenobjekt aus der Hierarchie aus und wählen Sie Physics 2D -> Circle Collider 2D unter Add Component aus. Wenn die Form des Objekts rechteckig ist, ist "Box Collider 2D" in Ordnung.
Fügen Sie in ähnlicher Weise "Physics 2D -> Rigidbody 2D" hinzu.
Stellen Sie die Schwerkraftskala auf 0, um einen automatischen Sturz zu verhindern Rigidbody 2D
.
Aktivieren Sie Z unter Beschränkungen, um zu verhindern, dass sich das Sprite bei einer Kollision dreht.
Wählen Sie als Nächstes "TilemapObject" aus, auf das Sie klicken möchten, und wählen Sie "Tilemap -> Tilemap Collider 2D" unter "Add Component" aus.
Das ist alles, was dazu gehört. Sie benötigen nicht einmal eine Programmierung. Führe das Spiel aus und versuche, das Objekt zu treffen, das zur Wand wird. Ich denke, Sie können sicherstellen, dass es richtig stoppt.
Wenn Sie es jedoch tatsächlich treffen, denke ich, dass es im Verhalten besorgniserregende Punkte geben wird. Hier sind einige Lösungen:
Ungünstiges Verhalten der Treffererkennung mit der Karte und Lösungen
Wenn du gegen eine Wand stößt, findest du vielleicht ein paar Dinge, die dich stören.
Wenn du dich gegen die Wand bewegst, wirst du in der Mitte hängen bleiben
Box Collider 2D
Ich denke, es wird passieren, wenn Sie ein Objekt verwenden.
Wenn Sie z. B. in der folgenden Szene die Taste unten links drücken, soll sie entlang der Wand nach links verschoben werden. Nach einigen Fortschritten denke ich jedoch, dass es in etwas stecken bleibt und aufhört.
Erkennen von Dellen in Wänden anhand der Position
Circle Collider 2D
Ich denke, es ist leicht zu verstehen, wenn Sie .
Die Wand sollte flach sein, aber wenn Sie sie gegen die Wand bewegen, werden Sie sehen, dass sich die Wand so bewegt, als ob sie uneben wäre.
Ursachen und Lösungen für Probleme und Unebenheiten
Der Grund, warum diese auftreten, scheint zu sein, dass "die Trefferbestimmung auf Mapchip-Basis durchgeführt wird". Wenn Sie TilemapObject auswählen, wird an der Stelle, an der sich die Treffererkennung befindet, eine grüne Linie angezeigt, und Sie können sehen, dass es sich um eine Linie handelt, die in MapTip-Einheiten gezeichnet wird.
Wenn sich das sich bewegende Objekt also auf einer Linie befindet, die genau einem Kartenchip entspricht, wird es als Treffer mit einem Kartenchip gewertet. Wenn du an der Grenze der Kartenchips kollidierst, werden zwei Kartenchips getroffen und gewertet, so dass die Stärke des Abpralls zunimmt.
Ich denke, der beste Weg, dieses Problem zu lösen, besteht darin, die Treffererkennung mit den angeschlossenen Mapchips zu kombinieren. So geht's:
Wählen Sie im Inspektor "TilemapObject" mit Treffererkennung aus und aktivieren SieTilemap Collider 2D
"In Composite verwenden" unter .
Wie in der Warnung angegeben, hat dies allein keine Auswirkungen, wählen Sie also "Physics 2D -> Composite Collider 2D" unter "Add Component" aus.
Rigidbody 2D wird zusammen mit Composite Collider 2D hinzugefügt.
Es ist ein wenig verwirrend, aber ich denke, Sie können bestätigen, dass die grüne Linie an der Grenze zwischen Kartenchips mit Treffererkennung verschwunden ist.
Ich möchte nicht, dass sich die Tilemap bewegt, daher belasse ich Rigidbody 2D
den Komponentenkörpertyp als "statisch".
Führen Sie nun das Spiel aus und versuchen Sie, es in Bewegung zu bringen. Ich denke, selbst wenn Sie sich diagonal an der Wand entlang bewegen, wird sie sich nicht verfangen und Sie können sich reibungslos und ohne holprige Bewegungen bewegen.
Eliminiere das Zurückdrängen von Charakteren von Wänden
Sie können sehen, dass, wenn Sie die Figur bewegen, um die Wand zu drücken, und dann aufhören, sich zu bewegen, sie sich ein wenig so verhält, als würde sie von der Wand zurückgeprallt.
Um dieses Problem zu lösen,Rigidbody 2D
wählen Sie das Zeichenobjekt aus und ändern Sie "Kollisionserkennung" in "Kontinuierlich" aus der Komponente.
Der Unterschied zwischen "diskontinuierlich" und "kontinuierlich" ist wie folgt.
Diskontinuierlich
Die Kollisionserkennung ist ein Mechanismus, der nach der Bewegung nachdenkt. Es handelt sich um eine Form, die eine Kollisionserkennung aus dem Zustand heraus durchführt, in dem sie bewegt und in die Wand eingebettet ist. Es ist leicht zu verstehen, wenn Sie es mit Trampolinen und Gummi in Verbindung bringen, aber je mehr es eingebettet ist, desto abstoßender wird die Kraft und die Sprungkraft wird stärker. Stattdessen wird die Berechnung nach dem Umzug durchgeführt, sodass die Bearbeitungskosten gering sind.
Stetig
Es wird verarbeitet, während festgestellt wird, was auf dem Weg ist. Bestimmen Sie, ob sich zwischen der Position vor und nach dem Umzug eine Wand befindet. Wenn es eine Wand gibt, beurteilt sie die Kollision dort und stoppt, so dass es praktisch keine Abstoßung gibt. Stattdessen erhöhen sich die Bearbeitungskosten ein wenig, da die Kalkulation in der Mitte des Uhrwerks enthalten ist.
Gefangen in der Ecke eines Kartenobjekts
Je nach Programm und Ort werden einige gefangen und andere nicht, und die Ursache hat sich nicht viel geändert. Das passiert übrigens mit eckigen Ecken wie Box Collider 2D und nicht mit abgerundeten Kreisen.
Selbst wenn ein so mysteriöses Phänomen auftritt, ist es gut, abgerundete Ecken des Beschleunigers zu haben, um Haken zu vermeiden. Es ist auf Box Collider 2D beschränkt, aber um es rund zu machen, hat die Box Collider 2D-Komponente des Charakterobjekts einen "Kantenradius" und Sie geben dort einen Wert ein. Wenn Sie 1 als numerische Einheit eingeben, wird die Objektgröße gerundet. Es hängt von der Größe ab, aber es ist gut, etwa 0,1 zu setzen.
Das Trefferurteil erhöht sich übrigens nur um die Größe der Rundung, also bitte anpassen, wenn es groß ist. Box Collider 2D verfügt über eine Collider-Schaltfläche zum Bearbeiten, mit der Sie die Größe direkt in der Ansicht ändern können, indem Sie auf die Schaltfläche klicken. Da die äußere grüne Linie die eigentliche Treffererkennung ist, stellen Sie die Größe so ein, dass sie nicht unnatürlich ist.
Führen Sie danach das Spiel aus, um sicherzustellen, dass es nicht zerkratzt wird, und nehmen Sie Anpassungen vor.