Implementa il rilevamento dei colpi con tilemap
Ambiente di verifica
- Finestre
-
- Windows 11
- Unity Editor
-
- 2021.3.3f1
- Pacchetto del sistema di input
-
- 1.3.0
Prerequisiti per questo suggerimento
Le seguenti impostazioni sono state effettuate in anticipo come premessa per la descrizione di questo suggerimento.
Quali sono i prerequisiti per questo suggerimento?
- Creare una mappa 2D dall'alto verso il basso utilizzando le tilemap standard di Unity
- Gestione delle collisioni con fisica standard (2D)
Informazioni sul prestito di materiali cartografici
Elaboriamo preso in prestito dai seguenti siti.
Implementazione di caratteri ambulanti
Innanzitutto, implementare una mappa e un carattere che esegua il rilevamento dei colpi. Questo carattere può essere spostato con i tasti cursore sulla tastiera. Tuttavia, se implementi una camminata adeguata, sarà lunga e lontana dall'essenza dei suggerimenti del libro, quindi questa volta sposterò solo una semplice singola immagine.
Se si desidera implementare animazioni di camminata, vedere i seguenti suggerimenti:
Dopo aver creato il progetto, aggiungete un'immagine sprite dell'oggetto che desiderate spostare nel progetto.
Selezionare l'immagine e impostare i pixel per unità su 32 da Inspector. Questo perché la dimensione di un quadrato del mapchip è di 32 pixel, quindi si adatta a quello. Una volta configurato, fai clic sul pulsante "Applica" qui sotto.
Posizionate lo sprite nella vista.
Creare uno script per spostare lo sprite. Questo è simile ai seguenti suggerimenti:
Lasciare il nome Player
dello script come .
Codice come segue:
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);
}
}
}
Attaccati allo sprite che vuoi spostare.
Esegui il gioco e controlla se vuoi spostarlo con la tastiera.
Preparazione dei suggerimenti mappa
Prima di tutto, prepareremo un mapchip e creeremo una mappa. Questa procedura è simile ai seguenti suggerimenti: I MapTip con 2D Tilemap Extras sono anche in grado di rilevare collisioni, ma non verranno utilizzati in questo articolo perché la procedura sarà lunga.
Preparare l'immagine originale del mapTip e aggiungerla al progetto. Per rendere l'operazione più facile da capire, si prega di preparare un "luogo percorribile" e un "luogo non percorribile" per il materiale del chip della mappa.
Configurarlo per MapChips nell'Inspector e fare clic sul pulsante Applica. Una volta configurato, apri l'editor Sprite.
È un maptip di 32 pixel, quindi lo dividerò a 32.
Selezionare la scheda Tavolozza Affianca. In caso contrario, visualizzalo con "Window > 2D -> Tile Palette" dal menu. Creare una nuova tavolozza. Il nome è arbitrario, ma per ora lo chiameremo "MapChipPalette".
Creare una cartella MapChipPalette in Scene e specificarla.
Aggiungi una descrizione mappa trascinandola nella tavolozza. Salvarlo nella cartella MapChipPalette creata in precedenza.
Creare una mappa
Questa volta, il giudizio del colpo di mappa verrà eseguito in unità di "Tilemap". Pertanto, creeremo due Tilemap, "Tilemap senza rilevamento hit" e "Tilemap con rilevamento hit".
Innanzitutto, crea due Tilemap nella gerarchia. È possibile crearne due nella griglia. I nomi sono "TilemapObeject" e "TilemapGround" per chiarezza.
Innanzitutto, crea un "TilemapGround". Poiché si tratta di una gamma mobile, puoi semplicemente posare il terreno. Se è a terra, puoi cambiare il modello.
A proposito, se il carattere è nascosto, selezionare l'oggetto carattere e impostare l'ordine dei livelli dell'ispettore Sprite Renderer
su 2.
L'ordine dei layer è 0 per impostazione predefinita e Tilemap è 0, quindi se lo aumenti al di sopra di questo valore, verrà visualizzato in primo piano.
Quindi selezionare TilemapObject e posizionare la descrizione mappa che si desidera rendere immobile. Impostate prima l'ordine dei livelli su 1. Questo per farlo apparire davanti al terreno.
Questo è ciò che sembra se nascondi il terreno.
Naturalmente, a questo punto, non ci sono impostazioni relative al rilevamento delle collisioni, quindi puoi guidare normalmente su un'altura. Successivamente, imposteremo il rilevamento delle collisioni.
Impostazioni di rilevamento delle collisioni
Per prima cosa, impostiamo il personaggio. Questa impostazione è quasi la stessa dei suggerimenti di seguito, quindi salterò i dettagli e spiegherò brevemente la procedura.
Selezionare un oggetto carattere dalla gerarchia e selezionare Physics 2D -> Circle Collider 2D da Aggiungi componente. Se la forma dell'oggetto è rettangolare, "Box Collider 2D" va bene.
Allo stesso modo, aggiungi "Fisica 2D -> Rigidbody 2D".
Impostare la scala di gravità su 0 per evitare Rigidbody 2D
cadute automatiche.
Selezionate Z in Vincoli (Constraints) per impedire la rotazione dello sprite durante la collisione.
Quindi, seleziona "TilemapObject" che desideri colpire e seleziona "Tilemap -> Tilemap Collider 2D" da "Aggiungi componente".
Questo è tutto quello che c'è da fare. Non hai nemmeno bisogno di alcuna programmazione. Esegui il gioco e prova a colpire l'oggetto che diventa il muro. Penso che tu possa assicurarti che si fermi correttamente.
Tuttavia, quando lo colpisci effettivamente, penso che ci saranno punti di preoccupazione nel comportamento. Ecco alcune soluzioni:
Comportamento scomodo del rilevamento dei colpi con la mappa e le soluzioni
Quando colpisci un muro, potresti trovare alcune cose che ti infastidiscono.
Se ti muovi contro il muro, rimarrai intrappolato nel mezzo
Box Collider 2D
Penso che accadrà se stai usando un oggetto.
Ad esempio, dalla scena sottostante, quando si preme il tasto in basso a sinistra, si desidera che si sposti a sinistra lungo il muro. Tuttavia, dopo alcuni progressi, penso che si bloccherà in qualcosa e si fermerà.
Riconosci le ammaccature nelle pareti in base alla posizione
Circle Collider 2D
Penso che sia facile da capire se si allega .
Il muro dovrebbe essere piatto, ma se lo sposti contro il muro, vedrai che il muro si muove come se fosse irregolare.
Cause e soluzioni a ostacoli e urti
Il motivo per cui questi si verificano sembra essere che "la determinazione del colpo viene eseguita su base mapchip". Infatti, quando si seleziona TilemapObject, viene visualizzata una linea verde nel punto in cui si trova il rilevamento dei riscontri ed è possibile vedere che si tratta di una linea tracciata nelle unità MapTip.
Quindi, se l'oggetto in movimento si trova su una linea equivalente esattamente a un chip di mappa, sarà giudicato come un colpo con un chip di mappa. Se ti scontri al confine dei chip della mappa, due chip della mappa verranno colpiti e giudicati, quindi la forza del rimbalzo aumenterà.
Penso che il modo migliore per risolvere questo problema sia combinare il rilevamento dei colpi con i mapchip allegati. Ecco come fare:
SelezionaTilemap Collider 2D
"TilemapObject" con rilevamento dei colpi dall'ispettore e seleziona "Usa in composito" da .
Come indicato nell'avviso, questo da solo non ha alcun effetto, quindi seleziona "Physics 2D -> Composite Collider 2D" da "Add Component".
Rigidbody 2D viene aggiunto insieme a Composite Collider 2D.
È un po 'confuso, ma penso che tu possa confermare che la linea verde al confine tra i mapchip con rilevamento dei colpi è scomparsa.
Non voglio che la tilemap si muova, quindi lascerò Rigidbody 2D
il tipo di corpo del componente come "statico".
Ora esegui il gioco e prova a farlo muovere. Penso che anche se ti muovi in diagonale lungo il muro, non si impiglierà e potrai muoverti senza movimenti accidentati.
Elimina i respingimenti dei personaggi dai muri
Puoi vedere che se muovi il personaggio per spingere il muro e poi smetti di muoverti, si comporterà un po 'come rimbalzato indietro dal muro.
Per risolvere questo problema,Rigidbody 2D
selezionare l'oggetto carattere e modificare "Rilevamento collisioni" in "Continuo" dal componente.
La differenza tra "discontinuo" e "continuo" è la seguente.
Discontinuo
Il rilevamento delle collisioni è un meccanismo che pensa dopo essersi spostato. È una forma che esegue il rilevamento delle collisioni dallo stato in cui viene spostata e incorporata nel muro. È facile da capire se lo associ a trampolini e gomma, ma più è incorporato, più la forza repulsiva aumenterà e il rimbalzo sarà più forte. Invece, il calcolo viene eseguito dopo lo spostamento, quindi il costo di elaborazione è basso.
Continuo
Viene elaborato mentre determina ciò che è in arrivo. Determinare se c'è un muro tra la posizione prima e dopo lo spostamento, Se c'è un muro, giudicherà la collisione lì e si fermerà, quindi non c'è praticamente repulsione. Invece, il costo di elaborazione aumenta leggermente perché il calcolo è incluso nel mezzo del movimento.
Catturato nell'angolo di un oggetto mappa
A seconda del programma e della posizione, alcuni vengono catturati e altri no, e la causa non è cambiata molto. A proposito, succede con angoli angolari come Box Collider 2D e non con cerchi arrotondati.
Anche se si verifica un fenomeno così misterioso, è bene avere angoli arrotondati del collisore per evitare ostacoli. È limitato a Box Collider 2D, ma per renderlo rotondo, il componente Box Collider 2D dell'oggetto personaggio ha un "raggio di bordo" e si inserisce un valore lì. Se immettete 1 come unità numerica, verrà eseguito l'arrotondamento per le dimensioni dell'oggetto. Dipende dalle dimensioni, ma è bene mettere circa 0,1.
A proposito, il giudizio del colpo aumenta solo della dimensione della rotondità, quindi per favore regolalo se è grande. Box Collider 2D ha un pulsante Collider Edit che consente di ridimensionarlo direttamente nella vista facendo clic sul pulsante. Poiché la linea verde esterna è il rilevamento effettivo del colpo, impostare la dimensione in modo che non sia innaturale.
Successivamente, esegui il gioco per assicurarti che non si graffi e apporta modifiche.