Implementar la detecció de peticions de fitxer amb tilemaps

Pàgina actualitzada :
Data de creació de la pàgina :

Entorn de verificació

Windows
  • Finestres 11
Editor d'unitat
  • 2021.3.3f1
Paquet del sistema d'entrada
  • 1.3.0

Requisits previs per a aquest consell

La configuració següent s'ha fet amb antelació com a premissa per a la descripció d'aquest consell.

Quins són els requisits previs per a aquest consell?

Sobre el préstec de materials cartogràfics

Tramitem prestats en els següents llocs.

Implementació de personatges caminants

En primer lloc, implementeu un mapa i un personatge que realitzi la detecció de peticions de fitxer. Aquest caràcter es pot moure amb les tecles del cursor del teclat. No obstant això, si s'implementa un passeig adequat, serà llarg i lluny de l'essència dels consells del llibre, així que aquesta vegada només mouré una simple imatge.

Si voleu implementar animacions a peu, consulteu els consells següents:

Després de crear el projecte, afegeix una imatge sprite de l'objecte que vols traslladar al projecte.

Seleccioneu la imatge i configureu els píxels per unitat a 32 des de l'inspector. Això es deu al fet que la mida d'un quadrat del mapchip és de 32 píxels, de manera que s'adapta a això. Un cop configurat, feu clic al botó "Aplica" a continuació.

Col·loqueu el personatge a la vista.

Creeu un script per moure l'sprite. Això és similar als següents consells:

Deixeu el nom Player de l'script com a .

Codi de la següent manera:

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

Connecteu-lo al personatge que vulgueu moure.

Executeu el joc i comproveu si voleu moure'l amb el teclat.

Preparació de MapTips

En primer lloc, prepararem un mapchip i crearem un mapa. Aquest procediment és similar als següents consells: MapTips amb 2D Tilemap Extras també són capaços de detectar col·lisions, però no s'utilitzaran en aquest article perquè el procediment serà llarg.

Prepareu la imatge original del MapTip i afegiu-la al vostre projecte. Per facilitar la comprensió de l'operació, prepareu un "lloc transitable" i un "lloc no transitable" per al material del xip del mapa.

Configureu-lo per a MapChips a l'inspector i feu clic al botó Aplica. Un cop configurat, obriu l'editor de personatges.

És un maptip de 32 píxels, així que el dividiré en 32.

Seleccioneu la pestanya Paleta de mosaics. Si no, mostreu-lo amb "Window > 2D -> Tile Palette" al menú. Crea una paleta nova. El nom és arbitrari, però de moment l'anomenarem "MapChipPalette".

Creeu una carpeta MapChipPalette a Escenes i especifiqueu-la.

Afegiu un punta de mapa arrossegant-lo a la paleta. Deseu-lo a la carpeta MapChipPalette que heu creat anteriorment.

Crear un mapa

En aquesta ocasió, el judici d'encert del mapa es realitzarà en unitats de "Tilemap". Per això, crearem dos Tilemaps, "Tilemap sense detecció d'encerts" i "Tilemap amb detecció de cops".

En primer lloc, creeu dos Tilemaps en la jerarquia. Podeu crear-ne dos a la quadrícula. Els noms són "TilemapObeject" i "TilemapGround" per a més claredat.

Primer, creeu un "TilemapGround". Com que és un rang mòbil, simplement podeu posar el terra. Si és a terra, podeu canviar el patró.

Per cert, si el personatge està ocult, seleccioneu l'objecte de caràcter i configureu l'ordre de capes de l'inspector Sprite Renderer a 2. L'ordre de les capes és 0 per defecte i el Tilemap és 0, de manera que si l'augmenteu per sobre d'aquest valor, es mostrarà en primer pla.

A continuació, seleccioneu TilemapObject i col·loqueu el maptip que voleu fer immòbil. Establiu primer l'ordre de la capa a 1. Això és per fer-lo aparèixer davant del terra.

Això és el que sembla si amagues el terra.

Per descomptat, en aquest punt, no hi ha configuracions relacionades amb la detecció de col·lisions, de manera que podeu circular per terra alta amb normalitat. Després d'això, establirem la detecció de col·lisions.

Configuració de detecció de col·lisions

En primer lloc, configurem el personatge. Aquesta configuració és gairebé la mateixa que els consells següents, de manera que ometaré els detalls i explicaré breument el procediment.

Seleccioneu un objecte caràcter de la jerarquia i seleccioneu Physics 2D -> Circle Collider 2D a Add Component. Si la forma de l'objecte és rectangular, "Box Collider 2D" està bé.

De la mateixa manera, afegiu "Física 2D -> Rigidbody 2D".

Establiu l'escala de gravetat a 0 per evitar Rigidbody 2D la caiguda automàtica.

Marqueu Z a Restriccions per evitar que l'sprite giri quan xoqui.

A continuació, seleccioneu "TilemapObject" que voleu prémer i seleccioneu "Tilemap -> Tilemap Collider 2D" des de "Afegeix component".

Això és tot el que hi ha. Ni tan sols necessites programació. Executeu el joc i intenteu colpejar l'objecte que es converteix en la paret. Crec que es pot assegurar que s'atura correctament.

No obstant això, quan realment l'encertes, crec que hi haurà punts de preocupació en el comportament. Aquí hi ha algunes solucions:

Comportament inconvenient de detecció de cops amb el mapa i solucions

Quan xoques contra una paret, és possible que trobis algunes coses que et molesten.

Si et mous contra la paret, quedaràs atrapat al mig

Box Collider 2D Crec que passarà si estàs utilitzant un objecte.

Per exemple, des de l'escena següent, quan premeu la tecla de la part inferior esquerra, voleu que es mogui cap a l'esquerra al llarg de la paret. No obstant això, després d'alguns avenços, crec que s'encallarà en alguna cosa i s'aturarà.

Reconèixer les dents a les parets per posició

Circle Collider 2D Crec que és fàcil d'entendre si adjuntes . La paret ha de ser plana, però si la moveu contra la paret, veureu que la paret es mou com si fos desigual.

Causes i solucions a pegats i cops

La raó per la qual es produeixen sembla ser que "la determinació de cops es realitza sobre una base de mapchip". De fet, quan seleccioneu TilemapObject, apareix una línia verda al lloc on es troba la detecció de peticions de fitxer i podeu veure que es tracta d'una línia dibuixada a les unitats MapTip.

Per tant, si l'objecte en moviment es troba en una línia equivalent exactament a un xip de mapa, es jutjarà com un cop amb un xip de mapa. Si xoqueu al límit dels xips del mapa, es colpejaran dos xips de mapa, de manera que la força del rebot augmentarà.

Crec que la millor manera de resoldre aquest problema és combinar la detecció de peticions de fitxer amb els mapchips adjunts. A continuació s'explica com fer-ho:

SeleccioneuTilemap Collider 2D "TilemapObject" amb detecció de peticions de fitxer de l'inspector i marqueu "Utilitzar en composite" de .

Com s'indica a l'advertència, això per si sol no té cap efecte, així que seleccioneu "Physics 2D -> Composite Collider 2D" de "Afegeix component".

Rigidbody 2D s'afegeix juntament amb Composite Collider 2D.

És una mica confús, però crec que es pot confirmar que la línia verda al límit entre mapchips amb detecció de cops ha desaparegut.

No vull que el mosaic es mogui, així que deixaré Rigidbody 2D el tipus de cos component com a "estàtic".

Ara executeu el joc i intenteu que es mogui. Crec que encara que et moguis en diagonal per la paret, no s'enxamparà i podràs moure't sense problemes sense moviments accidentats.

Eliminar els caràcters que retrocedeixen de les parets

Podeu veure que si moveu el personatge per empènyer la paret i després deixeu de moure's, es comportarà una mica com rebotat de la paret.

Per solucionar-ho,Rigidbody 2D seleccioneu l'objecte de caràcter i canvieu "Detecció de col·lisions" per "Continu" del component.

La diferència entre "discontinu" i "continu" és la següent.

Discontínua

La detecció de col·lisions és un mecanisme que pensa després de moure's. És una forma que realitza la detecció de col·lisions des de l'estat on es mou i s'incrusta a la paret. És fàcil d'entendre si l'associeu amb llits elàstics i goma, però com més estigui incrustat, més repulsiva augmentarà la força i el rebot serà més fort. En canvi, el càlcul es realitza després de mudar-se, de manera que el cost de processament és baix.

Continu

Es processa mentre es determina el que està en camí. Determineu si hi ha una paret entre la posició abans i després del moviment, Si hi ha un mur, jutjarà la col·lisió allà i s'aturarà, de manera que pràcticament no hi ha repulsió. En canvi, el cost de processament augmenta una mica perquè el càlcul s'inclou a la meitat del moviment.

Atrapat a la cantonada d'un objecte de mapa

Segons el programa i la ubicació, alguns són enxampats i altres no, i la causa no ha canviat gaire. Per cert, passa amb cantonades angulars com Box Collider 2D, i no amb cercles arrodonits.

Fins i tot si es produeix un fenomen tan misteriós, és bo tenir cantonades arrodonides del col·lisionador per evitar enganxades. Està limitat a Box Collider 2D, però per fer-lo rodó, el component 2D Box Collider de l'objecte personatge té un "radi de vora" i hi poseu un valor. Si introduïu 1 com a unitat numèrica, es produirà un arrodoniment per a la mida de l'objecte. Depèn de la mida, però és bo posar aproximadament 0,1.

Per cert, el judici de cop només augmenta per la mida de la rodonesa, així que ajusteu-lo si és gran. Box Collider 2D té un botó Collider Edit que us permet canviar la mida directament a la vista fent clic al botó. Com que la línia verda exterior és la detecció real de cops, configureu la mida de manera que no sigui antinatural.

Després d'això, executeu el joc per assegurar-vos que no es ratlla i feu ajustos.